所以我有这段 Jena 代码,它基本上尝试使用 a 构建查询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)
))
现在我将如何评估每个三元组的执行情况?在这种情况下,如果我只想在查询模式执行的每一步打印结果数,我该怎么做?我确实在这里阅读了一些示例。我想必须使用 anOpExecutor
和 aQueryIterator
但我不确定它们是如何组合在一起的。在这种情况下,我只想遍历每个基本图形模式,然后输出基本图形模式和它从终点返回的结果数量。任何帮助或指示将不胜感激。