【问题标题】:How to get all companies from DBPedia?如何从 DBPedia 获取所有公司?
【发布时间】:2014-01-23 02:59:03
【问题描述】:

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

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

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

【问题讨论】:

    标签: sparql dbpedia


    【解决方案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 能力。

    【讨论】:

      【解决方案2】:

      您是对的,您的查询并未返回所有公司。不过,模式是正确的。请注意,这个只计算公司的查询返回 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
      

      【讨论】:

      • 但是对40000多条记录集排序有问题:select ?company where { ?company a dbpedia-owl:Company } order by ?company limit 10 offset 40000
      • 获取Virtuoso 22023 Error SR353: Sorted TOP clause specifies more then 40010 rows to sort. Only 40000 are allowed. Either decrease the offset and/or row count or use a scrollable cursor
      • @Anton 嗯……这确实让事情变得更加复杂。我认为此时您应该阅读Working with constraints DBpedia's SPARQL endpoint MaxSortedTopRows Limits via LIMIT & OFFSET,它解决了这个特定问题。
      • 谢谢!只是想发布这个链接:) 去试一试。我想知道这样的查询是否返回不相交的集合。
      • @Anton,我刚刚更新了我的答案,以展示如何使用这种技术实现您的查询。看起来你可以得到所有的公司。 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-13
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      • 1970-01-01
      • 1970-01-01
      • 2022-10-13
      相关资源
      最近更新 更多