Search in sources :

Example 11 with CoreSession

use of com.vaticle.typedb.core.database.CoreSession 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);
        }
    }
}
Also used : Util.resolvedConjunction(com.vaticle.typedb.core.reasoner.resolution.Util.resolvedConjunction) Conjunction(com.vaticle.typedb.core.pattern.Conjunction) CoreSession(com.vaticle.typedb.core.database.CoreSession) CoreTransaction(com.vaticle.typedb.core.database.CoreTransaction) Test(org.junit.Test)

Example 12 with CoreSession

use of com.vaticle.typedb.core.database.CoreSession 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);
        }
    }
}
Also used : Util.resolvedConjunction(com.vaticle.typedb.core.reasoner.resolution.Util.resolvedConjunction) Collections.set(com.vaticle.typedb.common.collection.Collections.set) Variable(com.vaticle.typedb.core.pattern.variable.Variable) Identifier(com.vaticle.typedb.core.traversal.common.Identifier) MB(com.vaticle.typedb.core.common.collection.Bytes.MB) Arguments(com.vaticle.typedb.core.common.parameters.Arguments) HashSet(java.util.HashSet) Root(com.vaticle.typedb.core.reasoner.resolution.answer.AnswerState.Partial.Compound.Root) Util.resolvedDisjunction(com.vaticle.typedb.core.reasoner.resolution.Util.resolvedDisjunction) After(org.junit.After) InitialImpl(com.vaticle.typedb.core.reasoner.resolution.answer.AnswerStateImpl.TopImpl.MatchImpl.InitialImpl) Assert.fail(org.junit.Assert.fail) Path(java.nio.file.Path) Before(org.junit.Before) Conjunction(com.vaticle.typedb.core.pattern.Conjunction) TypeQL(com.vaticle.typeql.lang.TypeQL) CoreDatabaseManager(com.vaticle.typedb.core.database.CoreDatabaseManager) Set(java.util.Set) ConceptMap(com.vaticle.typedb.core.concept.answer.ConceptMap) Test(org.junit.Test) IOException(java.io.IOException) RootResolver(com.vaticle.typedb.core.reasoner.resolution.resolver.RootResolver) Actor(com.vaticle.typedb.core.concurrent.actor.Actor) LinkedBlockingQueue(java.util.concurrent.LinkedBlockingQueue) Disjunction(com.vaticle.typedb.core.pattern.Disjunction) TimeUnit(java.util.concurrent.TimeUnit) CoreSession(com.vaticle.typedb.core.database.CoreSession) AtomicLong(java.util.concurrent.atomic.AtomicLong) Stream(java.util.stream.Stream) NamedThreadFactory(com.vaticle.typedb.common.concurrent.NamedThreadFactory) Paths(java.nio.file.Paths) TestCase.assertTrue(junit.framework.TestCase.assertTrue) ActorExecutorGroup(com.vaticle.typedb.core.concurrent.actor.ActorExecutorGroup) Database(com.vaticle.typedb.core.common.parameters.Options.Database) Iterators.iterate(com.vaticle.typedb.core.common.iterator.Iterators.iterate) TypeDBException(com.vaticle.typedb.core.common.exception.TypeDBException) Request(com.vaticle.typedb.core.reasoner.resolution.framework.Request) CoreTransaction(com.vaticle.typedb.core.database.CoreTransaction) Match(com.vaticle.typedb.core.reasoner.resolution.answer.AnswerState.Top.Match) Resolver(com.vaticle.typedb.core.reasoner.resolution.framework.Resolver) Util(com.vaticle.typedb.core.test.integration.util.Util) TestCase.assertEquals(junit.framework.TestCase.assertEquals) LinkedBlockingQueue(java.util.concurrent.LinkedBlockingQueue) IOException(java.io.IOException) TypeDBException(com.vaticle.typedb.core.common.exception.TypeDBException) CoreTransaction(com.vaticle.typedb.core.database.CoreTransaction) AtomicLong(java.util.concurrent.atomic.AtomicLong) Actor(com.vaticle.typedb.core.concurrent.actor.Actor) Util.resolvedConjunction(com.vaticle.typedb.core.reasoner.resolution.Util.resolvedConjunction) Conjunction(com.vaticle.typedb.core.pattern.Conjunction) CoreSession(com.vaticle.typedb.core.database.CoreSession) TypeDBException(com.vaticle.typedb.core.common.exception.TypeDBException) Test(org.junit.Test)

