#database #sparql #wikidata
#База данных #sparql #викиданные
Вопрос:
У меня есть следующий запрос SPARQL:
SELECT ?item ?itemLabel WHERE {
?item wdt:P17 wd:Q16;
(wdt:P31/(wdt:P279*)) wd:Q515.
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
который в данном случае возвращает города в Канаде. Я также хотел бы отобразить состояния / процессы, например, ожидаемый результат должен быть
...
Montreal Quebec
...
или, если бы я должен был выполнить запрос для городов США
...
Los Angeles California
...
Как можно расширить запрос для отображения штатов / провинций?
Комментарии:
1. Это не так просто. Вы должны следовать по пути через свойство, расположенное в административно-территориальной единице , а затем найти какую-то точку для остановки, т. Е. здесь, когда объект является провинцией Канады :
SELECT ?item ?itemLabel ?regionLabel WHERE { ?item wdt:P17 wd:Q16; (wdt:P31/(wdt:P279*)) wd:Q515; wdt:P131* ?region . ?region wdt:P31 wd:Q11828004 SERVICE wikibase:label { bd:serviceParam wikibase:language "en". } }
2. @AKSW Спасибо, это работает для Канады. Я попытался заставить это работать с США и использовал запрос:
SELECT ?item ?itemLabel ?regionLabel WHERE { ?item wdt:P17 wd:Q30; (wdt:P31/(wdt:P279*)) wd:Q515; (wdt:P131*) ?region. ?region wdt:P31 wd:Q35657. SERVICE wikibase:label { bd:serviceParam wikibase:language "en". } }
но я получил ошибку тайм-аута. Есть ли какой-либо шанс сделать запрос более «общим», чтобы его можно было легко адаптировать для работы со странами Северной Америки и Европы?3. что ж, нам нужно найти какой-нибудь общий термин, обозначающий штаты страны. Этот тройной шаблон сделал бы это:
?region (wdt:P31/(wdt:P279*)) wd:Q107390
— но опять же, пути к свойствам ужасны для тройных хранилищ и, вероятно, истекают по таймауту.4. Ну, я могу дать вам хотя бы запрос, который возвращает регион верхнего уровня для страны, может быть, вы сможете использовать его для чего-то:
select ?region ?regionLabel { VALUES ?country {wd:Q30} # get the top level regions of the country ?region wdt:P17 ?country . ?region wdt:P31/wdt:P279* wd:Q10864048 . SERVICE wikibase:label { bd:serviceParam wikibase:language "en". } }
Ответ №1:
Вы должны следовать по пути через свойство, расположенное в административно-территориальной единице, а затем найти какую-то точку для остановки, т. Е. здесь, когда объект является провинцией Канады:
SELECT ?item ?itemLabel ?regionLabel
WHERE { ?item wdt:P17 wd:Q16;
(wdt:P31/(wdt:P279*)) wd:Q515;
wdt:P131* ?region .
?region wdt:P31 wd:Q11828004
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
В более общем плане для штатов страны мы должны найти некоторый общий термин, который ее обозначает. Этот тройной шаблон сделает это:
?region (wdt:P31/(wdt:P279*)) wd:Q107390
Однако пути к свойствам ужасны для хранилищ triples и, вероятно, истекают по времени ожидания.
Вот запрос, который, по крайней мере, возвращает регион верхнего уровня для страны:
select ?region ?regionLabel
{ VALUES ?country {wd:Q30} # get the top level regions of the country
?region wdt:P17 ?country .
?region wdt:P31/wdt:P279* wd:Q10864048 .
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". } }
Комментарии:
1. Интересно, есть ли способ получить более высокое административное деление не только для одной страны, но и для любой страны в одном запросе. Например, получить Q15916867 для любого города.