GIS-LAB

Географические информационные системы и дистанционное зондирование

SPARQL на примерах Wikidata

Обсудить в форуме Комментариев — 5Редактировать в вики

Эта страница опубликована в основном списке статей сайта
по адресу http://gis-lab.info/qa/sparql_wikidata.html


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

Содержание

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

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

[править] query.wikidata.org

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

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

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

[править] Wikidata

Для помощи по терминологии и модели Wikidata можно посмотреть сюда: Викиданные:Глоссарий.

Структуру элемента (item) и свойства (property) можно найти на англоязычной странице Wikibase/DataModel/Primer.

  • Множественные значения
  • Отсутствующие значения (известно, что значения не может быть) эквивалентны тегам ключ=no из OpenStreetMap - описаны на странице Help:Утверждения
  • Значение не определено (известно, что значение есть, но не известно какое) - описаны на той же странице

Диаграмма русскоязычной терминологии утверждений в Викиданных

[править] Свойства Wikidata

Полный перечень свойств: Wikidata:List_of_properties

Отчёт количества использований каждого свойства - Wikidata:Database_reports/List_of_properties/all

[править] Географические свойства в Wikidata

Полный перечень: Wikidata:List_of_properties/Geographical_feature


Принадлежность стране - https://www.wikidata.org/wiki/Property:P17
Принадлежность админ делению - https://www.wikidata.org/wiki/Property:P131
Координаты (точка) - https://www.wikidata.org/wiki/Property:P625 (при выборке этого свойства появляется возможность представить результаты на карте в нижней части экрана)


Численность населения - https://www.wikidata.org/wiki/Property:P1082


ID отношения из OpenStreetMap - https://www.wikidata.org/wiki/Property:P402
Столица - https://www.wikidata.org/wiki/Property:P36
Город-побратим - https://www.wikidata.org/wiki/Property:P190


Относительная высота https://www.wikidata.org/wiki/Property:P2660
Официальный язык - https://www.wikidata.org/wiki/Property:P37

[править] Российские свойства в Wikidata

[править] Географические элементы в Wikidata

[править] Wikidata Blazegraph

Blazegraph — расширение от Wikidata к Blazegraph, чтобы сделать запросы к Wikibase более эффективными. Имеет лицензию GPLv2.

  • Функция geof:distance возвращает минимальное расстояние между двумя точками.

[править] Элементы SPARQL-запросов

Т.к. исходные данные представляют граф (элемент-свойство-значения) и его модификации (в Wikidata: квалификаторы, ссылки и др.), то большинство SPARQL-запросов строятся вокруг поиска паттернов в графе[1], зачастую нескольких.

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

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

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

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

  1. SELECT ?item ?relationid ?itemLabel ?countrydialingcode ?localdialingcode WHERE {
  2.   ?item wdt:P17 wd:Q159.
  3.   ?item wdt:P31 wd:Q515.
  4.   OPTIONAL {
  5.     ?item wdt:P402 ?relationid.
  6.   }
  7.   ?item wdt:P473 ?localdialingcode.
  8.   wd:Q159 wdt:P474 ?countrydialingcode.
  9.   SERVICE wikibase:label { bd:serviceParam wikibase:LANGUAGE "en". }
  10. }

[править] Объекты-побратимы всех российских объектов и их страны

Этот пример призван показать всю простоту JOIN-ов в SPARQL.

Для подходящего первичного ключа (в реляционных терминах) было достаточно найти только сам предикат (город-побратим).

Более того, в отличие от реляционных подходов, мы избавлены от вопросов: "в какой именно таблице хранятся города", "в какой таблице хранится информация о побратимстве". Сложность отличий нормальных форм не сбрасывается сразу на пользователя на уровне языка запросов. Необходимость в тщательном дизайне баз данных (таблиц и отношений) тоже уменьшается (по сравнению с табличным подходом и SQL).

