SPARQL на примерах Wikidata: различия между версиями

Материал из GIS-Lab
Перейти к навигации Перейти к поиску
м (более сложный пример)
Нет описания правки
Строка 99: Строка 99:
   FILTER(BOUND(?ended)).
   FILTER(BOUND(?ended)).
   SERVICE wikibase:label { bd:serviceParam wikibase:language "ru,en". }
   SERVICE wikibase:label { bd:serviceParam wikibase:language "ru,en". }
}
</syntaxhighlight>
=== Города, которые соединяется с Транссибирской магистралью или Трансмонгольская железной дорогой ===
* 5 строка: конструкция VALUES<ref>https://www.w3.org/TR/sparql11-query/#inline-data</ref> используется чтобы вручную указать значения у отдельных элементов<ref>http://www.snee.com/bobdc.blog/2012/09/sparql-11s-new-values-keyword.html</ref>
[https://query.wikidata.org/#%23defaultView%3AMap%0ASELECT%20%3Fcity%20%3FcityLabel%20%3Fcoordinates%0AWHERE%0A%7B%0A%20%20%20VALUES%20%3Fhighway%20%7B%20wd%3AQ559037%20wd%3AQ58767%20%7D%20%0A%20%20%20%3Fhighway%20wdt%3AP2789%20%3Fcity%20.%0A%20%20%20%20%3Fcity%20wdt%3AP625%20%3Fcoordinates%20.%0A%20%20%20SERVICE%20wikibase%3Alabel%20%7B%20bd%3AserviceParam%20wikibase%3Alanguage%20%22ru%2Cen%22.%20%7D%0A%7D Открыть на query.wikidata.org]
<syntaxhighlight lang="sql" line>
#defaultView:Map
SELECT ?city ?cityLabel ?coordinates
WHERE
{
  VALUES ?highway { wd:Q559037 wd:Q58767 }
  ?highway wdt:P2789 ?city .
    ?city wdt:P625 ?coordinates .
  SERVICE wikibase:label { bd:serviceParam wikibase:language "ru,en". }
}
}
</syntaxhighlight>
</syntaxhighlight>

Версия от 09:16, 8 ноября 2016

Эта страница является черновиком статьи.


SPARQL это язык запросов к данным, основанных на модели "субъект-предикат-значение". Wikidata - это открытый проект, потенциально интересный в гео-проектах и доступный в виде публичной SPARQL-точки

Инструментарий запросов

Запросы к Wikidata можно составлять с помощью различных SPARQL клиентов, но ключевой особенностью Wikidata это общедоступная и публичная точка доступа SPARQL. Более того, был написан простой web интерфейс к ней.

query.wikidata.org

https://query.wikidata.org - веб-интерфейс.

У этого инструмента есть целое руководство на английском языке https://www.mediawiki.org/wiki/Wikidata_query_service/User_Manual и репозиторий для разработчиков https://github.com/wikimedia/wikidata-query-rdf.

Обратите внимание, что результаты запросов можно скачать в формате CSV - хорошее подспорье для более серьёзной работы с помощью других инструментов.

В таблице результатов (в нижней части экрана) можно отфильтровать результаты, используя поиск по всем полям сразу (например, можно попробовать найти "Moscow").

Wikidata

В рамках gis-lab в первую очередь интересуют предикаты (свойства объектов) относящиеся к географическим свойствам.

Предикаты Wikidata

Географические предикаты в Wikidata

Географические объекты в Wikidata

Элементы запросов

Города в России с телефонными кодами

Самый простой пример.

  • 1 строка: SELECT запросы[1] выбирают данные или их часть
  • 2 строка: выбираем субъекты (?item) у которых явно указано, что они в стране - Россия (Q159)
  • 3 строка: выбираем субъекты (?item) у которых явно указано, что они суть - города (Q515)
  • 4-6 строка: т.к. значения предиката "ID отношения из OpenStreetMap" P402 могут быть просто не заполнены у отдельных объектов, такие объекты будут исключены из результатов. Это не совсем интуитивно понятно для людей, привыкших к SQL-запросам (где NULL-значения возвращаются в большинстве случаев). В SPARQL необязательные значения[2] нужно включать в результаты вручную.
  • 7 строка: выбираем все возможные субъекты и объекты у предиката P473 (код города). Примечание о части "?localdialingcode": в Wikidata у Москвы указано сразу два объекта "495" и "499" у предиката P473, поэтому вернутся 2 результата, а не один. В SQL пришлось бы писать JOIN на ровном месте, а в SPARQL его нет вообще.

Открыть на query.wikidata.org

SELECT ?item ?relationid ?itemLabel ?localdialingcode WHERE {
  ?item wdt:P17 wd:Q159.
  ?item wdt:P31 wd:Q515.
  OPTIONAL {
    ?item wdt:P402 ?relationid.
  }
  ?item wdt:P473 ?localdialingcode.
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}

Города примерно с таким же населением как и Пермь

± 1000 населения

Открыть на query.wikidata.org

#defaultView:Map
SELECT DISTINCT ?city ?cityLabel ?populatie2 ?coor WHERE {
  wd:Q915 wdt:P1082 ?populatie .
  ?city wdt:P1082 ?populatie2 ;
        wdt:P625 ?coor .
  FILTER (abs(?populatie - ?populatie2) < 1000)
  SERVICE wikibase:label { bd:serviceParam wikibase:language "ru,en" }
}

Бывшие столицы государств

Открыть на query.wikidata.org

#defaultView:Map
SELECT DISTINCT ?country ?countryLabel ?capital ?capitalLabel ?coordinates ?ended
WHERE
{
  ?country p:P36 ?stat.
  ?stat ps:P36 ?capital.
  ?capital wdt:P625 ?coordinates.
  OPTIONAL {
    ?country wdt:P582|wdt:P576 ?ended.
  }
  OPTIONAL {
    ?capital wdt:P582|wdt:P576 ?ended.
  }
  OPTIONAL {
    ?stat pq:P582 ?ended.
  }
  FILTER(BOUND(?ended)).
  SERVICE wikibase:label { bd:serviceParam wikibase:language "ru,en". }
}

Города, которые соединяется с Транссибирской магистралью или Трансмонгольская железной дорогой

  • 5 строка: конструкция VALUES[3] используется чтобы вручную указать значения у отдельных элементов[4]

Открыть на query.wikidata.org

#defaultView:Map
SELECT ?city ?cityLabel ?coordinates
WHERE
{
   VALUES ?highway { wd:Q559037 wd:Q58767 } 
   ?highway wdt:P2789 ?city .
    ?city wdt:P625 ?coordinates .
   SERVICE wikibase:label { bd:serviceParam wikibase:language "ru,en". }
}

Примеры запросов

Часть примеров:


Внешние ссылки