我正在尝试根据给定查询构建一个新查询(旧查询——我无法更改)。
假设我得到一个简单有效的 SPARQL 查询,SELECT ?s WHERE{ ?s ?p ?o }
. 假设我制作了上述查询的耶拿查询对象,并将查询模式作为 Java 中的 ElementGroup 获取,如下所示:
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。那么,如何避免这个问题呢?如果所有三元组都有关闭期,则不会出现此问题,但我似乎找不到任何方法来完成这项工作。
谢谢!