public static HasAtom create(Var var, Var predicateVar, ConceptId predicateId, ReasonerQuery parent) { Label label = parent.tx().getConcept(predicateId).asType().label(); return create(var.has(Graql.label(label)), predicateVar, predicateId, parent); }
@Override public Atomic mapToAtom(VarPatternAdmin var, Set<VarPatternAdmin> vars, ReasonerQuery parent) { //NB: HasAttributeProperty always has (type) label specified Var varName = var.var().asUserDefined(); Var relationVariable = relationship().var(); Var attributeVariable = attribute().var().asUserDefined(); Set<ValuePredicate> predicates = getValuePredicates(attributeVariable, attribute(), vars, parent); IsaProperty isaProp = attribute().getProperties(IsaProperty.class).findFirst().orElse(null); VarPatternAdmin typeVar = isaProp != null? isaProp.type() : null; IdPredicate predicate = typeVar != null? getIdPredicate(attributeVariable, typeVar, vars, parent) : null; ConceptId predicateId = predicate != null? predicate.getPredicate() : null; //add resource atom VarPatternAdmin resVar = relationVariable.isUserDefinedName()? varName.has(type(), attributeVariable, relationVariable).admin() : varName.has(type(), attributeVariable).admin(); return ResourceAtom.create(resVar, attributeVariable, relationVariable, predicateId, predicates, parent); } }
@Override public Atomic mapToAtom(VarPatternAdmin var, Set<VarPatternAdmin> vars, ReasonerQuery parent) { //NB: HasResourceType is a special case and it doesn't allow variables as resource types Var varName = var.var().asUserDefined(); Label label = this.resourceType().getTypeLabel().orElse(null); Var predicateVar = var().asUserDefined(); SchemaConcept schemaConcept = parent.tx().getSchemaConcept(label); ConceptId predicateId = schemaConcept != null? schemaConcept.id() : null; //isa part VarPatternAdmin resVar = varName.has(Graql.label(label)).admin(); return HasAtom.create(resVar, predicateVar, predicateId, parent); } }
/** * Helper method to check whether the concept types in the target have any instances * * @return true if they exist, false if they don't */ private boolean targetContainsInstance() { for (Label attributeType : targetTypeLabels()) { for (Label type : scopeTypeLabels()) { Boolean patternExist = tx.graql().infer(false).match( Graql.var("x").has(attributeType, Graql.var()), Graql.var("x").isa(Graql.label(type)) ).iterator().hasNext(); if (patternExist) return true; } } return false; //TODO: should use the following ask query when ask query is even lazier // List<Pattern> checkResourceTypes = statisticsResourceTypes.stream() // .map(type -> var("x").has(type, var())).collect(Collectors.toList()); // List<Pattern> checkSubtypes = inTypes.stream() // .map(type -> var("x").isa(Graql.label(type))).collect(Collectors.toList()); // // return tx.get().graql().infer(false) // .match(or(checkResourceTypes), or(checkSubtypes)).aggregate(ask()).execute(); }
public Pattern pattern(Attribute concept) { Var owner = Graql.var().asUserDefined(); VarPattern resourceVar = Graql.var().asUserDefined().val(concept.value()); return owner .has(concept.type().label(),resourceVar) .id(concept.owner().id()); } }
@Override public ResourceAtom rewriteWithRelationVariable(){ Var attributeVariable = getPredicateVariable(); Var relationVariable = getRelationVariable().asUserDefined(); VarPattern newVar = getVarName().has(getSchemaConcept().label(), attributeVariable, relationVariable); return create(newVar.admin(), attributeVariable, relationVariable, getTypeId(), getMultiPredicate(), getParentQuery()); }