下面是用于获取处于联合状态的场所的sparql查询,当我在virtuoaso 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(); }
}
}
答案 0 :(得分:3)
首先,您需要在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's query validator测试您的查询。此外,如果您使用Jena的ParameterizedSparqlStrings之一,您可以预先解析查询,这应该已经捕获了语法错误。