use of com.vaticle.typedb.core.pattern.Conjunction in project grakn by graknlabs.
the class ResolutionTest method createRootAndAssertResponses.
private void createRootAndAssertResponses(CoreTransaction transaction, Conjunction conjunction, long answerCount, long explainableAnswers) throws InterruptedException {
ResolverRegistry registry = transaction.reasoner().resolverRegistry();
LinkedBlockingQueue<Match.Finished> responses = new LinkedBlockingQueue<>();
AtomicLong doneReceived = new AtomicLong(0L);
Set<Identifier.Variable.Retrievable> filter = new HashSet<>();
iterate(conjunction.variables()).map(Variable::id).filter(Identifier::isName).map(Identifier.Variable::asName).forEachRemaining(filter::add);
Actor.Driver<RootResolver.Conjunction> root;
try {
root = registry.root(conjunction, responses::add, iterDone -> doneReceived.incrementAndGet(), (throwable) -> fail());
} catch (TypeDBException e) {
fail();
return;
}
assertResponses(root, filter, responses, doneReceived, answerCount, explainableAnswers);
}
use of com.vaticle.typedb.core.pattern.Conjunction in project grakn by graknlabs.
the class Materialiser method query.
public Map<Conjunction, FunctionalIterator<ConceptMap>> query(TypeQLMatch inferenceQuery) {
// TODO: How do we handle disjunctions inside negations and negations in general?
Disjunction disjunction = Disjunction.create(inferenceQuery.conjunction().normalise());
tx.logic().typeInference().applyCombination(disjunction);
HashMap<Conjunction, FunctionalIterator<ConceptMap>> conjunctionAnswers = new HashMap<>();
disjunction.conjunctions().forEach(conjunction -> conjunctionAnswers.put(conjunction, traverse(conjunction)));
return conjunctionAnswers;
}
use of com.vaticle.typedb.core.pattern.Conjunction in project grakn by graknlabs.
the class Reasoner method bound.
private Conjunction bound(Conjunction conjunction, ConceptMap bounds) {
Conjunction newClone = conjunction.clone();
newClone.bound(bounds.toMap(Type::getLabel, Thing::getIID));
return newClone;
}
use of com.vaticle.typedb.core.pattern.Conjunction in project grakn by graknlabs.
the class Reasoner method mayReason.
private boolean mayReason(Disjunction disjunction) {
for (Conjunction conj : disjunction.conjunctions()) {
Set<Variable> vars = conj.variables();
List<Negation> negs = conj.negations();
if (iterate(vars).flatMap(v -> iterate(v.inferredTypes())).distinct().anyMatch(this::hasRule))
return true;
if (!negs.isEmpty() && iterate(negs).anyMatch(n -> mayReason(n.disjunction())))
return true;
}
return false;
}
use of com.vaticle.typedb.core.pattern.Conjunction in project grakn by graknlabs.
the class UnifyRelationConcludableTest method relation_variable_role_unifies_many_to_many_rule_relation_roles_2.
// [multiple VARIABLE ROLE, many2many]
@Test
public void relation_variable_role_unifies_many_to_many_rule_relation_roles_2() {
String conjunction = "{ ($role1: $p, $role2: $q, $role1: $p) isa employment; }";
Set<Concludable> concludables = Concludable.create(resolvedConjunction(conjunction, logicMgr));
Concludable.Relation queryConcludable = concludables.iterator().next().asRelation();
Rule rule = createRule("two-people-are-employed-one-is-also-the-employer", "{ $x isa person; $y isa person; }", "(employee: $x, employer: $x, employee: $y) isa employment", logicMgr);
FunctionalIterator<Unifier> unifier = queryConcludable.unify(rule.conclusion(), conceptMgr);
Set<Map<String, Set<String>>> result = unifier.map(u -> getStringMapping(u.mapping())).toSet();
Set<Map<String, Set<String>>> expected = set(new HashMap<String, Set<String>>() {
{
put("$p", set("$x", "$y"));
put("$q", set("$x"));
put("$role1", set("$_employment:employee"));
put("$role2", set("$_employment:employer"));
put("$_0", set("$_0"));
}
}, new HashMap<String, Set<String>>() {
{
put("$p", set("$x", "$y"));
put("$q", set("$x"));
put("$role1", set("$_employment:employee", "$_employment:employer"));
put("$role2", set("$_employment:employee"));
put("$_0", set("$_0"));
}
}, new HashMap<String, Set<String>>() {
{
put("$p", set("$x"));
put("$q", set("$y"));
put("$role1", set("$_employment:employee", "$_employment:employer"));
put("$role2", set("$_employment:employee"));
put("$_0", set("$_0"));
}
});
assertEquals(expected, result);
}
Aggregations