2

我正在尝试使用 SPARQL 查询 DBPedia,只是为了查找公司信息,例如描述和徽标。

我很迷失设计 SPARQL 查询来做到这一点。

    SELECT DISTINCT ?subject 
                ?employees 
                ?homepage 
  WHERE 
    {
      ?subject  rdf:type               <http://dbpedia.org/class/yago/Company108058098>  .
      ?subject  dbpedia2:numEmployees  ?employees
        FILTER  ( xsd:integer(?employees) >= 50000 )                                     .
      ?subject  foaf:homepage          ?homepage                                         .
    } 
  ORDER BY  DESC(xsd:integer(?employees))
  LIMIT  20

我遇到了上面的查询,它找到了拥有超过 50,000 名员工的公司,但我不明白 rdf 类型是“ http://dbpedia.org/class/yago/Company108058098 ”之类的东西

好吧,我只想知道一个公司名称,我怎样才能返回一个唯一的 ID、徽标和描述?我只想要 3 条数据,然后我可以将它们存储在我的数据库中。

4

2 回答 2

2

像下面这样的查询的原因rdf:type <http://dbpedia.org/class/yago/Company108058098>是因为(大概)这是一个实例是公司的类。询问类的实例是询问公司的一种方式。

select * { ?s rdf:type <http://dbpedia.org/class/yago/Company108058098> }
limit 10

SPARQL 结果

这与让我们选择 Persons 的原理相同:

select * { ?s a dbpedia-owl:Person }
limit 10

SPARQL 结果

对于您的特定查询,查询 DBpedia 数据的一个典型好方法是首先手动查看数据并找到您感兴趣的值的类型。例如,您可以查看 Apple, Inc.,其 DBpedia 资源是

对于您正在寻找的信息类型,重要的属性似乎是:

您可以简单地使用资源 IRI 作为唯一标识符。鉴于这一切,您可以编写如下查询。但是,它有多个结果,因为有多个可能的徽标,但事实就是如此。

select ?iri ?logo ?description {
  ?iri a dbpedia-owl:Company ;
       dbpedia-owl:abstract ?description ;
       rdfs:label "Apple Inc."@en ;
       foaf:depiction|dbpedia-owl:thumbnail ?logo .
  filter( langMatches(lang(?description),"en") )
}

SPARQL 结果

能够使用就好了

foaf:name|rdfs:label "Apple In."@en

也是如此,但端点说在这种情况下估计的时间太长了:

Virtuoso 42000 错误 估计的执行时间 9320(秒)超过了 3000(秒)的限制。

我不确定它是如何估计时间的,但是您可以使用一些optionals和一些values来解决它(但一定要放入distinctselect

select distinct ?iri ?logo ?description {
  values ?hasLogo { foaf:depiction dbpedia-owl:thumbnail }
  values ?hasName { foaf:name rdfs:label }
  ?iri a dbpedia-owl:Company ;
       dbpedia-owl:abstract ?description ;
       ?hasLName "Apple Inc."@en ;
       ?hasLogo ?logo .
  filter( langMatches(lang(?description),"en") )
}

注意:在撰写本文时,DBpedia 的端点非常缓慢并且正在维护中,所以我不确定最后一个排列是否真的达到了估计的时间截止点。不过,我认为它会通过。

于 2013-10-30T23:32:53.987 回答
0

要获得所有公司,必须使用 LIMIT 和 OFFSET,因为通常公共端点会限制每个查询的结果数量。基于@Joshua 的回答,我编写了一个小脚本,可以运行该脚本以从公共 dbpedia 端点获取所有公司。这是要点: https ://gist.github.com/szydan/e801fa687587d9eb0f6a

还可以修改查询并使用它来获取其他实体。

于 2014-06-09T11:53:38.123 回答