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));
}
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;
}
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;
}
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());
}
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;
}
Aggregations