use of ai.grakn.graql.admin.VarPatternAdmin in project grakn by graknlabs.
the class QueryParserTest method whenParsingAQueryAndDefiningAllVars_AllVarsExceptLabelsAreDefined.
@Test
public void whenParsingAQueryAndDefiningAllVars_AllVarsExceptLabelsAreDefined() {
QueryParser parser = Graql.parser();
parser.defineAllVars(true);
GetQuery query = parser.parseQuery("match ($x, $y) isa foo; get;");
System.out.println(query);
Conjunction<PatternAdmin> conjunction = query.match().admin().getPattern();
Set<PatternAdmin> patterns = conjunction.getPatterns();
VarPatternAdmin pattern = Iterables.getOnlyElement(patterns).asVarPattern();
assertTrue(pattern.var().isUserDefinedName());
IsaProperty property = pattern.getProperty(IsaProperty.class).get();
assertFalse(property.type().var().isUserDefinedName());
}
use of ai.grakn.graql.admin.VarPatternAdmin in project grakn by graknlabs.
the class QueryParserTest method testParseBooleanType.
@Test
public void testParseBooleanType() {
GetQuery query = parse("match $x datatype boolean; get;");
VarPatternAdmin var = query.match().admin().getPattern().varPatterns().iterator().next();
// noinspection OptionalGetWithoutIsPresent
DataTypeProperty property = var.getProperty(DataTypeProperty.class).get();
Assert.assertEquals(AttributeType.DataType.BOOLEAN, property.dataType());
}
use of ai.grakn.graql.admin.VarPatternAdmin in project grakn by graknlabs.
the class RelationshipAtom method rewriteWithRelationVariable.
@Override
public RelationshipAtom rewriteWithRelationVariable() {
VarPattern newVar = Graql.var().asUserDefined();
VarPattern relVar = getPattern().admin().getProperty(IsaProperty.class).map(prop -> newVar.isa(prop.type())).orElse(newVar);
for (RelationPlayer c : getRelationPlayers()) {
VarPatternAdmin roleType = c.getRole().orElse(null);
if (roleType != null) {
relVar = relVar.rel(roleType, c.getRolePlayer());
} else {
relVar = relVar.rel(c.getRolePlayer());
}
}
return create(relVar.admin(), getPredicateVariable(), getTypeId(), getParentQuery());
}
use of ai.grakn.graql.admin.VarPatternAdmin in project grakn by graknlabs.
the class RelationshipAtom method getRelationPlayerMappings.
/**
* @param parentAtom reference atom defining the mapping
* @param matchType type of match to be performed
* @return set of possible COMPLETE mappings between this (child) and parent relation players
*/
private Set<List<Pair<RelationPlayer, RelationPlayer>>> getRelationPlayerMappings(RelationshipAtom parentAtom, UnifierComparison matchType) {
Multimap<Role, RelationPlayer> childRoleRPMap = this.getRoleRelationPlayerMap();
Map<Var, Type> childVarTypeMap = this.getParentQuery().getVarTypeMap();
Map<Var, Type> parentVarTypeMap = parentAtom.getParentQuery().getVarTypeMap();
// establish compatible castings for each parent casting
List<Set<Pair<RelationPlayer, RelationPlayer>>> compatibleMappingsPerParentRP = new ArrayList<>();
ReasonerQueryImpl childQuery = (ReasonerQueryImpl) getParentQuery();
Set<Role> childRoles = childRoleRPMap.keySet();
parentAtom.getRelationPlayers().stream().filter(prp -> prp.getRole().isPresent()).forEach(prp -> {
VarPatternAdmin parentRolePattern = prp.getRole().orElse(null);
if (parentRolePattern == null) {
throw GraqlQueryException.rolePatternAbsent(this);
}
Label parentRoleLabel = parentRolePattern.getTypeLabel().orElse(null);
if (parentRoleLabel != null) {
Var parentRolePlayer = prp.getRolePlayer().var();
Type parentType = parentVarTypeMap.get(parentRolePlayer);
Set<Role> compatibleRoles = compatibleRoles(tx().getSchemaConcept(parentRoleLabel), parentType, childRoles);
List<RelationPlayer> compatibleRelationPlayers = new ArrayList<>();
compatibleRoles.stream().filter(childRoleRPMap::containsKey).forEach(role -> childRoleRPMap.get(role).stream().filter(crp -> {
Var childVar = crp.getRolePlayer().var();
Type childType = childVarTypeMap.get(childVar);
return matchType.typePlayability(childQuery, childVar, parentType) && matchType.typeCompatibility(parentType, childType);
}).filter(crp -> {
IdPredicate parentId = parentAtom.getIdPredicate(prp.getRolePlayer().var());
IdPredicate childId = this.getIdPredicate(crp.getRolePlayer().var());
return matchType.atomicCompatibility(parentId, childId);
}).filter(crp -> {
ValuePredicate parentVP = parentAtom.getPredicate(prp.getRolePlayer().var(), ValuePredicate.class);
ValuePredicate childVP = this.getPredicate(crp.getRolePlayer().var(), ValuePredicate.class);
return matchType.atomicCompatibility(parentVP, childVP);
}).forEach(compatibleRelationPlayers::add));
if (!compatibleRelationPlayers.isEmpty()) {
compatibleMappingsPerParentRP.add(compatibleRelationPlayers.stream().map(crp -> new Pair<>(crp, prp)).collect(Collectors.toSet()));
}
} else {
compatibleMappingsPerParentRP.add(getRelationPlayers().stream().map(crp -> new Pair<>(crp, prp)).collect(Collectors.toSet()));
}
});
return Sets.cartesianProduct(compatibleMappingsPerParentRP).stream().filter(list -> !list.isEmpty()).filter(list -> {
List<RelationPlayer> listChildRps = list.stream().map(Pair::getKey).collect(Collectors.toList());
// NB: this preserves cardinality instead of removing all occuring instances which is what we want
return ReasonerUtils.subtract(listChildRps, this.getRelationPlayers()).isEmpty();
}).filter(list -> {
List<RelationPlayer> listParentRps = list.stream().map(Pair::getValue).collect(Collectors.toList());
return listParentRps.containsAll(parentAtom.getRelationPlayers());
}).collect(toSet());
}
use of ai.grakn.graql.admin.VarPatternAdmin in project grakn by graknlabs.
the class QueryCacheTest method onStartup.
@Before
public void onStartup() {
assumeTrue(GraknTestUtil.usingTinker());
graph = testContext.tx();
String recordPatternString = "{(role1: $x, role2: $y) isa reifiable-relation;}";
String retrievePatternString = "{(role1: $p1, role2: $p2) isa reifiable-relation;}";
Conjunction<VarPatternAdmin> recordPattern = conjunction(recordPatternString, graph);
Conjunction<VarPatternAdmin> retrievePattern = conjunction(retrievePatternString, graph);
recordQuery = ReasonerQueries.atomic(recordPattern, graph);
retrieveQuery = ReasonerQueries.atomic(retrievePattern, graph);
retrieveToRecordUnifier = retrieveQuery.getMultiUnifier(recordQuery).getUnifier();
recordToRetrieveUnifier = retrieveToRecordUnifier.inverse();
Entity entity = graph.getEntityType("anotherNoRoleEntity").instances().findFirst().orElse(null);
singleAnswer = new QueryAnswer(ImmutableMap.of(var("x"), entity, var("y"), entity));
}
Aggregations