我有一堆使用 Apache Jena querybuilder API(SelectBuilder
类)的代码。我正在尝试将这样的术语添加到现有的 SPARQL 查询中:
(?a ?b ?c) :hasMagicProperty ?this .
我已经验证此查询在 TopBraid 中有效,但我无法弄清楚如何在 Jena API 中表示 (?a, ?b, ?c)
。我需要做什么才能将此 Vars 列表转换为有效的 Jena 资源节点?
我愿意探索替代的 SPARQL 构建框架,如果它们对类型化文字、IRI 和过滤器以及此列表构造具有强大的支持。我浏览了几个用于构建 SPARQL 查询的其他框架,但它们似乎都没有列表结构。
编辑
我的查询构建代码(在 Groovy 中)看起来像这样:
def selectBuilder = new SelectBuilder()
selectBuilder.addPrefixes(...)
def thisVar = Var.alloc('this')
selectBuilder.addOptional(thisVar, 'rdf:type', ':MyEntity')
def aVar = Var.alloc('a')
def bVar = Var.alloc('b')
def cVar = Var.alloc('c')
List<Var> abc = [aVar, bVar, cVar]
//this doesn't work!!!
selectBuilder.addWhere(abc, ':hasMagicProperty', thisVar)
selectBuilder.addWhere(aVar, ':hasACode', 'code A')
selectBuilder.addWhere(bVar, ':hasBCode', 'code B')
selectBuilder.addWhere(cVar, ':hasCCode', 'code C')
def sparqlQuery = selectBuilder.buildString()
我花了几个小时尝试使用 RDFList 类,但我还没有弄清楚。我会继续努力,看看我能不能捕获它。同时,如有任何帮助,我们将不胜感激。 :)
编辑
这是使用 RDFList 的不成功尝试:
//this code does not work!
def varNode = NodeFactory.createVariable('a')
def model = ModelFactory.createDefaultModel()
def rdfNode = model.asRDFNode(varNode)
def rdfList = new RDFListImpl(model.createResource().asNode(), model)
//this line throws an exception!!
rdfList.add(rdfNode)
selectBuilder.addWhere(rdfList, ':hasMagicProperty', thisVar)
//com.hp.hpl.jena.shared.PropertyNotFoundException: http://www.w3.org/1999/02/22-rdf-syntax-ns#rest
最佳答案
以下方法是一种解决方法,使用多个三元组递归地构建 RDF 列表:
/*
* Jena querybuilder does not yet support RDF lists. See:
* http://www.w3.org/TR/2013/REC-sparql11-query-20130321/#collections
*/
private Node buildRdfCollection(SelectBuilder queryBuilder, List<?> itemList) {
if (itemList.isEmpty()) {
return RDF.nil.asNode()
}
def head = itemList.first()
def rest = buildRdfCollection(queryBuilder, itemList.subList(1, itemList.size()))
def listNode = NodeFactory.createAnon()
queryBuilder.addWhere(listNode, RDF.first, head)
queryBuilder.addWhere(listNode, RDF.rest, rest)
return listNode
}
...
def listNode = buildRdfCollection(queryBuilder, abc)
queryBuilder.addWhere(listNode, ':hasMagicProperty', thisVar)
生成的 SPARQL 代码如下所示:
_:b0 rdf:first ?c ;
rdf:rest rdf:nil .
_:b1 rdf:first ?b ;
rdf:rest _:b0 .
_:b2 rdf:first ?a ;
rdf:rest _:b1 ;
:hasMagicProperty ?this .
这是一个冗长的相当于:
(?a ?b ?c) :hasMagicProperty ?this .
关于java - 如何使用 jena querybuilder 构建 SPARQL 列表输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33351102/