如何从DBPedia获取所有公司?

17

我是第一次查询DBPedia。如何从http://dbpedia.org/sparql获取所有公司?

这个查询只返回了50,000个组织:

SELECT DISTINCT * WHERE {?company a dbpedia-owl:Company}
2个回答

27

你说的对,你的查询没有返回所有公司。但是模式是正确的。请注意,这个仅计算公司数量的查询返回了88054:

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

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

SPARQL查询结果

出于性能方面的考虑,我认为这是DBpedia SPARQL端点所施加的限制。你可以下载数据并在本地运行查询,但这可能比你想要的更费力。相反,您可以对结果进行排序(无论如何,只要始终按照相同方式进行排序),然后使用limitoffset在这些结果中进行选择。例如:

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

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

SPARQL结果

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

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

SPARQL结果

这是一般的方法。但是,由于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

然而,对于排序超过40000条记录集存在问题:select ?company where { ?company a dbpedia-owl:Company } order by ?company limit 10 offset 40000 - Anton
获取Virtuoso 22023错误SR353:排序的TOP子句指定了超过40010行进行排序。只允许使用40000行。要么减少偏移量和/或行数,要么使用可滚动的游标。 - Anton
2
@Anton 嗯...这确实让事情变得更加复杂了。我认为此时你需要阅读《使用约束条件DBpedia的SPARQL端点MaxSortedTopRows通过LIMIT和OFFSET限制》(http://virtuoso.openlinksw.com/dataspace/doc/dav/wiki/Main/VirtTipsAndTricksHowToHandleBandwidthLimitExceed),该文档解决了这个特定问题。 - Joshua Taylor
谢谢!我只是想发布这个链接 :) 我打算试一下。我想知道这样的查询是否会返回非交集的集合。 - Anton
@Anton,我刚刚更新了我的答案,展示了如何使用这种技术来实现你的查询。看起来你将能够获得所有公司。 :) - Joshua Taylor
查询1: SELECT ?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

1

从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性能,需要几分钟到几个小时不等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接