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

时间:2015-07-30 15:40:50

标签: rdf sparql jena dbpedia virtuoso

我通过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") )
}

我通过这个函数在Jena中执行我的查询:

    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的SP​​ARQL端点上执行查询时,结果是21482,但Jena返回的结果是9586。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

正如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>  .
   }
相关问题