我试图构建一个基于给定查询(旧查询 - 我无法更改此)的新查询。不存在'。'导致添加三元组后的解析错误Jena ElementGroup
假设我有一个简单有效的SPARQL查询,SELECT ?s WHERE{ ?s ?p ?o }
。比方说,我作出上述查询的耶拿查询对象,并获取查询模式作为ElementGroup在Java中,如下所示:
Query q = QueryFactory.create("SELECT ?s WHERE{ ?s ?p ?o }, Syntax.syntaxSPARQL_11);
ElementGroup oldQP = (ElementGroup)q.getQueryPattern();
我增加新的三元旧查询模式的方式之前,使用以下语法:
Triple t = Triple.create(...);
oldQP.addTriplePattern(t);
然而,当你去创建新的查询对象:
Query nq = q.cloneQuery();
nq.setQueryPattern(oldQP);
nq.setQuerySelectType();
nq.setQueryResultStar(false);
nq.addResultVar("s");
你有一个查询看起来像
结束SELECT ?s WHERE{
?s ?p ?o
?s2 ?p2 ?s.
}
因为它不能识别/关心第一个三元组没有以设定对象的QueryPattern的时段结束。这会导致查询运行时出现分析错误...
Encountered " <VAR1> "?s2 "" at line 10, column 3.
Was expecting one of:
"graph" ...
"optional" ...
"minus" ...
"bind" ...
"service" ...
"let" ...
"exists" ...
"not" ...
"filter" ...
"{" ...
"}" ...
";" ...
"," ...
"." ...
因为这显然是无效的SPARQL。那么,如何避免这个问题呢?如果所有三元组都有关闭期,则不会发生此问题,但我似乎无法找到任何方法来完成此项工作。
谢谢!
re:Missing。 旧bug - 修正(至少在开发代码库中)。 – AndyS 2013-07-24 20:48:24
@AndyS RobV的答案表明它也是已知的,也是老的。我只是想在这里找到一个完整的工作示例,以满足任何其他人的需求。现在他们可以看到他们应该做什么。 – 2013-07-24 21:20:52