Составители SPARQL-запросов просто исследуют данные запросами, а не думают постоянно, где именно эти данные расположены и как именно они связаны между собой.

  • Строка 2: Академический район будет выбран как находящийся в России.
  • Строка 4: Мелитополь (Украина) будет выбран как побратим Академического района.
  • Строка 7: Исключаем исторические страны у городов-побратимов в результатах

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

  1. SELECT DISTINCT ?wikidataCity ?russianPlace ?country WHERE {
  2.   ?russianPlace wdt:P17 wd:Q159 .
  3.  
  4.   ?russianPlace wdt:P190 ?wikidataCity .
  5.   ?wikidataCity wdt:P17 ?country .
  6.  
  7.   FILTER NOT EXISTS {?country wdt:P31 wd:Q3024240}
  8. }
  9. ORDER BY ?russianPlace ?country

[править] Существующие страны и их столицы

В отличие от OpenStreetMap, Wikidata не ограничен "существующими прямо сейчас" объектами. Это можно использовать как хороший пример исключения из результатов.

  • 5 строка: исключаем[4] те страны, которые - исторические
  • 10 строка: результаты упорядочены[5] по названиям на русском или английском языках.

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

  1. SELECT DISTINCT ?country ?countryLabel ?capital ?capitalLabel
  2. WHERE
  3. {
  4.   ?country wdt:P31 wd:Q3624078 .
  5.   FILTER NOT EXISTS {?country wdt:P31 wd:Q3024240}
  6.   OPTIONAL { ?country wdt:P36 ?capital } .
  7.  
  8.   SERVICE wikibase:label { bd:serviceParam wikibase:LANGUAGE "ru", "en" }
  9. }
  10. ORDER BY ?countryLabel

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

Города, отличающиеся от Перми менее чем на 1000 человек по численности населения.

  • 6 строка: abs[6] это одна из множества возможных функций на числах в тестовых выражениях и фильтрах[7]

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

  1. #defaultView:Map
  2. SELECT DISTINCT ?city ?cityLabel ?populatie2 ?coor WHERE {
  3.   wd:Q915 wdt:P1082 ?populatie .
  4.   ?city wdt:P1082 ?populatie2 .
  5.   ?city wdt:P625 ?coor .
  6.   FILTER (abs(?populatie - ?populatie2) < 1000)
  7.   SERVICE wikibase:label { bd:serviceParam wikibase:LANGUAGE "ru,en" }
  8. }

[править] Ранжирование городов по населению

  • Строка 10-17: BIND-конструкция[8] позволяет создать переменную и присвоить ей значение. В данном примере мы использовали другую переменную (?population), чтобы создать новую (?layer)
  • Строка 11: первый из 5 вложенных в "хвостовую часть" IF (условие, значение при истине, значение при не истине)

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

  1. #defaultView:Map
  2. SELECT DISTINCT ?city ?cityLabel ?population ?layer ?coordinates WHERE {
  3.   ?city wdt:P17 wd:Q159.
  4.   ?city wdt:P31 wd:Q515.
  5.  
  6.   OPTIONAL { ?city wdt:P1082 ?population. }
  7.  
  8.   ?city wdt:P625 ?coordinates.
  9.  
  10.   BIND(
  11.     IF(?population < 500, "500",
  12.     IF(?population < 10000, "10K",
  13.     IF(?population < 100000, "100K",
  14.     IF(?population < 1000000, "1M",
  15.     IF(?population < 10000000, "10M",
  16.     ">20M")))))
  17.     AS ?layer).
  18.  
  19.   SERVICE wikibase:label { bd:serviceParam wikibase:LANGUAGE "ru,en" }
  20. }
  21. ORDER BY 
  22. DESC(?population)

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

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

  1. #defaultView:Map
  2. SELECT DISTINCT ?country ?countryLabel ?capital ?capitalLabel ?coordinates ?ended
  3. WHERE
  4. {
  5.   ?country p:P36 ?stat.
  6.   ?stat ps:P36 ?capital.
  7.   ?capital wdt:P625 ?coordinates.
  8.   OPTIONAL {
  9.     ?country wdt:P582|wdt:P576 ?ended.
  10.   }
  11.   OPTIONAL {
  12.     ?capital wdt:P582|wdt:P576 ?ended.
  13.   }
  14.   OPTIONAL {
  15.     ?stat pq:P582 ?ended.
  16.   }
  17.   FILTER(BOUND(?ended)).
  18.   SERVICE wikibase:label { bd:serviceParam wikibase:LANGUAGE "ru,en". }
  19. }

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

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

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

  1. #defaultView:Map
  2. SELECT ?city ?cityLabel ?coordinates
  3. WHERE
  4. {
  5.    VALUES ?highway { wd:Q559037 wd:Q58767 } 
  6.    ?highway wdt:P2789 ?city .
  7.     ?city wdt:P625 ?coordinates .
  8.    SERVICE wikibase:label { bd:serviceParam wikibase:LANGUAGE "ru,en". }
  9. }

