如何解决获得维基数据上给定地点的最高等级 P131
fpcalc
这产生了数据:
地点 | place_ength> | admin_ength> | country_ength> |
---|---|---|---|
wd:Q1903 | 卡塔尼亚 | 卡塔尼亚大都会 | 意大利 |
wd:Q3437 | 佩鲁贾 | 佩鲁贾省 | 意大利 |
wd:Q5083 | 西雅图 | 金县 | 美国 |
正如您在 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.
}
}
下看到的,这包括该城市所在的第一个行政区域,通过该地点的 P131(位于行政领土实体中)属性。
取而代之的是,我想获得该地点所在的最高级别行政区域,例如美国城市的州或意大利城市的地区。例如:
地点 | place_ength> | admin_ength> | country_ength> |
---|---|---|---|
wd:Q1903 | 卡塔尼亚 | 西西里岛 | 意大利 |
wd:Q3437 | 佩鲁贾 | 翁布里亚 | 意大利 |
wd:Q5083 | 西雅图 | 华盛顿 | 美国 |
我知道我需要沿着 P131 的链向上执行此操作,但我不知道如何在下一级是国家本身时告诉查询停止,或者如何在所有,真的。我几乎是 SPARQL 和 Wikidata 的完全初学者。
我还需要尽可能高效的解决方案,因为我需要在许多记录上运行它,但一个有效的解决方案是一个好的开始。
解决方法
这个查询对我来说似乎很有效: 编辑答案:
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
即“有国家”,和 wdt:P131
,即“有行政单位”。
这可确保 ?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.
}
这从给定的值开始选择不同的结果,递归地查看每个所属的管理链(因此,一直到国家/地区),然后采用那些拥有自己管理的管理({{1} }),必须是country的实例(所以必须是一级行政单位)。
以下也有效,但向后遍历链:
?temp
我无法确定它是否会比其他版本更慢、更快或等效。如果有人知道,请评论。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。