带参数的ParameterizedSparqlString查询

时间:2017-05-31 00:29:32

标签: java sparql

以下查询用于从dbpedia获取“abstract”属性。当我使用res:Zeke_Rowe而不是?name这样的特定名称时,它会起作用。我想将值传递给?name变量。 sparql查询如下:

ParameterizedSparqlString abstractQuery = new ParameterizedSparqlString(
"PREFIX res:  <http://dbpedia.org/resorce/> "
+"PREFIX dbo: <http://dbpedia.org/ontology/> "
+"SELECT ?abstract WHERE { "
+"?name dbo:abstract ?abstract. "
+"FILTER (lang(?abstract)='en')}");

我试过这个:

 abstractQuery.setLiteral("name", "res:Zeke_Rowe");
 Query query = QueryFactory.create(abstractQuery.toString());

但它不起作用,我得到NoSuchElementException

我也试过了:

 Node node = NodeFactory.createLiteral("res:Zeke_Rowe");
 abstractQuery.setParam("name",node);
 Query query = QueryFactory.create(abstractQuery.toString());

失败。有相同的例外...

两种方式都将这样的名称res:Zeke_Rowe插入到sparql查询中"res:Zeke_Rowe" ..

最后,我运行这样的查询:

ResultSetFactory.copyResults(QueryExecutionFactory.sparqlService("http://dbpedia.org/sparql",query).execSelect());
我在做错了什么?

1 个答案:

答案 0 :(得分:0)

RDF三元组中的主题从不是文字,因此,res:Zeke_Rowe 一个文字,不知道为什么总是调用setLiteral resp。 createLiteral。它是一个URI,可以是前缀(res:Zeke_Rowe)或完整(http://dbpedia.org/resource/Zeke_Rowe)。

abstractQuery.setIri("name", "http://dbpedia.org/resource/Zeke_Rowe");

Node node = NodeFactory.createIRI("http://dbpedia.org/resource/Zeke_Rowe");
abstractQuery.setParam("name", node);