Search in sources :

Example 1 with Concept

use of com.vaticle.typedb.core.concept.Concept in project grakn by graknlabs.

the class UnifyAttributeConcludableTest method literal_predicates_unify_and_filter_answers.

@Test
public void literal_predicates_unify_and_filter_answers() {
    String conjunction = "{ $a = 'john'; }";
    Set<Concludable> concludables = Concludable.create(resolvedConjunction(conjunction, logicMgr));
    Concludable.Attribute queryConcludable = concludables.iterator().next().asAttribute();
    Rule rule = createRule("isa-rule", "{ $x isa person; }", "$x has first-name \"john\"", logicMgr);
    List<Unifier> unifiers = queryConcludable.unify(rule.conclusion(), conceptMgr).toList();
    assertEquals(1, unifiers.size());
    Unifier unifier = unifiers.get(0);
    Map<String, Set<String>> result = getStringMapping(unifier.mapping());
    Map<String, Set<String>> expected = new HashMap<String, Set<String>>() {

        {
            put("$a", set("$_0"));
        }
    };
    assertEquals(expected, result);
    // test requirements
    assertEquals(0, unifier.requirements().types().size());
    assertEquals(1, unifier.requirements().isaExplicit().size());
    assertEquals(1, unifier.requirements().predicates().size());
    // test forward unification can reject an invalid partial answer
    ConceptMap unUnified = new ConceptMap(map(pair(Identifier.Variable.name("a"), instanceOf("first-name", "bob"))));
    assertFalse(unifier.unify(unUnified).isPresent());
    // test filter allows a valid answer
    Map<Identifier.Variable, Concept> concepts = map(pair(Identifier.Variable.anon(0), instanceOf("first-name", "john")));
    FunctionalIterator<ConceptMap> unified = unifier.unUnify(concepts, new Unifier.Requirements.Instance(map()));
    assertTrue(unified.hasNext());
    assertEquals(1, unified.next().concepts().size());
    concepts = map(pair(Identifier.Variable.anon(0), instanceOf("first-name", "abe")));
    unified = unifier.unUnify(concepts, new Unifier.Requirements.Instance(map()));
    assertFalse(unified.hasNext());
}
Also used : Concept(com.vaticle.typedb.core.concept.Concept) Set(java.util.Set) Variable(com.vaticle.typedb.core.pattern.variable.Variable) HashMap(java.util.HashMap) Rule(com.vaticle.typedb.core.logic.Rule) Util.createRule(com.vaticle.typedb.core.logic.resolvable.Util.createRule) ConceptMap(com.vaticle.typedb.core.concept.answer.ConceptMap) Test(org.junit.Test)

Example 2 with Concept

use of com.vaticle.typedb.core.concept.Concept in project grakn by graknlabs.

the class UnifyIsaConcludableTest method isa_exact_unifies_rule_relation_variable.

@Test
public void isa_exact_unifies_rule_relation_variable() {
    String conjunction = "{ $a isa relation; }";
    Set<Concludable> concludables = Concludable.create(resolvedConjunction(conjunction, logicMgr));
    Concludable.Isa queryConcludable = concludables.iterator().next().asIsa();
    Rule rule = createRule("isa-rule", "{ $x isa person; $role-type type employment:employee; $rel-type relates $role-type; }", "($role-type: $x) isa $rel-type", logicMgr);
    List<Unifier> unifiers = queryConcludable.unify(rule.conclusion(), conceptMgr).toList();
    assertEquals(1, unifiers.size());
    Unifier unifier = unifiers.get(0);
    Map<String, Set<String>> result = getStringMapping(unifier.mapping());
    HashMap<String, Set<String>> expected = new HashMap<String, Set<String>>() {

        {
            put("$a", set("$_0"));
        }
    };
    assertEquals(expected, result);
    // test requirements
    assertEquals(1, unifier.requirements().types().size());
    assertEquals(1, unifier.requirements().isaExplicit().size());
    assertEquals(set(Label.of("employment")), unifier.requirements().isaExplicit().get(Identifier.Variable.name("a")));
    assertEquals(0, unifier.requirements().predicates().size());
    // test filter allows a valid answer
    Map<Identifier.Variable, Concept> concepts = map(pair(Identifier.Variable.anon(0), instanceOf("employment")), pair(Identifier.Variable.name("rel-type"), conceptMgr.getThingType("employment")));
    FunctionalIterator<ConceptMap> unified = unifier.unUnify(concepts, new Unifier.Requirements.Instance(map()));
    assertTrue(unified.hasNext());
    assertEquals(1, unified.next().concepts().size());
    // filter out invalid type
    concepts = map(pair(Identifier.Variable.anon(0), instanceOf("age")), pair(Identifier.Variable.name("rel-type"), conceptMgr.getThingType("age")));
    unified = unifier.unUnify(concepts, new Unifier.Requirements.Instance(map()));
    assertFalse(unified.hasNext());
}
Also used : Concept(com.vaticle.typedb.core.concept.Concept) Set(java.util.Set) HashMap(java.util.HashMap) Rule(com.vaticle.typedb.core.logic.Rule) Util.createRule(com.vaticle.typedb.core.logic.resolvable.Util.createRule) ConceptMap(com.vaticle.typedb.core.concept.answer.ConceptMap) Test(org.junit.Test)

