Java源码示例:org.apache.jena.sparql.engine.ExecutionContext
示例1
static public QueryIterator create( QueryIterator input,
Triple tp,
ExecutionContext cxt )
{
if ( tp.getSubject() instanceof Node_Triple
|| tp.getObject() instanceof Node_Triple
|| tp.getSubject().isVariable()
|| tp.getObject().isVariable() )
{
return new QueryIterTripleStarPattern(input, tp, cxt);
}
else
{
return new QueryIterTriplePattern(input, tp, cxt);
}
}
示例2
public TripleMapper( Binding binding, Triple tp, ExecutionContext cxt )
{
super(cxt) ;
this.s = ExtendedSubstitute.substitute( tp.getSubject(), binding );
this.p = ExtendedSubstitute.substitute( tp.getPredicate(), binding );
this.o = ExtendedSubstitute.substitute( tp.getObject(), binding );
this.sIsTripleWithVars = isTripleWithVars(s);
this.oIsTripleWithVars = isTripleWithVars(o);
this.binding = binding;
final Node s2 = sIsTripleWithVars ? Node.ANY : convertToBeUsedForFind(s);
final Node p2 = convertToBeUsedForFind(p);
final Node o2 = oIsTripleWithVars ? Node.ANY : convertToBeUsedForFind(o);
final Graph graph = cxt.getActiveGraph();
this.graphIter = graph.find(s2, p2, o2);
}
示例3
@Test
public void matchSubjectInSubjectTriple()
{
// << ?V1 ex:p ex:o >> ex:m1 ex:x1
final Triple tp1 = new Triple( $V1(), $p(), $o() );
final Node nTP1 = new Node_TripleStarPattern( tp1 );
final Triple tp2 = new Triple( nTP1, $m1(), $x1() );
final Binding inputBinding = BindingFactory.binding();
final ExecutionContext execCxt = createTestExecCxt();
final QueryIterator input = QueryIterSingleton.create(inputBinding, execCxt);
final QueryIterator it = QueryIterTripleStarPattern.create( input, tp2, execCxt );
assertTrue( it.hasNext() );
final Binding outputBinding = it.nextBinding();
assertEquals( 1, outputBinding.size() );
assertEquals( $V1(), outputBinding.vars().next() );
assertEquals( $s(), outputBinding.get($V1()) );
assertFalse( it.hasNext() );
it.close();
}
示例4
@Test
public void matchSubjectInSubjectTripleWithGivenObjectInMetaTriple()
{
// << ?V1 ex:p ex:o >> ex:m1 ?V2
final Triple tp1 = new Triple( $V1(), $p(), $o() );
final Node nTP1 = new Node_TripleStarPattern( tp1 );
final Triple tp2 = new Triple( nTP1, $m1(), $V2() );
// ?V2 --> ex:x1
final Binding inputBinding = BindingFactory.binding( $V2(), $x1() );
final ExecutionContext execCxt = createTestExecCxt();
final QueryIterator input = QueryIterSingleton.create(inputBinding, execCxt);
final QueryIterator it = QueryIterTripleStarPattern.create( input, tp2, execCxt );
assertTrue( it.hasNext() );
final Binding outputBinding = it.nextBinding();
assertEquals( 2, outputBinding.size() );
assertEquals( $s(), outputBinding.get($V1()) );
assertEquals( $x1(), outputBinding.get($V2()) );
assertFalse( it.hasNext() );
it.close();
}
示例5
@Test
public void matchNothingWithGivenObjectInObjectTriple()
{
// ?V1 ?V2 << ex:s ex:p ?V3 >>
final Triple tp1 = new Triple( $s(), $p(), $V3() );
final Node nTP1 = new Node_TripleStarPattern( tp1 );
final Triple tp2 = new Triple( $V1(), $V2(), nTP1 );
// ?V3 --> ex:x1
final Binding inputBinding = BindingFactory.binding( $V3(), $x1() );
final ExecutionContext execCxt = createTestExecCxt();
final QueryIterator input = QueryIterSingleton.create(inputBinding, execCxt);
final QueryIterator it = QueryIterTripleStarPattern.create( input, tp2, execCxt );
assertFalse( it.hasNext() );
it.close();
}
示例6
@Test
public void matchObjectRequiresRedundancyAugmentation()
{
// ex:s ex:p ?V3
final Triple tp = new Triple( $s(), $p(), $V3() );
final Binding inputBinding = BindingFactory.binding();
final ExecutionContext execCxt = createTestExecCxt();
final QueryIterator input = QueryIterSingleton.create(inputBinding, execCxt);
final QueryIterator it = QueryIterTripleStarPattern.create( input, tp, execCxt );
assertTrue( it.hasNext() );
final Binding outputBinding = it.nextBinding();
assertEquals( 1, outputBinding.size() );
assertEquals( $o(), outputBinding.get($V3()) );
assertFalse( it.hasNext() );
it.close();
}
示例7
@Test
public void matchSubjectWithGivenObjectRequiresRedundancyAugmentation()
{
// ?V1 ex:p ?V3
final Triple tp = new Triple( $V1(), $p(), $V3() );
// ?V3 --> ex:x1
final Binding inputBinding = BindingFactory.binding( $V3(), $o() );
final ExecutionContext execCxt = createTestExecCxt();
final QueryIterator input = QueryIterSingleton.create(inputBinding, execCxt);
final QueryIterator it = QueryIterTripleStarPattern.create( input, tp, execCxt );
assertTrue( it.hasNext() );
final Binding outputBinding = it.nextBinding();
assertEquals( 2, outputBinding.size() );
assertEquals( $s(), outputBinding.get($V1()) );
assertEquals( $o(), outputBinding.get($V3()) );
assertFalse( it.hasNext() );
it.close();
}
示例8
private static Node invokeFunction(Resource function, ExprList args, Dataset dataset) {
if (dataset == null) {
dataset = ARQFactory.get().getDataset(ModelFactory.createDefaultModel());
}
E_Function expr = new E_Function(function.getURI(), args);
DatasetGraph dsg = dataset.asDatasetGraph();
Context cxt = ARQ.getContext().copy();
cxt.set(ARQConstants.sysCurrentTime, NodeFactoryExtra.nowAsDateTime());
FunctionEnv env = new ExecutionContext(cxt, dsg.getDefaultGraph(), dsg, null);
try {
NodeValue r = expr.eval(BindingRoot.create(), env);
if(r != null) {
return r.asNode();
}
}
catch(ExprEvalException ex) {
}
return null;
}
示例9
@Override
public QueryIterator exec(Binding binding, PropFuncArg argSubject,
Node predicate, PropFuncArg argObject, ExecutionContext execCxt) {
argSubject = Substitute.substitute(argSubject, binding);
argObject = Substitute.substitute(argObject, binding);
if(!argObject.getArg().isVariable()) {
throw new ExprEvalException("Right hand side of tosh:targetContains must be a variable");
}
Node targetNode = argSubject.getArgList().get(0);
Node shapesGraphNode = argSubject.getArgList().get(1);
Model currentModel = ModelFactory.createModelForGraph(execCxt.getActiveGraph());
Dataset dataset = new DatasetWithDifferentDefaultModel(currentModel, DatasetImpl.wrap(execCxt.getDataset()));
Model model = dataset.getNamedModel(shapesGraphNode.getURI());
Resource target = (Resource) model.asRDFNode(targetNode);
Set<Node> focusNodes = new HashSet<Node>();
SHACLUtil.addNodesInTarget(target, dataset, focusNodes);
return new QueryIterExtendByVar(binding, (Var) argObject.getArg(), focusNodes.iterator(), execCxt);
}
示例10
private QueryIterator buildSyntax(QueryIterator input, Node nodeVar, String pattern, ExecutionContext execCxt)
{
Var var2 = createNewVar() ;
// Triple patterns for ?x rdfs:label ?hiddenVar
ElementTriplesBlock elementBGP = new ElementTriplesBlock();
Triple t = new Triple(nodeVar, RDFS.label.asNode(), var2) ;
elementBGP.addTriple(t) ;
// Regular expression for regex(?hiddenVar, "pattern", "i")
Expr regex = new E_Regex(new ExprVar(var2.getName()), pattern, "i") ;
ElementGroup elementGroup = new ElementGroup() ;
elementGroup.addElement(elementBGP) ;
elementGroup.addElement(new ElementFilter(regex)) ;
// Compile it.
// The better design is to build the Op structure programmatically,
Op op = Algebra.compile(elementGroup) ;
op = Algebra.optimize(op, execCxt.getContext()) ;
return QC.execute(op, input, execCxt) ;
}
示例11
private QueryIterator execFixedSubject(Node nodeURI, Node nodeLocalname, Binding binding, ExecutionContext execCxt)
{
if ( ! nodeURI.isURI() )
// Subject bound but not a URI
return QueryIterNullIterator.create(execCxt) ;
// Subject is bound and a URI - get the localname as a Node
Node localname = NodeFactory.createLiteral(nodeURI.getLocalName()) ;
// Object - unbound variable or a value?
if ( ! nodeLocalname.isVariable() )
{
// Object bound or a query constant. Is it the same as the calculated value?
if ( nodeLocalname.equals(localname) )
// Same
return QueryIterSingleton.create(binding, execCxt) ;
// No - different - no match.
return QueryIterNullIterator.create(execCxt) ;
}
// Object unbound variable - assign the localname to it.
return QueryIterSingleton.create(binding, Var.alloc(nodeLocalname), localname, execCxt) ;
}
示例12
private QueryIterator execAllNodes(Var subjVar, Node nodeLocalname, Binding input, ExecutionContext execCxt)
{
if ( ! nodeLocalname.isVariable() )
{
if ( ! nodeLocalname.isLiteral() )
// Not a variable, not a literal=> can't match
return QueryIterNullIterator.create(execCxt) ;
if( ! NodeUtils.isSimpleString(nodeLocalname) )
return QueryIterNullIterator.create(execCxt) ;
}
//Set bindings = new HashSet() ; // Use a Set if you want unique results.
List<Binding> bindings = new ArrayList<Binding>() ; // Use a list if you want counting results.
Graph graph = execCxt.getActiveGraph() ;
ExtendedIterator<Triple>iter = graph.find(Node.ANY, Node.ANY, Node.ANY) ;
for ( ; iter.hasNext() ; )
{
Triple t = iter.next() ;
slot(bindings, input, t.getSubject(), subjVar, nodeLocalname) ;
slot(bindings, input, t.getPredicate(), subjVar, nodeLocalname) ;
slot(bindings, input, t.getObject(), subjVar, nodeLocalname) ;
}
return new QueryIterPlainWrapper(bindings.iterator(), execCxt) ;
}
示例13
@Override
public QueryIterator execute(BasicPattern pattern,
QueryIterator input,
ExecutionContext execCxt)
{
// Just want to pick out some BGPs (e.g. on a particualr graph)
// Test :: execCxt.getActiveGraph()
if ( ! ( execCxt.getActiveGraph() instanceof GraphBase ) )
// Example: pass on up to the original StageGenerator if
// not based on GraphBase (which most Graph implementations are).
return other.execute(pattern, input, execCxt) ;
System.err.println("MyStageGenerator.compile:: triple patterns = "+pattern.size()) ;
// Stream the triple matches together, one triple matcher at a time.
QueryIterator qIter = input ;
for (Triple triple : pattern.getList())
qIter = new QueryIterTriplePattern(qIter, triple, execCxt) ;
return qIter ;
}
示例14
@Override
protected QueryIterator execute(BasicPattern pattern,
ReorderTransformation reorder,
StageGenerator execution,
QueryIterator input,
ExecutionContext execCxt)
{
// The implementation of this method is a copy of the
// superclass method that is modified to use SPARQL*-aware
// versions of Substitute and QueryIterBlockTriples.
Explain.explain(pattern, execCxt.getContext());
if ( ! input.hasNext() )
return input;
if ( reorder != null && pattern.size() >= 2 ) {
// If pattern size is 0 or 1, nothing to do.
BasicPattern bgp2 = pattern;
// Try to ground the pattern
if ( ! input.isJoinIdentity() ) {
QueryIterPeek peek = QueryIterPeek.create(input, execCxt);
// And now use this one
input = peek;
Binding b = peek.peek();
bgp2 = ExtendedSubstitute.substitute(pattern, b);
}
ReorderProc reorderProc = reorder.reorderIndexes(bgp2);
pattern = reorderProc.reorder(pattern);
}
Explain.explain("Reorder/generic", pattern, execCxt.getContext());
QueryIterator chain = input;
for ( final Triple triple : pattern )
chain = QueryIterTripleStarPattern.create(chain, triple, execCxt);
return chain;
}
示例15
protected QueryIterTripleStarPattern( QueryIterator input,
Triple tp,
ExecutionContext cxt )
{
super(input, cxt);
this.tp = Node_TripleStarPattern.asTripleWithNode_TripleStarPatterns(tp);
}
示例16
@Test
public void matchWholeSubjectTriple()
{
// ?V1 ex:m1 ex:x1
final Triple tp = new Triple( $V1(), $m1(), $x1() );
final ExecutionContext execCxt = createTestExecCxt();
final Binding inputBinding = BindingFactory.binding();
final QueryIterator input = QueryIterSingleton.create(inputBinding, execCxt);
final QueryIterator it = QueryIterTripleStarPattern.create( input, tp, execCxt );
assertTrue( it.hasNext() );
final Binding outputBinding = it.nextBinding();
assertEquals( 1, outputBinding.size() );
assertEquals( $V1(), outputBinding.vars().next() );
final Node outputValue = outputBinding.get( $V1() );
assertTrue( outputValue instanceof Node_Triple );
final Triple outputTriple = ( (Node_Triple) outputValue ).get();
assertEquals( $s(), outputTriple.getSubject() );
assertEquals( $p(), outputTriple.getPredicate() );
assertEquals( $o(), outputTriple.getObject() );
assertFalse( it.hasNext() );
it.close();
}
示例17
@Test
public void matchWholeObjectTriple()
{
// ex:x1 ex:m1 ?V1
final Triple tp = new Triple( $x1(), $m1(), $V1() );
final ExecutionContext execCxt = createTestExecCxt();
final Binding inputBinding = BindingFactory.binding();
final QueryIterator input = QueryIterSingleton.create(inputBinding, execCxt);
final QueryIterator it = QueryIterTripleStarPattern.create( input, tp, execCxt );
assertTrue( it.hasNext() );
final Binding outputBinding = it.nextBinding();
assertEquals( 1, outputBinding.size() );
assertEquals( $V1(), outputBinding.vars().next() );
final Node outputValue = outputBinding.get( $V1() );
assertTrue( outputValue instanceof Node_Triple );
final Triple outputTriple = ( (Node_Triple) outputValue ).get();
assertEquals( $s(), outputTriple.getSubject() );
assertEquals( $p(), outputTriple.getPredicate() );
assertEquals( $o(), outputTriple.getObject() );
assertFalse( it.hasNext() );
it.close();
}
示例18
@Test
public void matchMetaTriplesBasedOnWholeSubjectTriple()
{
// << ex:s ex:p ex:o >> ?V1 ?V2
final Triple tp1 = new Triple( $s(), $p(), $o() );
final Node nTP1 = new Node_TripleStarPattern( tp1 );
final Triple tp2 = new Triple( nTP1, $V1(), $V2() );
final Binding inputBinding = BindingFactory.binding();
final ExecutionContext execCxt = createTestExecCxt();
final QueryIterator input = QueryIterSingleton.create(inputBinding, execCxt);
final QueryIterator it = QueryIterTripleStarPattern.create( input, tp2, execCxt );
assertTrue( it.hasNext() );
Binding outputBinding = null;
outputBinding = it.nextBinding();
assertEquals( 2, outputBinding.size() );
assertEquals( $m1(), outputBinding.get($V1()) );
assertEquals( $x2(), outputBinding.get($V2()) );
outputBinding = it.nextBinding();
assertEquals( 2, outputBinding.size() );
assertEquals( $m1(), outputBinding.get($V1()) );
assertEquals( $x1(), outputBinding.get($V2()) );
assertFalse( it.hasNext() );
it.close();
}
示例19
@Test
public void matchSubjectInSubjectTripleAndObjectInMetaTriple()
{
// << ?V1 ex:p ex:o >> ex:m1 ?V2
final Triple tp1 = new Triple( $V1(), $p(), $o() );
final Node nTP1 = new Node_TripleStarPattern( tp1 );
final Triple tp2 = new Triple( nTP1, $m1(), $V2() );
final Binding inputBinding = BindingFactory.binding();
final ExecutionContext execCxt = createTestExecCxt();
final QueryIterator input = QueryIterSingleton.create(inputBinding, execCxt);
final QueryIterator it = QueryIterTripleStarPattern.create( input, tp2, execCxt );
assertTrue( it.hasNext() );
Binding outputBinding = it.nextBinding();
assertEquals( 2, outputBinding.size() );
assertEquals( $s(), outputBinding.get($V1()) );
assertEquals( $x2(), outputBinding.get($V2()) );
outputBinding = it.nextBinding();
assertEquals( 2, outputBinding.size() );
assertEquals( $s(), outputBinding.get($V1()) );
assertEquals( $x1(), outputBinding.get($V2()) );
assertFalse( it.hasNext() );
it.close();
}
示例20
@Test
public void matchSubjectInMetaTripleWithGivenObjectInObjectTriple()
{
// ?V1 ?V2 << ex:s ex:p ?V3 >>
final Triple tp1 = new Triple( $s(), $p(), $V3() );
final Node nTP1 = new Node_TripleStarPattern( tp1 );
final Triple tp2 = new Triple( $V1(), $V2(), nTP1 );
// ?V3 --> ex:o
final Binding inputBinding = BindingFactory.binding( $V3(), $o() );
final ExecutionContext execCxt = createTestExecCxt();
final QueryIterator input = QueryIterSingleton.create(inputBinding, execCxt);
final QueryIterator it = QueryIterTripleStarPattern.create( input, tp2, execCxt );
assertTrue( it.hasNext() );
Binding outputBinding = it.nextBinding();
assertEquals( 3, outputBinding.size() );
assertEquals( $x2(), outputBinding.get($V1()) );
assertEquals( $m2(), outputBinding.get($V2()) );
assertEquals( $o(), outputBinding.get($V3()) );
outputBinding = it.nextBinding();
assertEquals( 3, outputBinding.size() );
assertEquals( $x1(), outputBinding.get($V1()) );
assertEquals( $m1(), outputBinding.get($V2()) );
assertEquals( $o(), outputBinding.get($V3()) );
assertFalse( it.hasNext() );
it.close();
}
示例21
@Test
public void matchSubjectInMetaTripleWithGivenSubjectInObjectTriple()
{
// ?V1 ?V2 << ?V3 ex:p ex:o >>
final Triple tp1 = new Triple( $s(), $p(), $V3() );
final Node nTP1 = new Node_TripleStarPattern( tp1 );
final Triple tp2 = new Triple( $V1(), $V2(), nTP1 );
// ?V2 --> ex:m1, ?V3 --> ex:s
final Binding inputBindingX = BindingFactory.binding( $V2(), $m1() );
final Binding inputBinding = BindingFactory.binding( inputBindingX, $V3(), $o() );
final ExecutionContext execCxt = createTestExecCxt();
final QueryIterator input = QueryIterSingleton.create(inputBinding, execCxt);
final QueryIterator it = QueryIterTripleStarPattern.create( input, tp2, execCxt );
assertTrue( it.hasNext() );
final Binding outputBinding = it.nextBinding();
assertEquals( 3, outputBinding.size() );
assertEquals( $x1(), outputBinding.get($V1()) );
assertEquals( $m1(), outputBinding.get($V2()) );
assertEquals( $o(), outputBinding.get($V3()) );
assertFalse( it.hasNext() );
it.close();
}
示例22
@Override
public QueryIterator execEvaluated(Binding binding, Node nodeURI, Node predicate, Node nodeLocalname, ExecutionContext execCxt)
{
if ( ! nodeURI.isVariable() )
return execFixedSubject(nodeURI, nodeLocalname, binding, execCxt) ;
else
return execAllNodes(Var.alloc(nodeURI), nodeLocalname, binding, execCxt) ;
}
示例23
@Override
public QueryIterator iterator(ExecutionContext ctxt) {
// QueryIteratorPlainWrapper doesn't close wrapped
// ClosableIterators, so we do that ourselves.
final ClosableIterator<Binding> wrapped = rows();
return new QueryIterPlainWrapper(wrapped, ctxt) {
@Override
protected void closeIterator() {
super.closeIterator();
wrapped.close();
}
};
}
示例24
protected ExecutionContext createTestExecCxt()
{
final DatasetGraph dsg = DatasetGraphFactory.create( createTestGraph() );
final Context context = ARQ.getContext();
return new ExecutionContext( context, dsg.getDefaultGraph(), dsg, QC.getFactory(context) );
}
示例25
@Override
public QueryIterator exec(Binding binding, PropFuncArg argSubject,
Node predicate, PropFuncArg argObject, ExecutionContext execCxt) {
argSubject = Substitute.substitute(argSubject, binding);
argObject = Substitute.substitute(argObject, binding);
if(!argObject.getArg().isVariable()) {
throw new ExprEvalException("Right hand side of tosh:exprEval must be a variable");
}
Node exprNode = argSubject.getArgList().get(0);
Node focusNode = argSubject.getArgList().get(1);
Model model = ModelFactory.createModelForGraph(execCxt.getActiveGraph());
Dataset dataset = ARQFactory.get().getDataset(model);
URI shapesGraphURI = URI.create("urn:x-topbraid:dummyShapesGraph");
dataset.addNamedModel(shapesGraphURI.toString(), model);
ShapesGraph[] shapesGraph = new ShapesGraph[1];
NodeExpression n = NodeExpressionFactory.get().create(model.asRDFNode(exprNode));
ExtendedIterator<RDFNode> it = n.eval(model.asRDFNode(focusNode), new NodeExpressionContext() {
@Override
public URI getShapesGraphURI() {
return shapesGraphURI;
}
@Override
public ShapesGraph getShapesGraph() {
if(shapesGraph[0] == null) {
shapesGraph[0] = new ShapesGraph(model);
}
return shapesGraph[0];
}
@Override
public Dataset getDataset() {
return dataset;
}
});
Iterator<Node> nit = it.mapWith(rdfNode -> rdfNode.asNode());
return new QueryIterExtendByVar(binding, (Var) argObject.getArg(), nit, execCxt);
}
示例26
@Override
public void build(PropFuncArg argSubject, Node predicate, PropFuncArg argObject, ExecutionContext execCxt)
{
if ( argSubject.isList() || argObject.isList() )
throw new QueryBuildException("List arguments to "+predicate.getURI()) ;
}
示例27
@Override
public QueryIterator exec(QueryIterator input, PropFuncArg argSubject, Node predicate, PropFuncArg argObject, ExecutionContext execCxt)
{
// No real need to check the pattern arguments because
// the replacement triple pattern and regex will cope
// but we illustrate testing here.
Node nodeVar = argSubject.getArg() ;
String pattern = NodeUtils.stringLiteral(argObject.getArg()) ;
if ( pattern == null )
{
Log.warn(this, "Pattern must be a plain literal or xsd:string: "+argObject.getArg()) ;
return QueryIterNullIterator.create(execCxt) ;
}
if ( false )
// Old (ARQ 1) way - not recommended.
return buildSyntax(input, nodeVar, pattern, execCxt) ;
// Better
// Build a SPARQL algebra expression
Var var2 = createNewVar() ; // Hidden variable
BasicPattern bp = new BasicPattern() ;
Triple t = new Triple(nodeVar, RDFS.label.asNode(), var2) ;
bp.add(t) ;
OpBGP op = new OpBGP(bp) ;
Expr regex = new E_Regex(new ExprVar(var2.getName()), pattern, "i") ;
Op filter = OpFilter.filter(regex, op) ;
// ---- Evaluation
if ( true )
{
// Use the reference query engine
// Create a table for the input stream (so it uses working memory at this point,
// which is why this is not the preferred way).
// Then join to expression for this stage.
Table table = TableFactory.create(input) ;
Op op2 = OpJoin.create(OpTable.create(table), filter) ;
return Algebra.exec(op2, execCxt.getDataset()) ;
}
// Use the default, optimizing query engine.
return QC.execute(filter, input, execCxt) ;
}
示例28
@Override
public OpExecutor create(ExecutionContext execCxt) {
return new OpExecutorAlt(execCxt) ;
}
示例29
public OpExecutorAlt(ExecutionContext execCxt) {
super(execCxt) ;
}