获得维基数据给定位置的最高等级 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 和 ?countrywdt: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.
}

我无法判断它是否会更慢、更快或与其他版本相当。如果有人知道,请评论。