我有以下情况:
Class B
有一个方法,它接收带有查询的String,然后执行它
并返回Resultset
。
Class A
创建一个SPARQL查询并调用Class B
中的方法。
问题是,当Class A
获取Resultset
对象时,它是空的!当然,因为查询已在Class B
中关闭(请参阅jena.query.ResultSet and jena.query.QuerySolution: empty iterator after SPARQL request)。
我的问题是,这怎么可以模块化?我希望有Class B
只执行SPARQL查询,而不必了解结果结构或任何内容。我希望Class B
处理查询创建和查询结束,因为Class A
没有意义。
Class B:
try {
Query query = QueryFactory.create(myQuery);
qe = QueryExecutionFactory.create(query, ontology);
ResultSet results = qe.execSelect();
return results;
} catch (...){
...
} finally {
...
qe.close();
}
答案 0 :(得分:4)
默认情况下,ResultSet
几乎总是流式传输,所以你说关闭QueryExecution
会导致ResultSet
表现为空是
您可以使用ResultSetFactory.copyResults()方法获取ResultSet
的可重复使用的内存副本,然后将其传回,例如。
ResultSet results = ResultSetFactory.copyResults(qe.execSelect());
这允许B类安全地关闭QueryExecution
并为调用代码提供非空ResultSet
,当然假设查询首先产生任何答案!