[英]jena.query.ResultSet: hasNext() evaluates false but should contain something
[英]jena.query.ResultSet and jena.query.QuerySolution: hasNext() returns alway false after SPARQL request
我在接收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
此查詢在DBPedia
Endpoint
可以正常工作。
使用Jena
如下執行此查詢。
成功代碼:
...
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;
}
...
SPARQL
Endpoint
沒有問題,因為我可以從SPARQL
Query
獲得結果。 但是,使用Jena
無法獲得任何結果。 如前所述,即使響應不應該為empty
, rs.hasNext()
始終返回false
。 rs.hasNext()
無法正常工作並且無法將resultSetList
添加到resultSetList
什么?
我認為使用Jena
方式很好...有什么問題嗎?
您沒有提供完整而最少的示例,因此很難確切了解代碼中出了什么問題。 您的查詢甚至都沒有使用Jena進行解析,因此我不確定為什么您不只是得到一個錯誤,而不是一個空的結果集。 這是一個使用查詢的最小示例:
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.ResultSet;
public class DBpediaExample {
public static void main(String[] args) {
String query = "" +
"PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n" +
"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n" +
"SELECT ?s ?sl <http://dbpedia.org/property/name> ?o ?ol\n" +
"FROM <http://en.dbpedia.org/20120601/>\n" +
"WHERE {\n" +
" ?s rdfs:label ?sl .\n" +
" ?s <http://dbpedia.org/property/name> ?o .\n" +
" ?o rdfs:label ?ol .\n" +
" FILTER ( lang(?sl)= \"en\" && lang(?ol)= \"en\" )\n" +
"}\n" +
"LIMIT 100";
ResultSet rs = QueryExecutionFactory.sparqlService( "http://dbpedia.org/sparql", query ).execSelect();
while ( rs.hasNext() ) {
System.out.println( rs.next() );
}
}
}
Exception in thread "main" com.hp.hpl.jena.query.QueryParseException: Encountered " <IRIref> "<http://dbpedia.org/property/name> "" at line 3, column 15.
Was expecting one of:
<VAR1> ...
<VAR2> ...
"from" ...
"where" ...
"(" ...
"{" ...
at com.hp.hpl.jena.sparql.lang.ParserSPARQL11.perform(ParserSPARQL11.java:102)
at com.hp.hpl.jena.sparql.lang.ParserSPARQL11.parse$(ParserSPARQL11.java:53)
at com.hp.hpl.jena.sparql.lang.SPARQLParser.parse(SPARQLParser.java:37)
at com.hp.hpl.jena.query.QueryFactory.parse(QueryFactory.java:139)
at com.hp.hpl.jena.query.QueryFactory.create(QueryFactory.java:79)
at com.hp.hpl.jena.query.QueryFactory.create(QueryFactory.java:52)
at com.hp.hpl.jena.query.QueryFactory.create(QueryFactory.java:40)
at com.hp.hpl.jena.query.QueryExecutionFactory.sparqlService(QueryExecutionFactory.java:358)
at com.hp.hpl.jena.query.QueryExecutionFactory.sparqlService(QueryExecutionFactory.java:345)
at DBpediaExample.main(DBpediaExample.java:19)
即使Virtuoso接受了它,也不能像在投影變量中那樣使用URI引用。 這不是合法的SPARQL,您可以使用sparql.org的查詢驗證器進行檢查。
我不確定為什么要在查詢中使用FROM
,但是如果您實際上將IRI放入公共端點的“默認數據集名稱(圖形IRI)”字段,則不會得到任何結果。 也許您想查詢標准數據集?
另一個問題是,您實際上應該使用langMatches
比較語言標簽。
如果解決了這些問題,最終將得到以下查詢和代碼,這些查詢和代碼將顯示大量結果。
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.ResultSet;
public class DBpediaExample {
public static void main(String[] args) {
String query = "" +
"PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n" +
"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n" +
"SELECT ?s ?sl (<http://dbpedia.org/property/name> as ?p) ?o ?ol\n" +
"WHERE {\n" +
" ?s rdfs:label ?sl .\n" +
" ?s <http://dbpedia.org/property/name> ?o .\n" +
" ?o rdfs:label ?ol .\n" +
" FILTER ( langMatches(lang(?sl),'en') && langMatches(lang(?ol),'en') )\n" +
"}\n" +
"LIMIT 100";
ResultSet rs = QueryExecutionFactory.sparqlService( "http://dbpedia.org/sparql", query ).execSelect();
while ( rs.hasNext() ) {
System.out.println( rs.next() );
}
}
}
( ?p = <http://dbpedia.org/property/name> ) ( ?sl = "1990–91 NOFV-Oberliga"@en ) ( ?s = <http://dbpedia.org/resource/1990%E2%80%9391_NOFV-Oberliga> ) ( ?o = <http://dbpedia.org/resource/Jens_Dowe> ) ( ?ol = "Jens Dowe"@en )
( ?p = <http://dbpedia.org/property/name> ) ( ?sl = "1. FC Heidenheim"@en ) ( ?s = <http://dbpedia.org/resource/1._FC_Heidenheim> ) ( ?o = <http://dbpedia.org/resource/Kevin_Kraus> ) ( ?ol = "Kevin Kraus"@en )
( ?p = <http://dbpedia.org/property/name> ) ( ?sl = "1905–06 FC Barcelona season"@en ) ( ?s = <http://dbpedia.org/resource/1905%E2%80%9306_FC_Barcelona_season> ) ( ?o = <http://dbpedia.org/resource/Carles_Comamala> ) ( ?ol = "Carles Comamala"@en )
( ?p = <http://dbpedia.org/property/name> ) ( ?sl = "1910–11 FC Barcelona season"@en ) ( ?s = <http://dbpedia.org/resource/1910%E2%80%9311_FC_Barcelona_season> ) ( ?o = <http://dbpedia.org/resource/Carles_Comamala> ) ( ?ol = "Carles Comamala"@en )
( ?p = <http://dbpedia.org/property/name> ) ( ?sl = "1910–11 FC Barcelona season"@en ) ( ?s = <http://dbpedia.org/resource/1910%E2%80%9311_FC_Barcelona_season> ) ( ?o = <http://dbpedia.org/resource/Francisco_Bru> ) ( ?ol = "Francisco Bru"@en )
( ?p = <http://dbpedia.org/property/name> ) ( ?sl = "1. FC Heidenheim"@en ) ( ?s = <http://dbpedia.org/resource/1._FC_Heidenheim> ) ( ?o = <http://dbpedia.org/resource/Michael_Thurk> ) ( ?ol = "Michael Thurk"@en )
( ?p = <http://dbpedia.org/property/name> ) ( ?sl = "1990–91 NOFV-Oberliga"@en ) ( ?s = <http://dbpedia.org/resource/1990%E2%80%9391_NOFV-Oberliga> ) ( ?o = <http://dbpedia.org/resource/Hilmar_Weilandt> ) ( ?ol = "Hilmar Weilandt"@en )
…
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.