如何从DBPedia获得所有公司?

时间:2014-01-05 18:41:09

标签: sparql dbpedia

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

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

SELECT DISTINCT * WHERE {?company a dbpedia-owl:Company}

2 个答案:

答案 0 :(得分:24)

您的查询没有归还所有公司,这是对的。但是,模式是正确的。请注意,此查询仅对公司进行计数,返回88054:

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

select (count(distinct ?company) as ?count)
where {
  ?company a dbpedia-owl:Company
}

SPARQL results

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

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

select ?company
where {
  ?company a dbpedia-owl:Company
}
order by ?company
limit 10

SPARQL results

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

select ?company
where {
  ?company a dbpedia-owl:Company
}
order by ?company
limit 10
offset 5823

SPARQL results

这是一般方法。但是,由于对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功率,它需要几分钟到几个小时。