@Override public void meet(ZeroLengthPath node) { Var subjVar = node.getSubjectVar(); Var objVar = node.getObjectVar(); if((subjVar != null && subjVar.hasValue()) || (objVar != null && objVar.hasValue())) { // subj = obj cardinality = 1.0; } else { // actual cardinality = count(union(subjs, objs)) // but cost is equivalent to ?s ?p ?o ?c (impl scans all statements) // so due to the lower actual cardinality we value it in preference to a fully unbound statement pattern. cardinality = getSubjectCardinality(subjVar) * getObjectCardinality(objVar) * getContextCardinality(node.getContextVar()); } }
public Set<String> getBindingNames() { return getAssuredBindingNames(); }
@Override public boolean equals(Object other) { if (other instanceof ZeroLengthPath) { ZeroLengthPath o = (ZeroLengthPath)other; return subjectVar.equals(o.getSubjectVar()) && objectVar.equals(o.getObjectVar()) && nullEquals(contextVar, o.getContextVar()) && scope.equals(o.getScope()); } return false; }
@Override public ZeroLengthPath clone() { ZeroLengthPath clone = (ZeroLengthPath)super.clone(); clone.setSubjectVar(getSubjectVar().clone()); clone.setObjectVar(getObjectVar().clone()); if (getContextVar() != null) { clone.setContextVar(getContextVar().clone()); } return clone; } }
/** * Check whether any solution for the {@link StatementPattern} could be derived from * reflexive property inference, and if so, replace the pattern with a union of itself and the * reflexive solution. */ @Override protected void meetSP(StatementPattern node) throws Exception { // Only applies when the predicate is defined and reflexive final Var predVar = node.getPredicateVar(); if (predVar.getValue() != null && inferenceEngine.isReflexiveProperty((URI) predVar.getValue())) { final StatementPattern originalSP = node.clone(); // The reflexive solution is a ZeroLengthPath between subject and // object: they can be matched to one another, whether constants or // variables. final Var subjVar = node.getSubjectVar(); final Var objVar = node.getObjectVar(); final ZeroLengthPath reflexiveSolution = new ZeroLengthPath(subjVar, objVar); node.replaceWith(new InferUnion(originalSP, reflexiveSolution)); } } }
cardinalityMap.put(tupleExpr, statistics.getCardinality(tupleExpr)); if (tupleExpr instanceof ZeroLengthPath) { varsMap.put(tupleExpr, ((ZeroLengthPath)tupleExpr).getVarList());
return new ZeroLengthPath(scope, subjVar, endVar, contextVar); return new ZeroLengthPath(scope, subjVar, endVar, contextVar);
public CloseableIteration<BindingSet, QueryEvaluationException> evaluate(ZeroLengthPath zlp, final BindingSet bindings) throws QueryEvaluationException { final Var subjectVar = zlp.getSubjectVar(); final Var objVar = zlp.getObjectVar(); final Var contextVar = zlp.getContextVar(); Value subj = null; try { subj = evaluate(subjectVar, bindings); } catch (QueryEvaluationException e) { } Value obj = null; try { obj = evaluate(objVar, bindings); } catch (QueryEvaluationException e) { } if (subj != null && obj != null) { if (!subj.equals(obj)) { return new EmptyIteration<BindingSet, QueryEvaluationException>(); } } return getZeroLengthPathIterator(bindings, subjectVar, objVar, contextVar, subj, obj); }
ZeroLengthPath zlp = new ZeroLengthPath(scope, startVar, endVar, contextVar); currentIter = this.evaluationStrategyImpl.evaluate(zlp, bindings); currentLength++;
@Override public void meet(final Union n) { final TupleExpr l = n.getLeftArg(); final TupleExpr r = n.getRightArg(); final ZeroLengthPath p = l instanceof ZeroLengthPath ? (ZeroLengthPath) l : r instanceof ZeroLengthPath ? (ZeroLengthPath) r : null; if (p == null) { emit(l, !(l instanceof Union)).emit(" UNION ").emit(r, !(r instanceof Union)); } else { final Var s = p.getSubjectVar(); final Var o = p.getObjectVar(); final Var c = p.getContextVar(); if (c != null) { emit("GRAPH ").emit(c).emit(" ").openBrace(); } emit(s).emit(" ").emitPropertyPath(n, s, o).emit(" ").emit(o); if (c != null) { closeBrace(); } } }
@Override public void meet(final Union n) { final TupleExpr l = n.getLeftArg(); final TupleExpr r = n.getRightArg(); final ZeroLengthPath p = l instanceof ZeroLengthPath ? (ZeroLengthPath) l : r instanceof ZeroLengthPath ? (ZeroLengthPath) r : null; if (p == null) { emit(l, !(l instanceof Union)).emit(" UNION ").emit(r, !(r instanceof Union)); } else { final Var s = p.getSubjectVar(); final Var o = p.getObjectVar(); final Var c = p.getContextVar(); if (c != null) { emit("GRAPH ").emit(c).emit(" ").openBrace(); } emit(s).emit(" ").emitPropertyPath(n, s, o).emit(" ").emit(o); if (c != null) { closeBrace(); } } }