2017-09-10 4 views
0

Comme le titre le décrit clairement, nous resultset.hasNext() retourne false de façon inattendue.Wikidata - resultset.hasNext() renvoie false bien que les résultats soient récupérés

Voici mon code source SPARQL et Java basée sur Jena:

SELECT ?s ?label WHERE { ?s rdfs:label ?label. FILTER(CONTAINS(LCASE(?label), "university"@en)). } LIMIT 5 

Query query = QueryFactory.create(PREFIX + sparqlQuery); 
QueryExecution queryExecution = QueryExecutionFactory.sparqlService("https://query.wikidata.org/sparql", PREFIX + sparqlQuery); 
try { 
    ResultSet results = queryExecution.execSelect(); 
    ResultSetFormatter.out(System.out, results, query); 
    while (results.hasNext()) { // returns false 
     QuerySolution querySolution = results.next(); 
     System.out.println(querySolution.getResource("s")); 
    } 
} catch (Exception ex) { 
    System.err.println(ex.getMessage()); 
} finally { 
    queryExecution.close(); 
} 

est ici la sortie:

------------------------------------------------------ 
| s  | label         | 
====================================================== 
| wd:Q1060 | "Technical University of Hamburg"@en | 
| wd:Q1060 | "Technical University of Hamburg"@en-ca | 
| wd:Q1060 | "Technical University of Hamburg"@en-gb | 
| wd:Q1060 | "Technical University of Hamburg"@nl | 
| wd:Q4027 | "Jean Moulin University Lyon 3"@en  | 
------------------------------------------------------ 

Répondre

5

Vous ne pouvez itérer une fois sur la Resultset, et cela se produit déjà dans la méthode pratique ResultSetFormatter.out(...)

Je ne sais pas si vous avez vraiment besoin de traiter la ResultSet deux fois, mais le cas échéant, vous pouvez créer un ResultSetRewindable qui permet de réinitialiser le curseur:

Query query = QueryFactory.create(PREFIX + sparqlQuery); 
QueryExecution queryExecution = QueryExecutionFactory.sparqlService("https://query.wikidata.org/sparql", PREFIX + sparqlQuery); 
try { 
    ResultSet rs = queryExecution.execSelect(); 
    ResultSetRewindable results = ResultSetFactory.copyResults(rs); 
    ResultSetFormatter.out(System.out, results, query); 
    results.reset(); 
    while (results.hasNext()) { // returns false 
     QuerySolution querySolution = results.next(); 
     System.out.println(querySolution.getResource("s")); 
    } 
} catch (Exception ex) { 
    System.err.println(ex.getMessage()); 
} finally { 
    queryExecution.close(); 
} 
+0

Je ne savais pas que le curseur est pas remis à zéro après l'appel 'ResultSetFormatter.out()' méthode. – talha06