У меня есть куча кода, который использует API-интерфейс построения запросов Apache Jena (класс SelectBuilder
). Я пытаюсь добавить такой термин в свой существующий запрос SPARQL:
(?a ?b ?c) :hasMagicProperty ?this .
Я убедился, что этот запрос работает в TopBraid, но не могу понять, как представить (?a, ?b, ?c)
в Jena API. Что мне нужно сделать, чтобы преобразовать этот список 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