【问题标题】:Get information from Wikidata从维基数据获取信息
【发布时间】:2020-11-16 19:00:08
【问题描述】:

我有这个 Wikidata 查询,它返回所有足球场的名称、坐标、俱乐部标签和类似的东西。但我不知道如何获得体育场所在的国家和城市名称(也可能是城市的坐标)。

这是我的查询:

SELECT ?club ?clubLabel ?venue ?venueLabel ?coordinates
WHERE
{
    ?club wdt:P31 wd:Q476028 .
    ?club wdt:P115 ?venue .
    ?venue wdt:P625 ?coordinates .
    SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
}

Link to test the query

2020 年 11 月 19 日编辑:

我需要城市的时区,所以我在查看文档后尝试了这个查询,但它没有返回值。只需像“wd:Q6723”这样的链接:

SELECT DISTINCT ?timezone ?club ?locationLabel ?countryLabel ?clubLabel ?venue ?venueLabel ?coordinates 
WHERE
{
    ?venue (wdt:P421|wd:Q12143) ?timezone .
    ?club wdt:P31 wd:Q476028 .
    ?club wdt:P115 ?venue .
    ?venue wdt:P625 ?coordinates .
    OPTIONAL {?club wdt:P159|(wdt:P115/(wdt:P131|wdt:P276)) ?location . 
              OPTIONAL { ?location wdt:P17 ?country . }
              }     
    SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
} limit 500

【问题讨论】:

标签: sparql wikipedia wikidata


【解决方案1】:

现在一分为二。原始查询:

SELECT DISTINCT ?club ?locationLabel ?countryLabel ?clubLabel ?venue 
?venueLabel ?coordinates 
WHERE {
    ?club wdt:P31 wd:Q476028 .
    ?club wdt:P115 ?venue .
    ?venue wdt:P625 ?coordinates .
    OPTIONAL {
        ?club wdt:P159|(wdt:P115/(wdt:P131|wdt:P276)) ?location . 
        OPTIONAL { ?location wdt:P17 ?country . }
    }     
    SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
} limit 500

(更新 #2:之前,我询问了俱乐部的时区。但是,当然,这不是通常为俱乐部记录的那种数据。相反,您必须通过位置/场地/总部或类似信息,并且可能达到地区/国家的水平,因为某些郊区也没有时区数据。

这是它应该如何工作的一般想法,但它正在超时,我也是:

SELECT DISTINCT ?timezone ?timezoneLabel ?offset 
?club ?clubLabel 
WHERE {
       ?club wdt:P31 wd:Q476028 .
       
       # via country. not perfect, because some have multiple timezones, but shoud be faster  
       ?club wdt:P17/wdt:P421 ?timezone . 
       
        # what I really want to do; all sorts of alternatives 
       #?club wdt:P115?/(wdt:P159|wdt:P276)/wdt:P131?/wdt:P421 ?timezone . 

    ?timezone wdt:P2907 ?offset.
    SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
} limit 500

简短说明:

这使用了三个新东西。 OPTIONAL 做了以下声明,嗯,可选。什么都找不到的俱乐部仍将包含在输出中。第二个 OPTIONAL 嵌套在第一个中,因为询问我们尚未找到的位置的国家/地区是没有意义的。

管道符号 (|) 允许替代品。在这里,我要求“总部位置 (P159) 检查两种不同的方式来指定体育场的位置。斜线在后一种情况下使用,表示路径(俱乐部/场地/ "位于区|位置")。

如果有缺失数据(会有缺失数据),您可能需要查看示例并确定是否存在其他常见的位置记录模式。例如,如果俱乐部有 country 声明但没有其他更具体的位置,您可以将内部 OPTIONAL 移到外面。

更新:我已按照评论中的要求包含了时区。注意:

  • ?timezoneLabel 获取时区标签(= 名称),就像 ?clubLabel 获取俱乐部的标签一样。附加的“...Label”是一个“神奇”功能,可将 ID 转换为人类可读的标签。它是通过包含 SERVICE wikibase:label... 行来启用的。

  • 由于您可能想要使用这些时区,我已经包含了以小时为单位获取数字偏移量的标记线。

  • 偏移量可能会有所不同,因为 UTC 没有夏令时。对于这种情况,结果中应该有多行,您需要阅读“限定词”以查看它们何时适用。或者,也许从其他时区的偏移量(即你的)中减去偏移量,你可能会很幸运,它们会取消。

【讨论】:

  • 太棒了。我目前正在开始学习这种特定的语言,但在掌握它之前我需要时间。我的目标是获得城市的时区。所以我查看了文档并尝试了在我的第一篇文章中编辑的查询,但我没有价值。结果,我在列中只有“wd:Q6723”。可以请你改正吗?
  • 感谢您的帮助。不幸的是,它没有按预期工作。事实上,与我最初查询的 9065 行相比,它只返回 133 行。
  • 是的,我试过把它一分为二。我可以发誓它工作过一次,然后就开始抛出超时,对不起。可能必须分多个步骤来完成,即。 e.首先获得城市。
猜你喜欢
  • 2020-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 2016-02-25
  • 1970-01-01
  • 2017-07-09
相关资源
最近更新 更多