Search in sources :

Example 11 with Rule

use of ai.grakn.concept.Rule in project grakn by graknlabs.

the class RuleTest method whenCreatingDistinctRulesWithSimilarStringHashes_EnsureRulesDoNotClash.

@Test
public void whenCreatingDistinctRulesWithSimilarStringHashes_EnsureRulesDoNotClash() {
    String productRefused = "productRefused";
    Pattern when1 = graknTx.graql().parser().parsePattern("{$step has step-id 9; $e (process-case: $case) isa process-record; $case has consent false;}");
    Pattern then1 = graknTx.graql().parser().parsePattern("{(record: $e, step: $step) isa record-step;}");
    Rule rule1 = graknTx.putRule(productRefused, when1, then1);
    String productAccepted = "productAccepted";
    Pattern when2 = graknTx.graql().parser().parsePattern("{$step has step-id 7; $e (process-case: $case) isa process-record; $case has consent true;}");
    Pattern then2 = graknTx.graql().parser().parsePattern("{(record: $e, step: $step) isa record-step;}");
    Rule rule2 = graknTx.putRule(productAccepted, when2, then2);
    assertEquals(rule1, graknTx.getRule(productRefused));
    assertEquals(rule2, graknTx.getRule(productAccepted));
}
Also used : Pattern(ai.grakn.graql.Pattern) Rule(ai.grakn.concept.Rule) Test(org.junit.Test)

Example 12 with Rule

use of ai.grakn.concept.Rule in project grakn by graknlabs.

the class Atom method validateAsRuleHead.

@Override
public Set<String> validateAsRuleHead(Rule rule) {
    Set<String> errors = new HashSet<>();
    Set<Atomic> parentAtoms = getParentQuery().getAtoms(Atomic.class).filter(at -> !at.equals(this)).collect(Collectors.toSet());
    Set<Var> varNames = Sets.difference(getVarNames(), this.getInnerPredicates().map(Atomic::getVarName).collect(Collectors.toSet()));
    boolean unboundVariables = varNames.stream().anyMatch(var -> parentAtoms.stream().noneMatch(at -> at.getVarNames().contains(var)));
    if (unboundVariables) {
        errors.add(ErrorMessage.VALIDATION_RULE_ILLEGAL_HEAD_ATOM_WITH_UNBOUND_VARIABLE.getMessage(rule.getThen(), rule.getLabel()));
    }
    SchemaConcept schemaConcept = getSchemaConcept();
    if (schemaConcept == null) {
        errors.add(ErrorMessage.VALIDATION_RULE_ILLEGAL_HEAD_ATOM_WITH_AMBIGUOUS_SCHEMA_CONCEPT.getMessage(rule.getThen(), rule.getLabel()));
    } else if (schemaConcept.isImplicit()) {
        errors.add(ErrorMessage.VALIDATION_RULE_ILLEGAL_HEAD_ATOM_WITH_IMPLICIT_SCHEMA_CONCEPT.getMessage(rule.getThen(), rule.getLabel()));
    }
    return errors;
}
Also used : SchemaConcept(ai.grakn.concept.SchemaConcept) Answer(ai.grakn.graql.admin.Answer) Rule(ai.grakn.concept.Rule) ReasonerUtils.typesCompatible(ai.grakn.graql.internal.reasoner.utils.ReasonerUtils.typesCompatible) MultiUnifierImpl(ai.grakn.graql.internal.reasoner.MultiUnifierImpl) HashSet(java.util.HashSet) Lists(com.google.common.collect.Lists) RuleUtils(ai.grakn.graql.internal.reasoner.rule.RuleUtils) Predicate(ai.grakn.graql.internal.reasoner.atom.predicate.Predicate) ConceptId(ai.grakn.concept.ConceptId) QueryAnswer(ai.grakn.graql.internal.query.QueryAnswer) RelationshipAtom(ai.grakn.graql.internal.reasoner.atom.binary.RelationshipAtom) Nullable(javax.annotation.Nullable) ErrorMessage(ai.grakn.util.ErrorMessage) GraqlQueryException(ai.grakn.exception.GraqlQueryException) MultiUnifier(ai.grakn.graql.admin.MultiUnifier) Set(java.util.Set) IdPredicate(ai.grakn.graql.internal.reasoner.atom.predicate.IdPredicate) DirectIsaProperty(ai.grakn.graql.internal.pattern.property.DirectIsaProperty) Collectors(java.util.stream.Collectors) Sets(com.google.common.collect.Sets) VarProperty(ai.grakn.graql.admin.VarProperty) Objects(java.util.Objects) Atomic(ai.grakn.graql.admin.Atomic) TypeAtom(ai.grakn.graql.internal.reasoner.atom.binary.TypeAtom) List(java.util.List) Stream(java.util.stream.Stream) UnifierComparison(ai.grakn.graql.admin.UnifierComparison) InferenceRule(ai.grakn.graql.internal.reasoner.rule.InferenceRule) Var(ai.grakn.graql.Var) Unifier(ai.grakn.graql.admin.Unifier) Var(ai.grakn.graql.Var) Atomic(ai.grakn.graql.admin.Atomic) SchemaConcept(ai.grakn.concept.SchemaConcept) HashSet(java.util.HashSet)

