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;
            }

...