【发布时间】:2021-05-06 11:31:56
【问题描述】:
我有以下疑问:
SELECT DISTINCT
?place
?place_eng
?admin_eng
?country_eng
WHERE {
VALUES ?place { wd:Q3437 wd:Q1903 wd:Q5083 }
?place wdt:P131 ?admin.
?place wdt:P17 ?country.
SERVICE wikibase:label {
bd:serviceParam wikibase:language "en,en".
?place rdfs:label ?place_eng.
?admin rdfs:label ?admin_eng.
?country rdfs:label ?country_eng.
}
}
这会产生数据:
| place | place_eng | admin_eng | country_eng |
|---|---|---|---|
| wd:Q1903 | Catania | Metropolitan City of Catania | Italy |
| wd:Q3437 | Perugia | Province of Perugia | Italy |
| wd:Q5083 | Seattle | King County | United States of America |
正如您在admin_eng 下看到的,这包括城市所在的第一个行政区域,通过该地点的 P131(位于行政区域实体中)财产。
而不是它,我想获得该地点所在的最高级别行政区域,例如美国城市的州或意大利城市的地区。例如:
| place | place_eng | admin_eng | country_eng |
|---|---|---|---|
| wd:Q1903 | Catania | Sicily | Italy |
| wd:Q3437 | Perugia | Umbria | Italy |
| wd:Q5083 | Seattle | Washington | United States of America |
我知道我需要沿着 P131 的链向上执行此操作,但我不知道如何告诉查询在下一级是国家本身时停止,或者如何在所有,真的。我几乎是 SPARQL 和 Wikidata 的初学者。
我还需要尽可能高效的解决方案,因为我需要在许多记录上运行它,但有效的解决方案是一个好的开始。
【问题讨论】:
-
SELECT DISTINCT ?place ?place_eng ?admin_eng ?country_eng WHERE { VALUES ?place { wd:Q3437 wd:Q1903 wd:Q5083 } ?place wdt:P131+ ?admin. ?admin wdt:P131 ?country . ?place wdt:P17 ?country. SERVICE wikibase:label { bd:serviceParam wikibase:language "en,en". ?place rdfs:label ?place_eng. ?admin rdfs:label ?admin_eng. ?country rdfs:label ?country_eng. } } -
我认为这个问题是你需要在数据中至少有两个
wdt:P131实例才能工作。对于像瓦杜兹 (wd:Q1844) 这样的小国家的城市来说,情况并非如此。现在我在下面的回答也不适用于瓦杜兹,但那是因为列支敦士登被列为德意志联邦,它不再属于,所以数据问题可能会在适当的时候得到解决。
标签: sparql wikidata data-collection