Example 13 with Rule

use of ai.grakn.concept.Rule in project grakn by graknlabs.

the class ConceptBuilder method tryPutConcept.

private Concept tryPutConcept() {
    usedParams.clear();
    Concept concept;
    if (has(IS_ROLE)) {
        use(IS_ROLE);
        Label label = use(LABEL);
        Role role = executor.tx().putRole(label);
        if (has(SUPER_CONCEPT)) {
            setSuper(role, use(SUPER_CONCEPT));
        }
        concept = role;
    } else if (has(IS_RULE)) {
        use(IS_RULE);
        Label label = use(LABEL);
        Pattern when = use(WHEN);
        Pattern then = use(THEN);
        Rule rule = executor.tx().putRule(label, when, then);
        if (has(SUPER_CONCEPT)) {
            setSuper(rule, use(SUPER_CONCEPT));
        }
        concept = rule;
    } else if (has(SUPER_CONCEPT)) {
        concept = putSchemaConcept();
    } else if (has(TYPE)) {
        concept = putInstance();
    } else {
        throw GraqlQueryException.insertUndefinedVariable(executor.printableRepresentation(var));
    }
    // Check for any unexpected parameters
    preProvidedParams.forEach((param, value) -> {
        if (!usedParams.contains(param)) {
            throw GraqlQueryException.insertUnexpectedProperty(param.name(), value, concept);
        }
    });
    return concept;
}
Also used : Concept(ai.grakn.concept.Concept) SchemaConcept(ai.grakn.concept.SchemaConcept) Role(ai.grakn.concept.Role) Pattern(ai.grakn.graql.Pattern) Label(ai.grakn.concept.Label) Rule(ai.grakn.concept.Rule)

Example 14 with Rule

use of ai.grakn.concept.Rule in project grakn by graknlabs.

the class GraknTxPutPropertyTest method whenCallingPutRule_CreateATypeWithSuperTypeRule.

@Property
public void whenCallingPutRule_CreateATypeWithSuperTypeRule(@Open GraknTx tx, @Unused Label label) {
    Rule rule = tx.putRule(label, tx.graql().parser().parsePattern("$x"), tx.graql().parser().parsePattern("$x"));
    assertEquals(tx.admin().getMetaRule(), rule.sup());
}
Also used : Rule(ai.grakn.concept.Rule) Property(com.pholser.junit.quickcheck.Property)

Example 15 with Rule

use of ai.grakn.concept.Rule in project grakn by graknlabs.

the class ValidateGlobalRules method validateRuleHead.

/**
 * @param graph graph used to ensure the rule head is valid
 * @param rule the rule to be validated
 * @return Error messages if the rule head is invalid - is not a single-atom conjunction, doesn't contain illegal atomics and is ontologically valid
 */