Example 3 with Concept

use of com.vaticle.typedb.core.concept.Concept in project grakn by graknlabs.

the class UnifyIsaConcludableTest method isa_predicates_can_filter_answers.

// TODO: enable when we have query rewriting to handle all predicates at once
@Ignore
@Test
public void isa_predicates_can_filter_answers() {
    String conjunction = "{ $a isa first-name; $a > 'b'; $a < 'y'; $a contains 'j'; }";
    Set<Concludable> concludables = Concludable.create(resolvedConjunction(conjunction, logicMgr));
    Concludable.Isa queryConcludable = concludables.iterator().next().asIsa();
    Rule rule = createRule("isa-rule", "{ $x isa person; }", "$x has first-name \"john\"", logicMgr);
    List<Unifier> unifiers = queryConcludable.unify(rule.conclusion(), conceptMgr).toList();
    assertEquals(1, unifiers.size());
    Unifier unifier = unifiers.get(0);
    // test requirements
    assertEquals(0, unifier.requirements().types().size());
    assertEquals(1, unifier.requirements().isaExplicit().size());
    assertEquals(3, unifier.requirements().predicates().size());
    // test filter allows a valid answer
    assertEquals(set(Label.of("first-name")), unifier.requirements().isaExplicit().get(Identifier.Variable.name("a")));
    Map<Identifier.Variable, Concept> concepts = map(pair(Identifier.Variable.name("x"), instanceOf("first-name", "johnny")));
    FunctionalIterator<ConceptMap> unified = unifier.unUnify(concepts, new Unifier.Requirements.Instance(map()));
    assertTrue(unified.hasNext());
    assertEquals(1, unified.next().concepts().size());
    // filter out using >
    concepts = map(pair(Identifier.Variable.name("x"), instanceOf("first-name", "abe")));
    unified = unifier.unUnify(concepts, new Unifier.Requirements.Instance(map()));
    assertFalse(unified.hasNext());
    // filter out using <
    concepts = map(pair(Identifier.Variable.name("x"), instanceOf("first-name", "zack")));
    unified = unifier.unUnify(concepts, new Unifier.Requirements.Instance(map()));
    assertFalse(unified.hasNext());
    // filter out using contains
    concepts = map(pair(Identifier.Variable.name("x"), instanceOf("first-name", "carol")));
    unified = unifier.unUnify(concepts, new Unifier.Requirements.Instance(map()));
    assertFalse(unified.hasNext());
}
Also used : Concept(com.vaticle.typedb.core.concept.Concept) Rule(com.vaticle.typedb.core.logic.Rule) Util.createRule(com.vaticle.typedb.core.logic.resolvable.Util.createRule) ConceptMap(com.vaticle.typedb.core.concept.answer.ConceptMap) Ignore(org.junit.Ignore) Test(org.junit.Test)

Example 4 with Concept

use of com.vaticle.typedb.core.concept.Concept in project grakn by graknlabs.

the class ExplanationTest method applyMapping.

private ConceptMap applyMapping(Map<Retrievable, Set<Retrievable>> mapping, ConceptMap completeMap) {
    Map<Retrievable, Concept> concepts = new HashMap<>();
    mapping.forEach((from, tos) -> {
        assertTrue(completeMap.contains(from));
        Concept concept = completeMap.get(from);
        tos.forEach(mapped -> {
            assertTrue(!concepts.containsKey(mapped) || concepts.get(mapped).equals(concept));
            concepts.put(mapped, concept);
        });
    });
    return new ConceptMap(concepts);
}
Also used : Concept(com.vaticle.typedb.core.concept.Concept) Retrievable(com.vaticle.typedb.core.traversal.common.Identifier.Variable.Retrievable) HashMap(java.util.HashMap) ConceptMap(com.vaticle.typedb.core.concept.answer.ConceptMap)

