获得维基数据上给定地点的最高等级 P131

问题描述

我有以下查询

fpcalc

这产生了数据:

地点 place_eng​​th> admin_eng​​th> country_eng​​th>
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_eng​​th> admin_eng​​th> country_eng​​th>
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

我无法确定它是否会比其他版本更慢、更快或等效。如果有人知道,请评论。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...