所以我有一段Jena代码,基本上尝试使用Triple
ElementTriplesBlock
构建查询,最后使用QueryFactory.make()
。现在我设置了本地Virtuoso实例,因此我的SPARQL端点是localhost。即只http://localhost:8890/sparql
。我查询的RDF是从Lehigh University Benchmark generator生成的。现在我试图根据一些条件替换查询模式中的三元组。也就是说,如果查询是由两个BGP或三重模式构成的,并且如果其中一个三重模式给出零结果,我想将该三重模式更改为其他模式。我如何在耶拿实现这一目标? 。我的代码看起来像
//Create your triples
Triple pattern1 = Triple.create(Var.alloc("X"),Node.createURI("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"),Node.createURI("http://swat.cse.lehigh.edu/onto/univ-bench.owl#AssociateProfessor"));
Triple pattern = Triple.create(Var.alloc("X"), Node.createURI("http://swat.cse.lehigh.edu/onto/univ-bench.owl#emailAddress"), Var.alloc("Y2"));
ElementTriplesBlock block = new ElementTriplesBlock();
block.addTriple(pattern1);
block.addTriple(pattern);
ElementGroup body = new ElementGroup();
body.addElement(block);
//Build a Query here
Query q = QueryFactory.make();
q.setPrefix("ub", "http://swat.cse.lehigh.edu/onto/univ-bench.owl#");
q.setQueryPattern(body);
q.setQuerySelectType();
q.addResultVar("X");
//?X ub:emailAddress ?Y2 .
//Query to String
System.out.println(q.toString());
QueryExecution qexec = QueryExecutionFactory.sparqlService("http://localhost:8890/sparql", q);
Op op = Algebra.optimize(Algebra.compile(q));
System.out.println(op.toString());
所以要清楚我能够通过使用Op op = Algebra.optimize(Algebra.compile(q))
行实际看到关系代数形式的BGP。输出看起来像
(project (?X)
(bgp
(triple ?X <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://swat.cse.lehigh.edu/onto/univ-bench.owl#AssociateProfessor>)
(triple ?X <http://swat.cse.lehigh.edu/onto/univ-bench.owl#emailAddress> ?Y2)
))
现在我将如何评估每个三元组的执行情况?在这种情况下,如果我只想在查询模式执行的每一步打印结果数量,我该怎么做?我确实阅读了一些例子here。我想我必须使用OpExecutor
和QueryIterator
,但我不确定它们是如何组合在一起的。在这种情况下,我只想迭代每个基本图形模式,然后输出基本图形模式和它从结束点返回的结果数。任何帮助或指示将不胜感激。