Java jena.query.ResultSet和jena.query.QuerySolution:hasNext()在SPARQL请求后始终返回false
我在接收Java jena.query.ResultSet和jena.query.QuerySolution:hasNext()在SPARQL请求后始终返回false,java,rdf,sparql,jena,Java,Rdf,Sparql,Jena,我在接收SPARQL响应时遇到问题。 问题是。。。。使用以下源代码时,rs.hasNext()始终返回false,即使响应不应为空 SPARQL查询: PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> SELECT ?s ?sl <http://dbpedia.org/property/name
SPARQL
响应时遇到问题。
问题是。。。。使用以下源代码时,rs.hasNext()
始终返回false,即使响应不应为空
SPARQL查询:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?s ?sl <http://dbpedia.org/property/name> ?o ?ol
FROM <http://en.dbpedia.org/20120601/>
WHERE {
?s rdfs:label ?sl .
?s <http://dbpedia.org/property/name> ?o .
?o rdfs:label ?ol .
FILTER ( lang(?sl)= "en" && lang(?ol)= "en" ) }
LIMIT 100
SPARQL
Endpoint
中没有问题,因为我可以从SPARQL
查询中获得结果。
但是,我无法使用Jena
获得任何结果。
正如我提到的,rs.hasNext()
始终返回false
,即使响应不应该是空的
。
如果rs.hasNext()
不起作用,并且无法将内容添加到resultSetList
,该问题的解决方案是什么
我认为使用Jena的方法很好。。。有什么问题吗?您没有提供一个完整的、最少的示例,因此很难确切地看出代码中出现了什么问题。您的查询甚至不使用Jena进行解析,所以我不确定为什么您不只是得到一个错误,而不是一个空的结果集。下面是一个使用您的查询的简单示例:
import com.hp.hpl.jena.query.QueryExecutionFactory;
导入com.hp.hpl.jena.query.ResultSet;
公共类dbc示例{
公共静态void main(字符串[]args){
字符串查询=“”+
“前缀rdf:\n”+
“前缀rdfs:\n”+
“选择?s?sl?o?ol\n”+
“来自\n”+
“其中{\n”+
“?s rdfs:标签?sl。\n”+
“?s?o。\n”+
“?o rdfs:标签?ol。\n”+
“筛选器(lang(?sl)=\'en\”和&lang(?ol)=\'en\”\n”+
“}\n”+
“限额100”;
ResultSet rs=QueryExecutionFactory.sparqlService(“http://dbpedia.org/sparql,查询)。execSelect();
while(rs.hasNext()){
System.out.println(rs.next());
}
}
}
线程“main”com.hp.hpl.jena.query.QueryParseException中的异常:在第3行第15列遇到“”。
我期待的是:
...
...
“从”。。。
“哪里”。。。
"(" ...
"{" ...
位于com.hp.hpl.jena.sparql.lang.ParserSPARQL11.perform(ParserSPARQL11.java:102)
位于com.hp.hpl.jena.sparql.lang.ParserSPARQL11.parse$(ParserSPARQL11.java:53)
位于com.hp.hpl.jena.sparql.lang.SPARQLParser.parse(SPARQLParser.java:37)
位于com.hp.hpl.jena.query.QueryFactory.parse(QueryFactory.java:139)
位于com.hp.hpl.jena.query.QueryFactory.create(QueryFactory.java:79)
在com.hp.hpl.jena.query.QueryFactory.create上(QueryFactory.java:52)
位于com.hp.hpl.jena.query.QueryFactory.create(QueryFactory.java:40)
在com.hp.hpl.jena.query.QueryExecutionFactory.sparqlService(QueryExecutionFactory.java:358)
在com.hp.hpl.jena.query.QueryExecutionFactory.sparqlService(QueryExecutionFactory.java:345)上
位于DBpediaExample.main(DBpediaExample.java:19)
即使Virtuoso接受URI引用,也不能像现在这样在投影变量中使用URI引用。这不是合法的SPARQL,您可以使用检查
我不确定您为什么在查询中使用FROM
,但如果您实际将该IRI放入公共端点的“默认数据集名称(图形IRI)”字段中,则不会得到任何结果。也许您希望改为查询标准数据集
另外,您应该使用langMatches
来比较语言标记
如果您解决了这些问题,您将得到以下查询和代码,其中显示了大量结果
import com.hp.hpl.jena.query.QueryExecutionFactory;
导入com.hp.hpl.jena.query.ResultSet;
公共类dbc示例{
公共静态void main(字符串[]args){
字符串查询=“”+
“前缀rdf:\n”+
“前缀rdfs:\n”+
“选择s?sl(作为p)?o?ol\n”+
“其中{\n”+
“?s rdfs:标签?sl。\n”+
“?s?o。\n”+
“?o rdfs:标签?ol。\n”+
筛选器(langMatches(lang(?sl),'en')&langMatches(lang(?ol),'en'))\n+
“}\n”+
“限额100”;
ResultSet rs=QueryExecutionFactory.sparqlService(“http://dbpedia.org/sparql,查询)。execSelect();
while(rs.hasNext()){
System.out.println(rs.next());
}
}
}
(?p=)(?sl=“1990–91 NOFV Oberliga”@en)(?s=)(?o=)(?ol=“Jens Dowe”@en)
(?p=)(?sl=“1.FC Heidenheim”@en)(?s=)(?o=)(?ol=“Kevin Kraus”@en)
(?p=)(?sl=“1905–06巴塞罗那赛季”@en)(?s=)(?o=)(?ol=“Carles Comamala”@en)
(?p=)(?sl=“1910–11巴萨赛季”@en)(?s=)(?o=)(?ol=“Carles Comamala”@en)
(?p=)(?sl=“1910–11巴萨赛季”@en)(?s=)(?o=)(?ol=“弗朗西斯科布鲁”@en)
(?p=)(?sl=“1.FC Heidenheim”@en)(?s=)(?o=)(?ol=“Michael Thurk”@en)
(?p=)(?sl=“1990–91 NOFV Oberliga”@en)(?s=)(?o=)(?ol=“Hilmar Weilandt”@en)
…
请注意,lang(?sl)=“en”和&lang(?ol)=“en”
并不是比较语言标记的正确方法。例如,使用langMatches(lang(?sl),“en”)
。还有一点,你的查询是不合法的。如果Jena对它做了一些意想不到的事情,我不会感到惊讶。你不能将URI引用放在这样的投影变量列表中,即使Virtuoso没有抱怨。你可以使用验证你的查询。
...
QueryEngineHTTP qexec = new QueryEngineHTTP("http://dbpedia.org/sparql", query));
// "query" is as above
qexec.addDefaultGraph(http://en.dbpedia.org/20120601/);
List<QuerySolution> resultSetList = new ArrayList<QuerySolution>();
ResultSet rs = qexec.execSelect();
while (rs.hasNext())
resultSetList.add(rs.next());
if (!resultSetList.isEmpty()) {
if (query.contains("?o rdfs:label ?ol")) {
func...1
func...2
}
else {
func...3
func...4
}
}
else {
qexec.close();
break;
}
...