簡體   English   中英

jena.query.ResultSet和jena.query.QuerySolution:在SPARQL請求之后hasNext()始終返回false

[英]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無法獲得任何結果。 如前所述,即使響應不應該為emptyrs.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM