获得维基数据给定位置的最高等级 P131
Get highest level P131 for given place on Wikidata
我有以下查询:
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 和维基数据的初学者。
我还需要尽可能高效的解决方案,因为我需要 运行 在很多记录上这样做,但有效的解决方案是一个好的开始。
这个查询对我来说似乎很有效:
编辑后的答案:
SELECT DISTINCT
?place
?place_eng
?admin_eng
?country_eng
WHERE {
VALUES ?place { wd:Q3437 }
?place wdt:P131+ ?admin .
?admin wdt:P131 ?country ;
wdt:P17 ?country .
SERVICE wikibase:label {
bd:serviceParam wikibase:language "en".
?place rdfs:label ?place_eng.
?admin rdfs:label ?admin_eng.
?country rdfs:label ?country_eng.
}
}
注意 wdt:P131+
:这意味着 属性 应该出现一个或多个实例。然后我们确保用两个不同的边连接 ?admin
和 ?country
,wdt:P17
即 'has country' 和 wdt:P131
,即 'has administrative unit'。
这确保 ?admin
直接在 ?country
下方,并且 ?country
确实是一个国家。
我找到了一个不需要任何回溯的解决方案:
SELECT DISTINCT ?start ?admin
WHERE {
VALUES ?start { wd:Q3437 wd:Q1903 wd:Q5083 }
?start wdt:P131+ ?admin.
?admin wdt:P131 ?temp.
?temp wdt:P31 wd:Q6256.
}
这从给定的值开始选择不同的结果,递归地查看每个所属的行政部门链(因此,一直到国家/地区),然后获取那些自己有行政部门的行政部门(?temp
), 必须是country的实例(所以必须是一级行政单位).
以下也有效,但向后遍历链:
SELECT DISTINCT ?start ?admin
WHERE {
VALUES ?start { wd:Q3437 wd:Q1903 wd:Q5083 }
?start wdt:P131+ ?admin.
?temp ^wdt:P131 ?admin;
wdt:P31 wd:Q6256.
}
我无法判断它是否会更慢、更快或与其他版本相当。如果有人知道,请评论。
我有以下查询:
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 和维基数据的初学者。
我还需要尽可能高效的解决方案,因为我需要 运行 在很多记录上这样做,但有效的解决方案是一个好的开始。
这个查询对我来说似乎很有效: 编辑后的答案:
SELECT DISTINCT
?place
?place_eng
?admin_eng
?country_eng
WHERE {
VALUES ?place { wd:Q3437 }
?place wdt:P131+ ?admin .
?admin wdt:P131 ?country ;
wdt:P17 ?country .
SERVICE wikibase:label {
bd:serviceParam wikibase:language "en".
?place rdfs:label ?place_eng.
?admin rdfs:label ?admin_eng.
?country rdfs:label ?country_eng.
}
}
注意 wdt:P131+
:这意味着 属性 应该出现一个或多个实例。然后我们确保用两个不同的边连接 ?admin
和 ?country
,wdt:P17
即 'has country' 和 wdt:P131
,即 'has administrative unit'。
这确保 ?admin
直接在 ?country
下方,并且 ?country
确实是一个国家。
我找到了一个不需要任何回溯的解决方案:
SELECT DISTINCT ?start ?admin
WHERE {
VALUES ?start { wd:Q3437 wd:Q1903 wd:Q5083 }
?start wdt:P131+ ?admin.
?admin wdt:P131 ?temp.
?temp wdt:P31 wd:Q6256.
}
这从给定的值开始选择不同的结果,递归地查看每个所属的行政部门链(因此,一直到国家/地区),然后获取那些自己有行政部门的行政部门(?temp
), 必须是country的实例(所以必须是一级行政单位).
以下也有效,但向后遍历链:
SELECT DISTINCT ?start ?admin
WHERE {
VALUES ?start { wd:Q3437 wd:Q1903 wd:Q5083 }
?start wdt:P131+ ?admin.
?temp ^wdt:P131 ?admin;
wdt:P31 wd:Q6256.
}
我无法判断它是否会更慢、更快或与其他版本相当。如果有人知道,请评论。