我是查询DBPedia的新手。如何从http://dbpedia.org/sparql获得所有公司?
此查询仅返回50'000个组织:
SELECT DISTINCT * WHERE {?company a dbpedia-owl:Company}
答案 0 :(得分:24)
您的查询没有归还所有公司,这是对的。但是,模式是正确的。请注意,此查询仅对公司进行计数,返回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
这是一般方法。但是,由于对40000结果的严格限制,它在DBpedia上仍然存在问题。有一篇文档文章提到了这一点:
Working with constraints DBpedia's SPARQL endpoint MaxSortedTopRows Limits via LIMIT & OFFSET
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
答案 1 :(得分:0)
从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.}
}
这具有为您提供所有三元组的额外优势。根据您的RAM和CPU功率,它需要几分钟到几个小时。