[править] Wikidata-префиксы

Полный список префиксов.

[править] Квалификаторы (qualifier)

Если открыть Пермь, то там указанно множество значений у численности населения (P1082), причём все значения — одного ранга (нормальный).

У некоторых из значений численности населения указаны квалификаторы (qualifier) P585 (момент времени) и P459 (метод определения).

  • 2 строка: будут выбраны все 43 высказывания у элемента Q915 и свойства P1082
  • 3 строка: выбираем их значения
  • 4-5 строка: выбираем нужные квалификаторы.

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

  1. SELECT ?val ?qualifier ?wikidataid WHERE {
  2.                  wd:Q915 p:P1082 ?statements           .
  3.             ?statements ps:P1082 ?val      .
  4.             ?statements pq:P585  ?qualifier  .
  5.  OPTIONAL { ?statements pq:P459  ?wikidataid . }
  6. }

[править] Ранг (rank)

Показать все страны, относящиеся (и относившиеся ранее) к Перми, и их ранги.

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

  1. SELECT DISTINCT ?doLabel ?do ?rank WHERE {
  2. #  VALUES ?rank { wikibase:DeprecatedRank wikibase:NormalRank wikibase:PreferredRank }
  3.     wd:Q915       p:P17 ?VALUE.
  4.     ?VALUE       ps:P17 ?do .
  5.     ?VALUE wikibase:rank ?rank .
  6.  
  7.    SERVICE wikibase:label {
  8.      bd:serviceParam wikibase:LANGUAGE "ru" .
  9.    }
  10. }

[править] Примеры запросов

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

Более сложные примеры: https://bitbucket.org/sulab/wikidatasparqlexamples

[править] Альтернативы SPARQL у Wikidata

Нужно отметить, что SPARQL подразумевает только запросы на чтение. Часть языка на обновление, добавление и удаление данных — SPARQL 1.1 Update — в данной статье не рассматривалась.

Для доступа на запись вам необходимо ознакомиться с короткой процедурой регистрации ботов и отправить заявку участника-ботовода.

  1. wikidata-cli
  2. wikidata-sdk
  3. Wikidata API. Заявления у Q915: в JSON или в XML
  4. pywikidata - проект для доступа и на чтение и запись к элементам Wikidata. руководство по созданию ботов и примеры скриптов миграции данных из Википедии и Wikidata.

[править] Источники

  1. https://www.w3.org/TR/sparql11-query/#GraphPattern
  2. https://www.w3.org/TR/sparql11-query/#QueryForms
  3. https://www.w3.org/TR/sparql11-query/#optionals
  4. https://www.w3.org/TR/sparql11-query/#negation
  5. https://www.w3.org/TR/sparql11-query/#solutionModifiers
  6. https://www.w3.org/TR/sparql11-query/#func-abs
  7. https://www.w3.org/TR/sparql11-query/#expressions
  8. https://www.w3.org/TR/sparql11-query/#assignment
  9. https://www.w3.org/TR/sparql11-query/#inline-data

[править] Внешние ссылки

Обсудить в форуме Комментариев — 5Редактировать в вики

Последнее обновление: 2016-11-28 13:28

Дата создания:
Автор(ы): d1g


(Геокруг)

Если Вы обнаружили на сайте ошибку, выберите фрагмент текста и нажмите Ctrl+Enter