【问题标题】:Fetching entities label data using SPARQL in Wikidata在 Wikidata 中使用 SPARQL 获取实体标签数据
【发布时间】:2016-09-01 07:09:15
【问题描述】:

我正在使用 wikidata 查询服务来获取数据:https://query.wikidata.org/

我已经通过 2 种方法设法使用实体的标签:

  1. 使用 wikibase 标签服务。例如:
SELECT ?spouse ?spouseLabel WHERE {
   wd:Q1744 wdt:P26 ?spouse.
   SERVICE wikibase:label {
     bd:serviceParam wikibase:language "en" .
   }
}
  1. 使用rdfs:label 属性:
SELECT ?spouse ?spouseLabel WHERE {
   wd:Q1744 wdt:P26 ?spouse.
   ?spouse rdfs:label ?spouseLabel. filter(lang(?spouseLabel) = "en").
}

但是,对于复杂的查询,第二种方法的执行速度似乎更快,这与 MediaWiki 用户手册的说明相反:

当您想要检索标签时,该服务非常有用,因为它 降低您原本需要的 SPARQL 查询的复杂性 达到同样的效果。

(https://www.mediawiki.org/wiki/Wikidata_query_service/User_Manual#Label_service)

wikibase 添加了哪些我无法仅使用 rdfs:label 实现的功能? 这似乎很奇怪,因为它们似乎都达到了相同的目的,但 rdfs:label 方法似乎更快(这是合乎逻辑的,因为查询不需要连接来自外部源的数据)。

谢谢!

【问题讨论】:

  • 第一个示例中的 ?spouseLabel 没有出现在查询中时,如何获取它的值?
  • @JoshuaTaylor Wikidata 有这个奇怪的非标准 SPARQL 扩展,他们使用 SERVICE 子句为资源提供标签。
  • @jeen 我从答案中收集到了这一点,但知道它会被称为什么似乎仍然有一些魔力。 (虽然我没有查看文档)
  • 这并不神奇,文档说明了用例:“WDQS 将自动生成标签,如下所示:如果 SELECT 中的未绑定变量名为 ?NAMELabel,则 WDQS 生成标签 (rdfs:label ) 用于变量 ?NAME 中的实体。"
  • @ShlomiUziel 好吧,至少它在那里有很好的记录。如果您最终得到一个不熟悉该特定系统但熟悉 SPARQL 的人会(i)不知道为什么它应该产生它的结果的查询,这似乎有点可怕;并且 (ii) 具有看起来应该是可移除的代码,因为它对结果没有贡献,但实际上确实如此。我不知道是否有 SPARQL linting 工具,但我希望有人将其标记为“对预计的绑定没有贡献。万岁。

标签: sparql wikidata-query-service


【解决方案1】:

我从文档中了解到,wikibase 标签服务通过消除显式搜索标签的需要来简化查询。在这方面,它降低了您需要编写的查询的复杂性,就语法而言。

我假设在实际解析之前,查询会扩展为另一种表示形式,可能使用第二个选项中的 rdfs 命名空间。

根据第二个选项更快,您是否进行了系统的基准测试?在我的几次尝试中,第一个选项更快。我会假设公共端点的性能无论如何都会受到基于需求、缓存等的波动影响,因此可能很难就类似查询的性能得出结论。

【讨论】:

  • 我倾向于同意 - 我还怀疑“复杂性”一词并不是指我最初认为的运行时效率。此外,官方文档确实暗示查询确实正在扩展或有所优化或处理以生成所需的结果(正如我对问题的评论)。我同意需要彻底的基准测试来果断地回答,尽管某些查询的系统运行给了我一些非常明确的结果 - 大约 900 毫秒与 wikibase 的 8000 毫秒。也许那个公共端点做了一些我们不知道的优化或改变......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
相关资源
最近更新 更多