Example 13 with CoreSession

use of com.vaticle.typedb.core.database.CoreSession in project grakn by graknlabs.

the class ExplanationTest method test_disjunction_explainable.

@Test
public void test_disjunction_explainable() {
    try (CoreSession session = databaseMgr.session(database, Arguments.Session.Type.SCHEMA)) {
        try (CoreTransaction txn = singleThreadElgTransaction(session, Arguments.Transaction.Type.WRITE)) {
            ConceptManager conceptMgr = txn.concepts();
            LogicManager logicMgr = txn.logic();
            EntityType person = conceptMgr.putEntityType("person");
            AttributeType name = conceptMgr.putAttributeType("name", AttributeType.ValueType.STRING);
            person.setOwns(name);
            RelationType friendship = conceptMgr.putRelationType("friendship");
            friendship.setRelates("friend");
            RelationType marriage = conceptMgr.putRelationType("marriage");
            marriage.setRelates("husband");
            marriage.setRelates("wife");
            person.setPlays(friendship.getRelates("friend"));
            person.setPlays(marriage.getRelates("husband"));
            person.setPlays(marriage.getRelates("wife"));
            logicMgr.putRule("marriage-is-friendship", TypeQL.parsePattern("{ $x isa person; $y isa person; (husband: $x, wife: $y) isa marriage; }").asConjunction(), TypeQL.parseVariable("(friend: $x, friend: $y) isa friendship").asThing());
            txn.commit();
        }
    }
    try (CoreSession session = databaseMgr.session(database, Arguments.Session.Type.DATA)) {
        try (CoreTransaction txn = singleThreadElgTransaction(session, Arguments.Transaction.Type.WRITE)) {
            txn.query().insert(TypeQL.parseQuery("insert $x isa person, has name 'Zack'; $y isa person, has name 'Yasmin'; (husband: $x, wife: $y) isa marriage;").asInsert());
            txn.commit();
        }
        try (CoreTransaction txn = singleThreadElgTransaction(session, Arguments.Transaction.Type.READ, (new Options.Transaction().explain(true)))) {
            List<ConceptMap> ans = txn.query().match(TypeQL.parseQuery("match $p1 isa person; { (friend: $p1, friend: $p2) isa friendship;} or { $p1 has name 'Zack'; }; ").asMatch()).toList();
            assertEquals(3, ans.size());
            ConceptMap withExplainable;
            ConceptMap withoutExplainable;
            if (ans.get(0).contains("p2")) {
                withExplainable = ans.get(0);
                if (!ans.get(1).contains("p2"))
                    withoutExplainable = ans.get(1);
                else
                    withoutExplainable = ans.get(2);
            } else if (ans.get(1).contains("p2")) {
                withExplainable = ans.get(1);
                if (!ans.get(0).contains("p2"))
                    withoutExplainable = ans.get(0);
                else
                    withoutExplainable = ans.get(2);
            } else {
                withExplainable = ans.get(2);
                if (!ans.get(0).contains("p2"))
                    withoutExplainable = ans.get(0);
                else
                    withoutExplainable = ans.get(1);
            }
            assertEquals(3, withExplainable.concepts().size());
            assertEquals(2, withoutExplainable.concepts().size());
            assertFalse(withExplainable.explainables().isEmpty());
            assertTrue(withoutExplainable.explainables().isEmpty());
            assertSingleExplainableExplanations(withExplainable, 1, 1, 1, txn);
        }
    }
}
Also used : ConceptManager(com.vaticle.typedb.core.concept.ConceptManager) EntityType(com.vaticle.typedb.core.concept.type.EntityType) Options(com.vaticle.typedb.core.common.parameters.Options) LogicManager(com.vaticle.typedb.core.logic.LogicManager) AttributeType(com.vaticle.typedb.core.concept.type.AttributeType) RelationType(com.vaticle.typedb.core.concept.type.RelationType) CoreSession(com.vaticle.typedb.core.database.CoreSession) ConceptMap(com.vaticle.typedb.core.concept.answer.ConceptMap) CoreTransaction(com.vaticle.typedb.core.database.CoreTransaction) Test(org.junit.Test)

