问题描述
我正在使用 Jena-extras 中的 Jena 查询构建器,我想知道是否可以将 SERVICE 子句添加到 SelectBuilder 对象中。
我现在的代码是这样的:
SelectBuilder builder = new SelectBuilder()
.addPrefix( "rdf","http://www.w3.org/1999/02/22-rdf-Syntax-ns#" )
.addPrefix("dbo","http://dbpedia.org/ontology/")
.addVar("?uri")
.addWhere("?uri","rdf:type","dbo:Company")
.setLimit(100);
Query query = builder.build();
System.out.println(query);
输出这个:
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-Syntax-ns#>
SELECT ?uri
WHERE
{ ?uri rdf:type dbo:Company}
LIMIT 100
我还尝试在调用 builder.build() 后将 SERVICE 子句添加到 Query 对象,但似乎只能通过使用 body.addElement(new ElementService("http://any.domain/sparql",elementBlock))
的 ARQ API 来实现。问题是你无法从 Query 对象或 SelectBuilder 对象中获取 elementBlock。
有没有办法使用查询构建器添加 SERVICE 子句,或者是否有已知的解决方法,而无需求助于详细的 ARQ API,或者我应该尝试自己扩展 SelectBuilder API?
解决方法
对于遇到同样问题的人,我问了给我有用提示的开发人员(谢谢你,Andy Seaborne),解决方案似乎如下:
SelectBuilder builder = new SelectBuilder()
.addPrefix( "rdf","http://www.w3.org/1999/02/22-rdf-syntax-ns#" )
.addPrefix("dbo","http://dbpedia.org/ontology/")
.addVar("?uri")
.addWhere("?uri","rdf:type","dbo:Company")
.setLimit(100);
Query query = builder.build();
ElementGroup body = new ElementGroup();
body.addElement(new ElementService("http://dbpedia.org/sparql",query.getQueryPattern()));
query.setQueryPattern(body);
System.out.println(query);
此代码输出以下查询:
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT ?uri
WHERE
{ SERVICE <http://dbpedia.org/sparql>
{ ?uri rdf:type dbo:Company}
}
LIMIT 100
遗憾的是,这不是查询构建器的开箱即用 API 的一部分,但任何精明的 Java 工程师都可以为此编写扩展程序或帮助程序。