下面是用于获取美国位置的sparql查询,当我在virtualoaso sparql上运行此代码时,我会得到所需的输出。但是当我用java编写这段代码时,它并没有给出输出。
select (str(?label) as ?strLabel) where {
?place a dbpedia-owl:PopulatedPlace ;
dbpedia-owl:country dbpedia:United_States ;
rdfs:label ?label
filter langMatches( lang(?label), 'en' )`
}
limit 100
据我所知,我写了它,但没有给出任何结果。
public class TestDbpedia {
public static void main(String[] args) {
String sparqlQueryString = " select (str(?label) as ?strLabel) "+
"where {"+
"?place a dbpedia-owl:PopulatedPlace ;"+
"dbpedia-owl:country dbpedia:United_States ;"+
"rdfs:label ?label"+
"filter langMatches( lang(?label), 'en' )"+
"limit 10"+
"}";
Query query = QueryFactory.create(sparqlQueryString);
QueryExecution qexec = QueryExecutionFactory.sparqlService("http://dbpedia.org/sparql", query);
try {
ResultSet results = qexec.execSelect();
for ( ; results.hasNext() ; )
{
QuerySolution soln = results.nextSolution() ;
System.out.println(soln.get("?strLabel"));
}
}
catch(Exception e){
e.printStackTrace();
}
finally { qexec.close(); }
}
}
您需要声明前缀
首先,您需要在SPARQL查询中包含必要的前缀。也就是说,你需要写
prefix dbpedia-owl: <http://dbpedia.org/ontology/>
以及查询开始时的其余部分。据我所知,预定义的前缀只适用于使用基于浏览器的web界面进行的查询。
您需要使用一些空格或换行符
当您从字符串构造查询时,您需要非常小心地使用换行符和空格等。例如,Java行
"rdfs:label ?label"+
"filter langMatches( lang(?label), 'en' )"+
最终会给你一个包含的查询字符串
rdfs:label ?labelfilter langMatches( lang(?label), 'en' )
您最终得到一个无效的查询。在字符串中添加一些空格或换行符。
您需要编写一个正确的查询
您的查询没有正确结束。你有
"filter langMatches( lang(?label), 'en' )"+
"limit 10"+
"}";
这将给你(一旦你添加了一些换行符和空格):
filter …
limit 10
}
这不是正确的语法。你需要
filter …
}
limit 10
如果没有收到有用的错误消息,请打印并检查您的查询
我很惊讶DBpedia没有给你一个更有用的错误消息(或者它确实给了你;毕竟你没有向我们展示堆栈竞争)。您也可以在sparql.org的查询验证器上测试您的查询。此外,如果您使用了Jena的ParameterizedSparqlStrings之一,那么您可能已经预先解析了查询,这应该会发现语法错误。