Wikidata SPARQL - Страны и их (все еще существующие) соседи
Я хочу запросить соседей в страну с помощью SPARQL из Wikidata, например:
SELECT ?country ?countryLabel WHERE {
?country wdt:P47 wd:Q183 .
FILTER NOT EXISTS{ ?country wdt:P576 ?date } # don't count dissolved country - at least filters German Democratic Republic
SERVICE wikibase:label {
bd:serviceParam wikibase:language "en" .
}
}
Моя проблема в том, что, например, в этом примере для соседей Германии все еще показаны страны, которых больше нет, например:
- Королевство Дания или
- Саар.
Уже пробовал
Я мог бы уже уменьшить число на FILTER
заявление.
Вопрос
- Как сделать заявление, чтобы сократить его до 9 стран?
- (также было бы здорово разделить границу на суше и на море)
альтернатива
- Фильтрация по этому API также подойдет для меня https://www.wikidata.org/w/api.php?action=wbgetentities&ids=Q35
- база данных или списки или подготовленные HashMaps со всеми странами мира с соседями
1 ответ
Решение
Вы можете проверить объекты типа wd:Q133346
("граница") или wd:Q12413618
("международная граница"):
SELECT ?border ?borderLabel ?country1Label ?country2Label ?isLandBorder ?isMaritimeBorder ?constraint {
VALUES (?country1) {(wd:Q183)}
?border wdt:P31 wd:Q12413618 ;
wdt:P17 ?country1 , ?country2 .
FILTER (?country1 != ?country2)
BIND (EXISTS {?border wdt:P31 wd:Q15104814} AS ?isLandBorder)
BIND (EXISTS {?border wdt:P31 wd:Q3089219} AS ?isMaritimeBorder)
BIND ((?isLandBorder || ?isMaritimeBorder) AS ?constraint)
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
} ORDER BY ?country1Label
В некотором смысле записи дублируются: для границы между Афганистаном и Узбекистаном список содержит (?country1=Afganistan,?country2=Uzbekistan)
а также (?country1=Uzbekistan,?country2=Afganistan)
,
- база данных или списки или подготовленные HashMaps со всеми странами мира с соседями
Вы можете спросить на https://opendata.stackexchange.com/.