如何从DBPedia获得所有公司?

Ant*_*ton 16 sparql dbpedia

我是新来的查询DBPedia.如何从http://dbpedia.org/sparql获取所有公司?

此查询仅返回50'000个组织:

SELECT DISTINCT * WHERE {?company a dbpedia-owl:Company}
Run Code Online (Sandbox Code Playgroud)

Jos*_*lor 25

你的查询没有归还所有公司,你说得对.但是,模式是正确的.请注意,此查询仅对公司计数返回88054:

prefix dbpedia-owl: <http://dbpedia.org/ontology/>

select (count(distinct ?company) as ?count)
where {
  ?company a dbpedia-owl:Company
}
Run Code Online (Sandbox Code Playgroud)

SPARQL结果

我认为这是DBpedia SPARQL端点因性能原因而施加的限制.您可以做的一件事是下载数据并在本地运行您的查询,但这可能比您想要的工作多一点.相反,你可以订购的结果(它并不真正的问题是如何,只要你总是做同样的方式),并使用limitoffset这些结果中进行选择.例如:

prefix dbpedia-owl: <http://dbpedia.org/ontology/>

select ?company
where {
  ?company a dbpedia-owl:Company
}
order by ?company
limit 10
Run Code Online (Sandbox Code Playgroud)

SPARQL结果

prefix dbpedia-owl: <http://dbpedia.org/ontology/>

select ?company
where {
  ?company a dbpedia-owl:Company
}
order by ?company
limit 10
offset 5823
Run Code Online (Sandbox Code Playgroud)

SPARQL结果

这是一般方法.但是,由于对40000结果的严格限制,它在DBpedia上仍然存在问题.有一篇文档文章提到了这一点:

使用约束DBpedia的SPARQL端点MaxSortedTopRows限制通过LIMIT和OFFSET

DBpedia SPARQL端点配置了以下INI设置:

MaxSortedTopRows = 40000
Run Code Online (Sandbox Code Playgroud)

上面的设置为已排序的行设置阈值.

该文章提出的解决方案是使用子查询:

为了防止上述问题,您可以利用子查询来更好地利用与此类任务相关联的临时存储.一个例子将采取以下形式:

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
Run Code Online (Sandbox Code Playgroud)

我不完全确定为什么这可以解决问题,也许是端点可以排序超过40000行,只要它不必全部返回它们.无论如何,它确实有效.您的查询将变为:

prefix dbpedia-owl: <http://dbpedia.org/ontology/>

select ?company {{
  select ?company { 
    ?company a dbpedia-owl:Company
  }
  order by ?company
}} 
offset 88000
LIMIT 1000
Run Code Online (Sandbox Code Playgroud)

  • @Anton嗯.​​.....这确实让事情变得更复杂.我想在这一点上,你想阅读[使用约束DBpedia的SPARQL端点MaxSortedTopRows Limits via LIMIT&OFFSET](http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/VirtTipsAndTricksHowToHandleBandwidthLimitExceed),它解决了这个特殊问题. (2认同)