我通过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的SPARQL端点上执行查询时,结果是21482,但Jena返回的结果是9586。
有什么想法吗?
答案 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> .
}