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

Материал из GIS-Lab
Перейти к навигации Перейти к поиску
(строгая SPARQL терминология)
Нет описания правки
Строка 33: Строка 33:
* 2 строка: выбираем субъекты (?item) у которых явно указано, что они в стране - ''Россия'' (Q159)
* 2 строка: выбираем субъекты (?item) у которых явно указано, что они в стране - ''Россия'' (Q159)
* 3 строка: выбираем субъекты (?item) у которых явно указано, что они суть - ''города'' (Q515)
* 3 строка: выбираем субъекты (?item) у которых явно указано, что они суть - ''города'' (Q515)
* 4-6 строка: т.к. значения P402 могут быть не заполнены у отдельных объектов, такие объекты будут исключены из результатов. Это не интуитивно для людей приходящих после SQL (где NULL значения всегда чаще возвращаются). В SPARQL ''необязательные значения''<ref>https://www.w3.org/TR/sparql11-query/#optionals</ref> нужно включать в результаты вручную.
* 4-6 строка: т.к. значения предиката "код города" P402 могут быть просто не заполнены у отдельных объектов, такие объекты будут исключены из результатов. Это не интуитивно для людей приходящих после SQL (где NULL значения всегда чаще возвращаются). В SPARQL ''необязательные значения''<ref>https://www.w3.org/TR/sparql11-query/#optionals</ref> нужно включать в результаты вручную.
* 7 строка: выбираем все возможные субъекты и объекты у пердиката P473 (код города). Примечание о части "?localdialingcode": в Wikidata у [https://www.wikidata.org/wiki/Q649 Москвы] указано два сразу объекта "495" и "499" у предиката P473, поэтому вернутся 2 результата, а не один.
* 7 строка: выбираем все возможные субъекты и объекты у предиката P473 (код города). Примечание о части "?localdialingcode": в Wikidata у [https://www.wikidata.org/wiki/Q649 Москвы] указано сразу два объекта "495" и "499" у предиката P473, поэтому вернутся 2 результата, а не один. В SQL пришлось бы писать JOIN на ровном месте, а в SPARQL его нет вообще.


[http://tinyurl.com/hygo6k7 Открыть на query.wikidata.org]
[http://tinyurl.com/hygo6k7 Открыть на query.wikidata.org]

Версия от 19:42, 7 ноября 2016

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


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

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

Запросы к Wikidata можно составлять с помощью различных SPARQL клиентов, но ключевой особенностью Wikidata это общедоступный и публичный endpoint. Более того, был написан простой 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

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

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

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

  • 1 строка: SELECT запросы[1] выбирают данные или их часть
  • 2 строка: выбираем субъекты (?item) у которых явно указано, что они в стране - Россия (Q159)
  • 3 строка: выбираем субъекты (?item) у которых явно указано, что они суть - города (Q515)
  • 4-6 строка: т.к. значения предиката "код города" 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". }
}

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