从维基数据中获取信息

Get information from Wikidata

我有这个 Wikidata 查询 return 所有足球场的名称、坐标、俱乐部标签和类似的东西。但我不知道如何同时获取体育场所在的国家和城市名称(可能还有城市的坐标)。

这是我的查询:

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 日:

我需要城市的时区,所以我在查看文档后尝试了这个查询,但它没有 return 值。就像“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

现在分成两个。原始查询:

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:之前,我询问了俱乐部的时区。但是,当然,这不是通常为俱乐部记录的那种数据。相反,您必须通过 location/venue/headquarters 或相似,并且可能高达 region/country,因为某些郊区也没有时区数据。

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

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 做出以下声明,嗯,可选。找不到任何东西的俱乐部仍将包含在输出中。第二个可选列表嵌套在第一个列表中,因为询问我们尚未找到的位置所在的国家/地区毫无意义。

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

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

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

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

  • 因为您可能想要使用这些时区,所以我添加了标记行,以小时为单位获取数字偏移量。

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