private static Set<String> validateRuleHead(GraknTx graph, Rule rule) {
    Set<String> errors = new HashSet<>();
    Set<Conjunction<VarPatternAdmin>> headPatterns = rule.getThen().admin().getDisjunctiveNormalForm().getPatterns();
    if (headPatterns.size() != 1) {
        errors.add(ErrorMessage.VALIDATION_RULE_DISJUNCTION_IN_HEAD.getMessage(rule.getLabel()));
    } else {
        ReasonerQuery bodyQuery = Iterables.getOnlyElement(rule.getWhen().admin().getDisjunctiveNormalForm().getPatterns()).toReasonerQuery(graph);
        ReasonerQuery headQuery = Iterables.getOnlyElement(headPatterns).toReasonerQuery(graph);
        ReasonerQuery combinedQuery = headQuery.conjunction(bodyQuery);
        Set<Atomic> headAtoms = headQuery.getAtoms();
        combinedQuery.getAtoms().stream().filter(headAtoms::contains).map(at -> at.validateAsRuleHead(rule)).forEach(errors::addAll);
        Set<Atomic> selectableHeadAtoms = headAtoms.stream().filter(Atomic::isAtom).filter(Atomic::isSelectable).collect(Collectors.toSet());
        if (selectableHeadAtoms.size() > 1) {
            errors.add(ErrorMessage.VALIDATION_RULE_HEAD_NON_ATOMIC.getMessage(rule.getLabel()));
        }
    }
    return errors;
}
Also used : RuleImpl(ai.grakn.kb.internal.concept.RuleImpl) Iterables(com.google.common.collect.Iterables) VALIDATION_CASTING(ai.grakn.util.ErrorMessage.VALIDATION_CASTING) VALIDATION_REQUIRED_RELATION(ai.grakn.util.ErrorMessage.VALIDATION_REQUIRED_RELATION) Role(ai.grakn.concept.Role) SchemaConcept(ai.grakn.concept.SchemaConcept) RelationshipTypeImpl(ai.grakn.kb.internal.concept.RelationshipTypeImpl) Type(ai.grakn.concept.Type) Rule(ai.grakn.concept.Rule) Attribute(ai.grakn.concept.Attribute) TypeImpl(ai.grakn.kb.internal.concept.TypeImpl) HashSet(java.util.HashSet) Label(ai.grakn.concept.Label) RelationshipType(ai.grakn.concept.RelationshipType) GraknTx(ai.grakn.GraknTx) CommonUtil(ai.grakn.util.CommonUtil) Map(java.util.Map) Relationship(ai.grakn.concept.Relationship) GraknTxOperationException(ai.grakn.exception.GraknTxOperationException) ErrorMessage(ai.grakn.util.ErrorMessage) VALIDATION_RELATION_TYPES_ROLES_SCHEMA(ai.grakn.util.ErrorMessage.VALIDATION_RELATION_TYPES_ROLES_SCHEMA) SchemaConceptImpl(ai.grakn.kb.internal.concept.SchemaConceptImpl) Conjunction(ai.grakn.graql.admin.Conjunction) VALIDATION_RELATION_TYPE(ai.grakn.util.ErrorMessage.VALIDATION_RELATION_TYPE) Collection(java.util.Collection) Set(java.util.Set) VALIDATION_ROLE_TYPE_MISSING_RELATION_TYPE(ai.grakn.util.ErrorMessage.VALIDATION_ROLE_TYPE_MISSING_RELATION_TYPE) Collectors(java.util.stream.Collectors) Atomic(ai.grakn.graql.admin.Atomic) ReasonerQuery(ai.grakn.graql.admin.ReasonerQuery) Stream(java.util.stream.Stream) Thing(ai.grakn.concept.Thing) VALIDATION_RELATION_CASTING_LOOP_FAIL(ai.grakn.util.ErrorMessage.VALIDATION_RELATION_CASTING_LOOP_FAIL) Casting(ai.grakn.kb.internal.structure.Casting) VarPatternAdmin(ai.grakn.graql.admin.VarPatternAdmin) Optional(java.util.Optional) Schema(ai.grakn.util.Schema) Pattern(ai.grakn.graql.Pattern) Collections(java.util.Collections) VALIDATION_NOT_EXACTLY_ONE_KEY(ai.grakn.util.ErrorMessage.VALIDATION_NOT_EXACTLY_ONE_KEY) Conjunction(ai.grakn.graql.admin.Conjunction) Atomic(ai.grakn.graql.admin.Atomic) ReasonerQuery(ai.grakn.graql.admin.ReasonerQuery) HashSet(java.util.HashSet)

Aggregations

Rule (ai.grakn.concept.Rule)18 SchemaConcept (ai.grakn.concept.SchemaConcept)7 Pattern (ai.grakn.graql.Pattern)6 HashSet (java.util.HashSet)6 Set (java.util.Set)6 Test (org.junit.Test)6 Stream (java.util.stream.Stream)5 GraknTx (ai.grakn.GraknTx)4 Label (ai.grakn.concept.Label)4 Atomic (ai.grakn.graql.admin.Atomic)4 Schema (ai.grakn.util.Schema)4 Role (ai.grakn.concept.Role)3 Conjunction (ai.grakn.graql.admin.Conjunction)3 VarPatternAdmin (ai.grakn.graql.admin.VarPatternAdmin)3 Atom (ai.grakn.graql.internal.reasoner.atom.Atom)3 ReasonerQueryImpl (ai.grakn.graql.internal.reasoner.query.ReasonerQueryImpl)3 ErrorMessage (ai.grakn.util.ErrorMessage)3 Collectors (java.util.stream.Collectors)3 Attribute (ai.grakn.concept.Attribute)2 Relationship (ai.grakn.concept.Relationship)2