Example 5 with Concept

use of com.vaticle.typedb.core.concept.Concept in project grakn by graknlabs.

the class AnswerStateTest method test_root_partially_mapped_to_downstream_and_back.

@Test
public void test_root_partially_mapped_to_downstream_and_back() {
    Map<Identifier.Variable.Retrievable, Identifier.Variable.Retrievable> mapping = new HashMap<>();
    mapping.put(Identifier.Variable.name("a"), Identifier.Variable.name("x"));
    mapping.put(Identifier.Variable.name("b"), Identifier.Variable.name("y"));
    Map<Identifier.Variable.Retrievable, Concept> concepts = new HashMap<>();
    concepts.put(Identifier.Variable.name("a"), new MockConcept(0));
    Set<Identifier.Variable.Retrievable> filter = set(Identifier.Variable.name("a"), Identifier.Variable.name("b"));
    Concludable.Match<?> mapped = InitialImpl.create(filter, new ConceptMap(), null, false).toDownstream().with(new ConceptMap(concepts)).toDownstream(Mapping.of(mapping), null);
    Map<Identifier.Variable.Retrievable, Concept> expectedMapped = new HashMap<>();
    expectedMapped.put(Identifier.Variable.name("x"), new MockConcept(0));
    assertEquals(new ConceptMap(expectedMapped), mapped.conceptMap());
    Map<Identifier.Variable.Retrievable, Concept> downstreamConcepts = new HashMap<>();
    downstreamConcepts.put(Identifier.Variable.name("x"), new MockConcept(0));
    downstreamConcepts.put(Identifier.Variable.name("y"), new MockConcept(1));
    Partial.Compound<?, ?> partial = mapped.toUpstreamLookup(new ConceptMap(downstreamConcepts), false);
    Map<Identifier.Variable.Retrievable, Concept> expectedWithInitial = new HashMap<>();
    expectedWithInitial.put(Identifier.Variable.name("a"), new MockConcept(0));
    expectedWithInitial.put(Identifier.Variable.name("b"), new MockConcept(1));
    assertEquals(new ConceptMap(expectedWithInitial), partial.conceptMap());
}
Also used : Concept(com.vaticle.typedb.core.concept.Concept) HashMap(java.util.HashMap) Concludable(com.vaticle.typedb.core.reasoner.resolution.answer.AnswerState.Partial.Concludable) Identifier(com.vaticle.typedb.core.traversal.common.Identifier) Partial(com.vaticle.typedb.core.reasoner.resolution.answer.AnswerState.Partial) ConceptMap(com.vaticle.typedb.core.concept.answer.ConceptMap) Test(org.junit.Test)

Aggregations

Concept (com.vaticle.typedb.core.concept.Concept)32 ConceptMap (com.vaticle.typedb.core.concept.answer.ConceptMap)31 HashMap (java.util.HashMap)29 Test (org.junit.Test)23 Set (java.util.Set)20 Rule (com.vaticle.typedb.core.logic.Rule)17 Util.createRule (com.vaticle.typedb.core.logic.resolvable.Util.createRule)17 Variable (com.vaticle.typedb.core.traversal.common.Identifier.Variable)11 HashSet (java.util.HashSet)11 Map (java.util.Map)11 Relation (com.vaticle.typedb.core.concept.thing.Relation)8 Thing (com.vaticle.typedb.core.concept.thing.Thing)8 Retrievable (com.vaticle.typedb.core.traversal.common.Identifier.Variable.Retrievable)5 Collections.set (com.vaticle.typedb.common.collection.Collections.set)4 TypeDBException (com.vaticle.typedb.core.common.exception.TypeDBException)4 FunctionalIterator (com.vaticle.typedb.core.common.iterator.FunctionalIterator)4 Label (com.vaticle.typedb.core.common.parameters.Label)4 ThingType (com.vaticle.typedb.core.concept.type.ThingType)4 Type (com.vaticle.typedb.core.concept.type.Type)4 Lists (com.google.common.collect.Lists)3