Обсудить в форуме Комментариев 7Редактировать в вики
SPARQL — это язык запросов к данным, основанных на модели "субъект-предикат-объект" (примечание: "объект" часто заменяется на "значение", особенно в случае количественных предикатов) (в терминах Wikidata элемент-свойство-значения, item-property-values). Wikidata — открытый проект, потенциально интересный в гео-проектах и доступный в виде публичной SPARQL-точки
Запросы к Wikidata можно составлять с помощью различных SPARQL-клиентов. Ключевая особенность Wikidata — это общедоступная и публичная точка доступа SPARQL, включающая в том числе простой веб-интерфейс.
У сервиса query.wikidata.org есть целое руководство на английском языке https://www.mediawiki.org/wiki/Wikidata_query_service/User_Manual и репозиторий для разработчиков https://github.com/wikimedia/wikidata-query-rdf.
Обратите внимание, что результаты запросов можно скачать в формате CSV — хорошее подспорье для более серьёзной работы при помощи других инструментов.
В таблице результатов (в нижней части экрана) можно отфильтровать результаты, используя поиск по всем полям сразу (например, можно попробовать найти "Moscow").
Для помощи по терминологии и модели Wikidata можно посмотреть сюда: Викиданные:Глоссарий.
Структуру элемента (item) и свойства (property) можно найти на англоязычной странице Wikibase/DataModel/Primer.
Диаграмма русскоязычной терминологии утверждений в Викиданных
Полный перечень свойств: Wikidata:List_of_properties
Отчёт количества использований каждого свойства - Wikidata:Database_reports/List_of_properties/all
Полный перечень: Wikidata:List_of_properties/Geographical_feature
Blazegraph — расширение от Wikidata к Blazegraph, чтобы сделать запросы к Wikibase более эффективными. Имеет лицензию GPLv2.
Т.к. исходные данные представляют граф (элемент-свойство-значения) и его модификации (в Wikidata: квалификаторы, ссылки и др.), то большинство SPARQL-запросов строятся вокруг поиска паттернов в графе[1], зачастую нескольких.
Самый простой пример.
SELECT ?item ?relationid ?itemLabel ?countrydialingcode ?localdialingcode WHERE {
?item wdt:P17 wd:Q159.
?item wdt:P31 wd:Q515.
OPTIONAL {
?item wdt:P402 ?relationid.
}
?item wdt:P473 ?localdialingcode.
wd:Q159 wdt:P474 ?countrydialingcode.
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
Этот пример призван показать всю простоту JOIN-ов в SPARQL.
Для подходящего первичного ключа (в реляционных терминах) было достаточно найти только сам предикат (город-побратим).
Более того, в отличие от реляционных подходов, мы избавлены от вопросов: "в какой именно таблице хранятся города", "в какой таблице хранится информация о побратимстве". Сложность отличий нормальных форм не сбрасывается сразу на пользователя на уровне языка запросов. Необходимость в тщательном дизайне баз данных (таблиц и отношений) тоже уменьшается (по сравнению с табличным подходом и SQL).
Составители SPARQL-запросов просто исследуют данные запросами, а не думают постоянно, где именно эти данные расположены и как именно они связаны между собой.
SELECT DISTINCT ?wikidataCity ?russianPlace ?country WHERE {
?russianPlace wdt:P17 wd:Q159 .
?russianPlace wdt:P190 ?wikidataCity .
?wikidataCity wdt:P17 ?country .
FILTER NOT EXISTS {?country wdt:P31 wd:Q3024240}
}
ORDER BY ?russianPlace ?country
В отличие от OpenStreetMap, Wikidata не ограничен "существующими прямо сейчас" объектами. Это можно использовать как хороший пример исключения из результатов.
SELECT DISTINCT ?country ?countryLabel ?capital ?capitalLabel
WHERE
{
?country wdt:P31 wd:Q3624078 .
FILTER NOT EXISTS {?country wdt:P31 wd:Q3024240}
OPTIONAL { ?country wdt:P36 ?capital } .
SERVICE wikibase:label { bd:serviceParam wikibase:language "ru", "en" }
}
ORDER BY ?countryLabel
Города, отличающиеся от Перми менее чем на 1000 человек по численности населения.
#defaultView:Map
SELECT DISTINCT ?city ?cityLabel ?populatie2 ?coor WHERE {
wd:Q915 wdt:P1082 ?populatie .
?city wdt:P1082 ?populatie2 .
?city wdt:P625 ?coor .
FILTER (abs(?populatie - ?populatie2) < 1000)
SERVICE wikibase:label { bd:serviceParam wikibase:language "ru,en" }
}
#defaultView:Map
SELECT DISTINCT ?city ?cityLabel ?population ?layer ?coordinates WHERE {
?city wdt:P17 wd:Q159.
?city wdt:P31 wd:Q515.
OPTIONAL { ?city wdt:P1082 ?population. }
?city wdt:P625 ?coordinates.
BIND(
IF(?population < 500, "500",
IF(?population < 10000, "10K",
IF(?population < 100000, "100K",
IF(?population < 1000000, "1M",
IF(?population < 10000000, "10M",
">20M")))))
AS ?layer).
SERVICE wikibase:label { bd:serviceParam wikibase:language "ru,en" }
}
ORDER BY
DESC(?population)
#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". }
}
#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". }
}
Если открыть Пермь, то там указанно множество значений у численности населения (P1082), причём все значения — одного ранга (нормальный).
У некоторых из значений численности населения указаны квалификаторы (qualifier) P585 (момент времени) и P459 (метод определения).
SELECT ?val ?qualifier ?wikidataid WHERE {
wd:Q915 p:P1082 ?statements .
?statements ps:P1082 ?val .
?statements pq:P585 ?qualifier .
OPTIONAL { ?statements pq:P459 ?wikidataid . }
}
Показать все страны, относящиеся (и относившиеся ранее) к Перми, и их ранги.
SELECT DISTINCT ?doLabel ?do ?rank WHERE {
# VALUES ?rank { wikibase:DeprecatedRank wikibase:NormalRank wikibase:PreferredRank }
wd:Q915 p:P17 ?value.
?value ps:P17 ?do .
?value wikibase:rank ?rank .
SERVICE wikibase:label {
bd:serviceParam wikibase:language "ru" .
}
}
Часть примеров:
Более сложные примеры: https://bitbucket.org/sulab/wikidatasparqlexamples
Нужно отметить, что SPARQL подразумевает только запросы на чтение. Часть языка на обновление, добавление и удаление данных — SPARQL 1.1 Update — в данной статье не рассматривалась.
Для доступа на запись вам необходимо ознакомиться с короткой процедурой регистрации ботов и отправить заявку участника-ботовода.
Обсудить в форуме Комментариев 7Редактировать в вики
Последнее обновление: 2016-11-28 11:28
Дата создания:
Автор(ы): d1g
© GIS-Lab и авторы, 2002-2021. При использовании материалов сайта, ссылка на GIS-Lab и авторов обязательна. Содержание материалов - ответственность авторов. (подробнее).