use of com.vaticle.typedb.core.pattern.Conjunction in project grakn by graknlabs.
the class RuleTest method rule_contains_indexes_prevent_undefining_contained_types.
@Test
public void rule_contains_indexes_prevent_undefining_contained_types() throws IOException {
Util.resetDirectory(dataDir);
try (CoreDatabaseManager databaseMgr = CoreDatabaseManager.open(options)) {
databaseMgr.create(database);
try (CoreSession session = databaseMgr.session(database, Arguments.Session.Type.SCHEMA)) {
try (CoreTransaction txn = session.transaction(Arguments.Transaction.Type.WRITE)) {
ConceptManager conceptMgr = txn.concepts();
LogicManager logicMgr = txn.logic();
EntityType person = conceptMgr.putEntityType("person");
RelationType friendship = conceptMgr.putRelationType("friendship");
friendship.setRelates("friend");
RelationType marriage = conceptMgr.putRelationType("marriage");
AttributeType name = conceptMgr.putAttributeType("name", AttributeType.ValueType.STRING);
marriage.setRelates("spouse");
person.setPlays(friendship.getRelates("friend"));
person.setPlays(marriage.getRelates("spouse"));
person.setOwns(name);
Rule marriageFriendsRule = logicMgr.putRule("marriage-is-friendship", TypeQL.parsePattern("{ $x isa person; $y isa person; (spouse: $x, spouse: $y) isa marriage; }").asConjunction(), TypeQL.parseVariable("(friend: $x, friend: $y) isa friendship").asThing());
Conjunction marriageFriendsThen = marriageFriendsRule.then();
Variable marriageFriendsRelation = getVariable(marriageFriendsThen.variables(), Identifier.Variable.anon(0));
assertEquals(set(Label.of("friendship")), marriageFriendsRelation.inferredTypes());
Rule marriageSameName = logicMgr.putRule("marriage-same-name", TypeQL.parsePattern("{ $x isa person, has name $a; $y isa person; (spouse:$x, spouse: $y) isa marriage; }").asConjunction(), TypeQL.parseVariable("$y has $a").asThing());
Conjunction sameName = marriageSameName.then();
Variable nameAttr = getVariable(sameName.variables(), Identifier.Variable.name("a"));
assertEquals(set(Label.of("name")), nameAttr.inferredTypes());
txn.commit();
}
try (CoreTransaction txn = session.transaction(Arguments.Transaction.Type.WRITE)) {
ConceptManager conceptMgr = txn.concepts();
EntityType person = conceptMgr.getEntityType("person");
assertThrowsTypeDBException(person::delete, ErrorMessage.TypeWrite.TYPE_REFERENCED_IN_RULES.code());
}
}
}
}
use of com.vaticle.typedb.core.pattern.Conjunction in project grakn by graknlabs.
the class ResolutionTest method test_recursive_termination_and_deduplication_in_transitivity.
@Test
public void test_recursive_termination_and_deduplication_in_transitivity() throws InterruptedException {
try (CoreSession session = schemaSession()) {
try (CoreTransaction transaction = singleThreadElgTransaction(session)) {
transaction.query().define(TypeQL.parseQuery("define location sub entity, plays containment:container, plays containment:contained;" + "containment sub relation, relates contained, relates container;" + "rule transitive-containment: when {" + "(container:$x, contained:$y) isa containment;" + "(container:$y, contained:$z) isa containment;" + "} then {" + "(container:$x, contained:$z) isa containment;" + "};"));
transaction.commit();
}
}
try (CoreSession session = dataSession()) {
try (CoreTransaction transaction = singleThreadElgTransaction(session)) {
transaction.query().insert(TypeQL.parseQuery("insert " + "$l1 isa location; $l2 isa location; $l3 isa location; $l4 isa location; " + "(container:$l1, contained:$l2) isa containment;" + "(container:$l2, contained:$l3) isa containment;" + "(container:$l3, contained:$l4) isa containment;"));
transaction.commit();
}
}
try (CoreSession session = dataSession()) {
try (CoreTransaction transaction = singleThreadElgTransaction(session)) {
Conjunction conjunctionPattern = resolvedConjunction("{ (container:$l3, contained:$l4) isa containment; }", transaction.logic());
createRootAndAssertResponses(transaction, conjunctionPattern, 6L, 3L);
}
}
}
use of com.vaticle.typedb.core.pattern.Conjunction in project grakn by graknlabs.
the class ResolutionTest method test_shallow_rerequest_chain.
@Test
public void test_shallow_rerequest_chain() throws InterruptedException {
try (CoreSession session = schemaSession()) {
try (CoreTransaction transaction = singleThreadElgTransaction(session)) {
transaction.query().define(TypeQL.parseQuery("define woman sub entity, plays marriage:wife, plays friendship:friend;" + "man sub entity, plays marriage:husband, plays friendship:friend;" + "friendship sub relation, relates friend;" + "marriage sub relation, relates husband, relates wife;" + "rule marriage-is-friendship: when {$x isa man; $y isa woman; " + "(husband: $x, wife: $y) isa marriage; } then { (friend: $x, friend: $y) isa friendship; }; "));
transaction.commit();
}
}
try (CoreSession session = dataSession()) {
try (CoreTransaction transaction = singleThreadElgTransaction(session)) {
String insert = "insert $y isa woman; $x isa man; (husband: $x, wife: $y) isa marriage;";
transaction.query().insert(TypeQL.parseQuery(insert));
transaction.query().insert(TypeQL.parseQuery(insert));
String insert2 = "insert $y isa woman; $x isa woman; (wife: $x, wife: $y) isa marriage;";
transaction.query().insert(TypeQL.parseQuery(insert2));
transaction.query().insert(TypeQL.parseQuery(insert2));
String insert3 = "insert $y isa man;";
transaction.query().insert(TypeQL.parseQuery(insert3));
transaction.query().insert(TypeQL.parseQuery(insert3));
transaction.commit();
}
}
try (CoreSession session = dataSession()) {
try (CoreTransaction transaction = singleThreadElgTransaction(session)) {
String rootConjunction = "{ $a isa woman; $b isa man; $f(friend: $a, friend: $b) isa friendship; }";
Conjunction conjunctionPattern = resolvedConjunction(rootConjunction, transaction.logic());
createRootAndAssertResponses(transaction, conjunctionPattern, 2L, 2L);
}
}
}
use of com.vaticle.typedb.core.pattern.Conjunction in project grakn by graknlabs.
the class ResolutionTest method test_simple_rule.
@Test
public void test_simple_rule() throws InterruptedException {
try (CoreSession session = schemaSession()) {
try (CoreTransaction transaction = singleThreadElgTransaction(session)) {
transaction.query().define(TypeQL.parseQuery("define person sub entity, owns name, owns age, plays twins:twin1, plays twins:twin2;" + "age sub attribute, value long;" + "name sub attribute, value string;" + "twins sub relation, relates twin1, relates twin2;" + "rule bobs-are-42: when { $p1 isa person, has name \"Bob\"; } then { $p1 has age 42; };"));
transaction.commit();
}
}
try (CoreSession session = dataSession()) {
try (CoreTransaction transaction = singleThreadElgTransaction(session)) {
transaction.query().insert(TypeQL.parseQuery("insert $p1 isa person, has name \"Bob\";"));
transaction.query().insert(TypeQL.parseQuery("insert $p1 isa person, has name \"Bob\";"));
transaction.query().insert(TypeQL.parseQuery("insert $p1 isa person, has name \"Bob\";"));
transaction.query().insert(TypeQL.parseQuery("insert $p1 isa person, has age 42;"));
transaction.query().insert(TypeQL.parseQuery("insert $p1 isa person, has age 42;"));
transaction.query().insert(TypeQL.parseQuery("insert $p1 isa person, has age 42;"));
transaction.commit();
}
}
try (CoreSession session = dataSession()) {
try (CoreTransaction transaction = singleThreadElgTransaction(session)) {
Conjunction conjunctionPattern = resolvedConjunction("{ $p1 isa person, has age 42; }", transaction.logic());
createRootAndAssertResponses(transaction, conjunctionPattern, 6L, 3L);
}
}
}
use of com.vaticle.typedb.core.pattern.Conjunction in project grakn by graknlabs.
the class ResolutionTest method test_exceptions_are_propagated.
@Test
public void test_exceptions_are_propagated() throws InterruptedException {
try (CoreSession session = schemaSession()) {
try (CoreTransaction transaction = singleThreadElgTransaction(session)) {
transaction.query().define(TypeQL.parseQuery("define person sub entity, owns age, plays twins:twin1, plays twins:twin2;" + "age sub attribute, value long;" + "twins sub relation, relates twin1, relates twin2;"));
transaction.commit();
}
}
try (CoreSession session = dataSession()) {
try (CoreTransaction transaction = singleThreadElgTransaction(session)) {
transaction.query().insert(TypeQL.parseQuery("insert $p1 isa person, has age 24; $t(twin1: $p1, twin2: $p2) isa twins; $p2 isa person;"));
transaction.query().insert(TypeQL.parseQuery("insert $p1 isa person, has age 24; $t(twin1: $p1, twin2: $p2) isa twins; $p2 isa person;"));
transaction.query().insert(TypeQL.parseQuery("insert $p1 isa person, has age 24; $t(twin1: $p1, twin2: $p2) isa twins; $p2 isa person;"));
transaction.commit();
}
}
try (CoreSession session = dataSession()) {
try (CoreTransaction transaction = singleThreadElgTransaction(session)) {
Conjunction conjunctionPattern = resolvedConjunction("{ $t(twin1: $p1, twin2: $p2) isa twins; $p1 has age $a; }", transaction.logic());
ResolverRegistry registry = transaction.reasoner().resolverRegistry();
LinkedBlockingQueue<Match.Finished> responses = new LinkedBlockingQueue<>();
AtomicLong doneReceived = new AtomicLong(0L);
LinkedBlockingQueue<Throwable> exceptions = new LinkedBlockingQueue<>();
Actor.Driver<RootResolver.Conjunction> root;
try {
root = registry.root(conjunctionPattern, responses::add, iterDone -> doneReceived.incrementAndGet(), exceptions::add);
} catch (TypeDBException e) {
fail();
}
Exception e = new RuntimeException();
registry.terminateResolvers(e);
Throwable receivedException = exceptions.poll(100, TimeUnit.MILLISECONDS);
assertEquals(e, receivedException);
}
}
}
Aggregations