我试图用JAVA中的apache jena来获取选择查询计数的结果,但这是行不通的。
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进行选择计数查询的示例,或者查找我的代码有什么问题。
谢谢!
答案 0 :(得分:0)
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
)。效率更高。