如何使用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对返回的结果数量有限制。使用LIMITOFFSET分批获得结果。这将为您提供第二批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查询

无法更改 Apache Jena 日志记录级别(使用 log4J2)

搭建Jena Fuseki并执行SPARQL查询

Jena Fuseki 服务器命令未找到

Jena+fuseki

Jena:如何推断数据/性能问题