我是第一次查询DBPedia。如何从http://dbpedia.org/sparql获取所有公司?
这个查询只返回了50,000个组织:
SELECT DISTINCT * WHERE {?company a dbpedia-owl:Company}
我是第一次查询DBPedia。如何从http://dbpedia.org/sparql获取所有公司?
这个查询只返回了50,000个组织:
SELECT DISTINCT * WHERE {?company a dbpedia-owl:Company}
你说的对,你的查询没有返回所有公司。但是模式是正确的。请注意,这个仅计算公司数量的查询返回了88054:
prefix dbpedia-owl: <http://dbpedia.org/ontology/>
select (count(distinct ?company) as ?count)
where {
?company a dbpedia-owl:Company
}
出于性能方面的考虑,我认为这是DBpedia SPARQL端点所施加的限制。你可以下载数据并在本地运行查询,但这可能比你想要的更费力。相反,您可以对结果进行排序(无论如何,只要始终按照相同方式进行排序),然后使用limit
和offset
在这些结果中进行选择。例如:
prefix dbpedia-owl: <http://dbpedia.org/ontology/>
select ?company
where {
?company a dbpedia-owl:Company
}
order by ?company
limit 10
prefix dbpedia-owl: <http://dbpedia.org/ontology/>
select ?company
where {
?company a dbpedia-owl:Company
}
order by ?company
limit 10
offset 5823
这是一般的方法。但是,由于DBpedia上的40000个结果硬限制仍存在问题。有一个文档详细说明了这一点:
通过LIMIT和OFFSET处理约束条件DBpedia的SPARQL端点MaxSortedTopRows限制的技巧
DBpedia SPARQL端点通过以下INI设置进行配置:
MaxSortedTopRows = 40000
上述设置为排序行设置了一个阈值。
为了避免上述问题,可以利用子查询的使用:
它更好地利用了与这种查询相关联的临时存储。一个例子如下:
SELECT ?p ?s WHERE { { SELECT DISTINCT ?p ?s FROM <http://dbpedia.org> WHERE { ?s ?p <http://dbpedia.org/resource/Germany> } ORDER BY ASC(?p) } } OFFSET 50000 LIMIT 1000
我不完全确定为什么这种方法可以解决问题,也许是因为端点可以对超过40000行进行排序,只要它不必返回所有行。无论如何,它确实有效。你的查询将变成:
prefix dbpedia-owl: <http://dbpedia.org/ontology/> select ?company {{ select ?company { ?company a dbpedia-owl:Company } order by ?company }} offset 88000 LIMIT 1000
从DBpedia获取所有公司的另一种方法是使用 RDFSlice运行以下查询:
SELECT *
WHERE {
{?s a <http://dbpedia.org/ontology/Person>.?s ?p ?o.}
UNION
{?s1 a <http://dbpedia.org/ontology/Person>.?o1 ?p1 ?s1.}
}
select ?company where { ?company a dbpedia-owl:Company } order by ?company limit 10 offset 40000
- AntonSELECT ?company WHERE { { SELECT DISTINCT ?company FROM <http://dbpedia.org> WHERE { ?company a dbpedia-owl:Company } ORDER BY ASC(?company) } } LIMIT 50000
同样的查询加上偏移量50000就可以了。检查唯一性:$ cat sparql sparql\(1\) | wc -l 88056
为了确保:$ cat sparql sparql\(1\) | sort | uniq | wc -l 88055
- Anton