如何使用Apache Jena获得“选择计数(*)”查询的结果?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Apache Jena获得“选择计数(*)”查询的结果?相关的知识,希望对你有一定的参考价值。
我尝试了多次在JAVA中使用apache jena获取select查询计数的结果,但它不起作用。
select count(*) where {
?s dbo:award ?o.
?o rdf:type ?C.
FILTER
regex(?C,"http://dbpedia.org/ontology/Award")}
端点中此查询的结果是33767
所以我在java中创建了这段代码以获得结果。
public int CR() {
int CR=0;
String ch="http://dbpedia.org/ontology/";
String service="http://dbpedia.org/sparql";
String query="PREFIX dbo:<http://dbpedia.org/ontology/>"
+ "PREFIX : <http://dbpedia.org/resource/>"
+ "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>"
+ "PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>"
+"select * where { "
+"?s dbo:award ?o."
+"?o rdf:type ?C."
+"FILTER"
+"regex(?C,"http://dbpedia.org/ontology/Award")}";
QueryExecution qe=QueryExecutionFactory.sparqlService(service, query);
ResultSet rs=qe.execSelect();
while (rs.hasNext()){
QuerySolution s=rs.nextSolution();
CR++;
System.out.println(CR);
}
;
return CR;
}
我在控制台中得到的结果不超过10000。
.
.
9992
9993
9994
9995
9996
9997
9998
9999
10000
我需要一个使用apache jena的select count查询的示例,或者找到我的代码有什么问题。
谢谢 !
答案
与许多开放的sparql端点一样,Dbpedia virtuoso对返回的结果数量有限制。使用LIMIT
和OFFSET
分批获得结果。这将为您提供第二批10000:
SELECT * WHERE {
?s dbo:award ?o .
?o rdf:type ?C .
FILTER STRSTARTS(STR(?C), "http://dbpedia.org/ontology/Award")
}
LIMIT 10000
OFFSET 10000
重复偏移0,10000,20000等,直到结果为空。
PS。由于您的过滤器实际上匹配完整类型URI,因此您可以完全删除过滤器并在第二个条件下简单地匹配?o rdf:type <http://dbpedia.org/ontology/Award>
(或等效地:?o rdf:type dbo:Award
)。效率更高。
以上是关于如何使用Apache Jena获得“选择计数(*)”查询的结果?的主要内容,如果未能解决你的问题,请参考以下文章
java 使用Apache Jena的API(不是RESTful API)从RDF数据构建数据库并回答Java中的SPARQL查询