为什么 Virtuoso SPARQL 端点和 Jena 返回的结果不同?

why are the results returned by Virtuoso SPARQL endpoint and Jena different?

我已经通过 Virtuoso SPARQL 端点和 Jena 查询了 DBPedia,但结果不同。我的查询是:

SELECT (COUNT(DISTINCT (?v)) AS ?num)
FROM <http://dbpedia.org>
WHERE {
  ?x  <http://dbpedia.org/property/deathPlace>  ?v .
  ?v  rdf:type                                  ?t .
  FILTER STRSTARTS( STR(?t), STR("http://dbpedia.org/ontology/Place") )
}

我通过这个函数在耶拿执行我的查询:

    public static ArrayList<String> query(String queryStr) {
    ArrayList<String> result = new ArrayList<>();
    queryStr = SPARQL_PREFIX + queryStr;
    Query query = QueryFactory.create(queryStr);

    // Remote execution.
    try (QueryExecution qexec = QueryExecutionFactory.sparqlService("http://dbpedia.org/sparql", query)) {
        // Set the DBpedia specific timeout.
        ((QueryEngineHTTP) qexec).addParam("timeout", "10000");

        // Execute.
        ResultSet rs = qexec.execSelect();
        while (rs.hasNext()) {
            result.add(rs.next().toString());
        }
    } catch (Exception e) {
        e.printStackTrace();
        System.err.println("============================================");
        System.err.println(queryStr);
        System.err.println("============================================");
    }
    return result;
}

我已将图表设置为在 FROM 表达式中搜索,但结果仍然不同。当我在 Virtuoso 的 SPARQL 端点上执行查询时,结果是 21482,但 Jena 返回的结果是 9586。

有什么想法吗?

正如 AKSW 和 Taylor 在评论中提到的,DBPedia 对远程查询的限制与从其网站发起的查询的限制不同。在这种情况下,字符串匹配(这是一个代价高昂的操作)使得查询更加耗时,jena 返回的结果只是查询实际结果的一部分。

为了解决这个问题,我们可以直接使用 URI 而不是它的字符串:

SELECT  (COUNT(DISTINCT (?v)) AS ?num)
  FROM  <http://dbpedia.org>
 WHERE 
   {
     ?x  <http://dbpedia.org/property/deathPlace>  ?v   .
     ?v  rdf:type  <http://dbpedia.org/ontology/Place>  .
   }