Example 14 with CoreSession

use of com.vaticle.typedb.core.database.CoreSession in project grakn by graknlabs.

the class ExplanationTest method test_has_variable_explainable_two_ways.

@Test
public void test_has_variable_explainable_two_ways() {
    try (CoreSession session = databaseMgr.session(database, Arguments.Session.Type.SCHEMA)) {
        try (CoreTransaction txn = singleThreadElgTransaction(session, Arguments.Transaction.Type.WRITE)) {
            LogicManager logicMgr = txn.logic();
            txn.query().define(TypeQL.parseQuery("define " + "user sub entity, " + "  plays group-membership:member, " + "  owns permission; " + "user-group sub entity," + "  plays group-membership:user-group," + "  owns permission," + "  owns name; " + "group-membership sub relation," + "  relates member," + "  relates user-group; " + "permission sub attribute, value string;" + "name sub attribute, value string;").asDefine());
            logicMgr.putRule("admin-group-gives-permissions", TypeQL.parsePattern("{ $x isa user; ($x, $g) isa group-membership; $g isa user-group, has name \"admin\", has permission $p; }").asConjunction(), TypeQL.parseVariable("$x has $p").asThing());
            logicMgr.putRule("writer-group-gives-permissions", TypeQL.parsePattern("{ $x isa user; ($x, $g) isa group-membership; $g isa user-group, has name \"write\", has permission $p; }").asConjunction(), TypeQL.parseVariable("$x has $p").asThing());
            txn.commit();
        }
    }
    try (CoreSession session = databaseMgr.session(database, Arguments.Session.Type.DATA)) {
        try (CoreTransaction txn = singleThreadElgTransaction(session, Arguments.Transaction.Type.WRITE)) {
            txn.query().insert(TypeQL.parseQuery("insert " + "$x isa user; " + "$wg isa user-group, has name \"write\", has permission \"write\";" + "(member: $x, user-group: $wg) isa group-membership;" + "$admin isa user-group, has name \"admin\", has permission \"write\", has permission \"delete\";" + "(member: $x, user-group: $admin) isa group-membership;").asInsert());
            txn.commit();
        }
        try (CoreTransaction txn = singleThreadElgTransaction(session, Arguments.Transaction.Type.READ, (new Options.Transaction().explain(true)))) {
            List<ConceptMap> ans = txn.query().match(TypeQL.parseQuery("match $x isa user, has permission \"write\";").asMatch()).toList();
            assertEquals(1, ans.size());
            assertFalse(ans.get(0).explainables().isEmpty());
            assertSingleExplainableExplanations(ans.get(0), 1, 1, 2, txn);
        }
    }
}
Also used : Options(com.vaticle.typedb.core.common.parameters.Options) LogicManager(com.vaticle.typedb.core.logic.LogicManager) CoreSession(com.vaticle.typedb.core.database.CoreSession) ConceptMap(com.vaticle.typedb.core.concept.answer.ConceptMap) CoreTransaction(com.vaticle.typedb.core.database.CoreTransaction) Test(org.junit.Test)

Example 15 with CoreSession

use of com.vaticle.typedb.core.database.CoreSession in project grakn by graknlabs.

the class ExplanationTest method test_relation_explainable.

