Получить штат / провинцию города с помощью запроса SPARQL

#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 для любого города.