@Test
public void test_relation_explainable() {
    try (CoreSession session = databaseMgr.session(database, Arguments.Session.Type.SCHEMA)) {
        try (CoreTransaction txn = singleThreadElgTransaction(session, Arguments.Transaction.Type.WRITE)) {
            ConceptManager conceptMgr = txn.concepts();
            LogicManager logicMgr = txn.logic();
            EntityType person = conceptMgr.putEntityType("person");
            AttributeType name = conceptMgr.putAttributeType("name", AttributeType.ValueType.STRING);
            person.setOwns(name);
            RelationType friendship = conceptMgr.putRelationType("friendship");
            friendship.setRelates("friend");
            RelationType marriage = conceptMgr.putRelationType("marriage");
            marriage.setRelates("husband");
            marriage.setRelates("wife");
            person.setPlays(friendship.getRelates("friend"));
            person.setPlays(marriage.getRelates("husband"));
            person.setPlays(marriage.getRelates("wife"));
            logicMgr.putRule("marriage-is-friendship", TypeQL.parsePattern("{ $x isa person; $y isa person; (husband: $x, wife: $y) isa marriage; }").asConjunction(), TypeQL.parseVariable("(friend: $x, friend: $y) isa friendship").asThing());
            txn.commit();
        }
    }
    try (CoreSession session = databaseMgr.session(database, Arguments.Session.Type.DATA)) {
        try (CoreTransaction txn = singleThreadElgTransaction(session, Arguments.Transaction.Type.WRITE)) {
            txn.query().insert(TypeQL.parseQuery("insert $x isa person, has name 'Zack'; $y isa person, has name 'Yasmin'; (husband: $x, wife: $y) isa marriage;").asInsert());
            txn.commit();
        }
        try (CoreTransaction txn = singleThreadElgTransaction(session, Arguments.Transaction.Type.READ, (new Options.Transaction().explain(true)))) {
            List<ConceptMap> ans = txn.query().match(TypeQL.parseQuery("match (friend: $p1, friend: $p2) isa friendship; $p1 has name $na;").asMatch()).toList();
            assertEquals(2, ans.size());
            assertFalse(ans.get(0).explainables().isEmpty());
            assertFalse(ans.get(1).explainables().isEmpty());
            assertSingleExplainableExplanations(ans.get(0), 1, 1, 1, txn);
            assertSingleExplainableExplanations(ans.get(1), 1, 1, 1, txn);
        }
    }
}
Also used : ConceptManager(com.vaticle.typedb.core.concept.ConceptManager) EntityType(com.vaticle.typedb.core.concept.type.EntityType) Options(com.vaticle.typedb.core.common.parameters.Options) LogicManager(com.vaticle.typedb.core.logic.LogicManager) AttributeType(com.vaticle.typedb.core.concept.type.AttributeType) RelationType(com.vaticle.typedb.core.concept.type.RelationType) CoreSession(com.vaticle.typedb.core.database.CoreSession) ConceptMap(com.vaticle.typedb.core.concept.answer.ConceptMap) CoreTransaction(com.vaticle.typedb.core.database.CoreTransaction) Test(org.junit.Test)

Aggregations

CoreSession (com.vaticle.typedb.core.database.CoreSession)45 CoreTransaction (com.vaticle.typedb.core.database.CoreTransaction)42 Test (org.junit.Test)42 ConceptManager (com.vaticle.typedb.core.concept.ConceptManager)23 EntityType (com.vaticle.typedb.core.concept.type.EntityType)23 AttributeType (com.vaticle.typedb.core.concept.type.AttributeType)21 ConceptMap (com.vaticle.typedb.core.concept.answer.ConceptMap)18 CoreDatabaseManager (com.vaticle.typedb.core.database.CoreDatabaseManager)16 Conjunction (com.vaticle.typedb.core.pattern.Conjunction)14 RelationType (com.vaticle.typedb.core.concept.type.RelationType)13 LogicManager (com.vaticle.typedb.core.logic.LogicManager)10 Util.resolvedConjunction (com.vaticle.typedb.core.reasoner.resolution.Util.resolvedConjunction)10 Identifier (com.vaticle.typedb.core.traversal.common.Identifier)8 Options (com.vaticle.typedb.core.common.parameters.Options)7 Map (java.util.Map)6 Variable (com.vaticle.typedb.core.pattern.variable.Variable)5 TypeQLMatch (com.vaticle.typeql.lang.query.TypeQLMatch)4 TypeDBException (com.vaticle.typedb.core.common.exception.TypeDBException)3 CorrectnessVerifier (com.vaticle.typedb.core.test.behaviour.reasoner.verification.CorrectnessVerifier)3 ThingVariable (com.vaticle.typeql.lang.pattern.variable.ThingVariable)3