SPARQL на примерах Wikidata: различия между версиями
D1g (обсуждение | вклад) |
D1g (обсуждение | вклад) (перевёл часть запросов из ссылок на русский) |
||
Строка 18: | Строка 18: | ||
== Wikidata == | == Wikidata == | ||
В рамках gis-lab в первую очередь интересуют предикаты (свойства объектов) относящиеся к географическим свойствам. | В рамках gis-lab в первую очередь интересуют предикаты (свойства объектов) относящиеся к географическим свойствам. | ||
=== Предикаты Wikidata === | |||
* дата прекращения существования - https://www.wikidata.org/wiki/Property:P576 | |||
* дата окончания - https://www.wikidata.org/wiki/Property:P582 | |||
=== Географические предикаты в Wikidata === | === Географические предикаты в Wikidata === | ||
* Координаты (точка) - https://www.wikidata.org/wiki/Property:P625 (при выборке этого свойства появляется возможность представить результаты на карте в нижней части экрана) | |||
* ID отношения из OpenStreetMap - https://www.wikidata.org/wiki/Property:P402 | * ID отношения из OpenStreetMap - https://www.wikidata.org/wiki/Property:P402 | ||
* принадлежность стране - https://www.wikidata.org/wiki/Property:P17 | * принадлежность стране - https://www.wikidata.org/wiki/Property:P17 | ||
* столица - https://www.wikidata.org/wiki/Property:P36 | |||
* численность населения - https://www.wikidata.org/wiki/Property:P1082 | |||
=== Географические объекты в Wikidata === | === Географические объекты в Wikidata === | ||
* континент - https://www.wikidata.org/wiki/Q5107 | |||
* суверенное государство - https://www.wikidata.org/wiki/Q3624078 | |||
* историческое государство - https://www.wikidata.org/wiki/Q3024240 | |||
* город - https://www.wikidata.org/wiki/Q515 | * город - https://www.wikidata.org/wiki/Q515 | ||
* северный полюс - https://www.wikidata.org/wiki/Q934 | |||
* южный полюс - https://www.wikidata.org/wiki/Q933 | |||
== Элементы запросов == | |||
=== Города в России с телефонными кодами === | === Города в России с телефонными кодами === | ||
Самый простой пример. | |||
* 1 строка: SELECT запросы<ref>https://www.w3.org/TR/sparql11-query/#QueryForms</ref> выбирают данные или их часть | * 1 строка: SELECT запросы<ref>https://www.w3.org/TR/sparql11-query/#QueryForms</ref> выбирают данные или их часть | ||
* 2 строка: выбираем субъекты (?item) у которых явно указано, что они в стране - ''Россия'' (Q159) | * 2 строка: выбираем субъекты (?item) у которых явно указано, что они в стране - ''Россия'' (Q159) | ||
Строка 48: | Строка 61: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
=== Бывшие столицы государств === | |||
[https://query.wikidata.org/#%23defaultView%3AMap%0ASELECT%20DISTINCT%20%3Fcountry%20%3FcountryLabel%20%3Fcapital%20%3FcapitalLabel%20%3Fcoordinates%20%3Fended%0AWHERE%0A%7B%0A%20%20%3Fcountry%20p%3AP36%20%3Fstat.%0A%20%20%3Fstat%20ps%3AP36%20%3Fcapital.%0A%20%20%3Fcapital%20wdt%3AP625%20%3Fcoordinates.%0A%20%20OPTIONAL%20%7B%0A%20%20%20%20%3Fcountry%20wdt%3AP582%7Cwdt%3AP576%20%3Fended.%0A%20%20%7D%0A%20%20OPTIONAL%20%7B%0A%20%20%20%20%3Fcapital%20wdt%3AP582%7Cwdt%3AP576%20%3Fended.%0A%20%20%7D%0A%20%20OPTIONAL%20%7B%0A%20%20%20%20%3Fstat%20pq%3AP582%20%3Fended.%0A%20%20%7D%0A%20%20FILTER%28BOUND%28%3Fended%29%29.%0A%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 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". } | |||
} | |||
</syntaxhighlight> | |||
=== Города примерно с таким же населением как и Пермь === | |||
± 1000 населения | |||
[https://query.wikidata.org/#%23defaultView%3AMap%0ASELECT%20DISTINCT%20%3Fcity%20%3FcityLabel%20%3Fpopulatie2%20%3Fcoor%20WHERE%20%7B%0A%20%20wd%3AQ915%20wdt%3AP1082%20%3Fpopulatie%20.%0A%20%20%3Fcity%20wdt%3AP1082%20%3Fpopulatie2%20%3B%0A%20%20%20%20%20%20%20%20wdt%3AP625%20%3Fcoor%20.%0A%20%20FILTER%20%28abs%28%3Fpopulatie%20-%20%3Fpopulatie2%29%20%3C%201000%29%0A%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 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" } | |||
} | |||
</syntaxhighlight> | |||
== Примеры запросов == | |||
Часть [https://www.wikidata.org/wiki/Wikidata:SPARQL_query_service/queries/examples примеров]: | |||
* [https://query.wikidata.org/#SELECT%20%3Fcontinent%20%3FcontinentLabel%0AWHERE%0A%7B%0A%20%20%3Fcontinent%20wdt%3AP31%20wd%3AQ5107.%0A%20%20SERVICE%20wikibase%3Alabel%20%7B%20bd%3AserviceParam%20wikibase%3Alanguage%20%22ru%22.%20%7D%0A%7D%0AORDER%20BY%20xsd%3Ainteger%28SUBSTR%28STR%28%3Fcontinent%29%2CSTRLEN%28%22http%3A%2F%2Fwww.wikidata.org%2Fentity%2FQ%22%29%2B1%29%29 Все континенты из Wikidata, отсортированные по убыванию их Wikidata идентификатора] | |||
* [https://query.wikidata.org/#%23defaultView%3AMap%0ASELECT%20%3Fplace%20%3FplaceLabel%20%3Flocation%20WHERE%20%7B%0A%20%20wd%3AQ933%20wdt%3AP625%20%3FsouthPole.%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20coordinates%20of%20south%20pole%0A%20%20%3Fplace%20wdt%3AP30%20wd%3AQ51%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20continent%3A%20antarctica%0A%20%20%20%20%20%20%20%20%20wdt%3AP625%20%3Flocation.%0A%20%20FILTER%28geof%3Adistance%28%3Flocation%2C%20%3FsouthPole%29%20%3E%203000%29.%20%23%20over%203000%3Fkm%20away%20from%20south%20pole%0A%20%20SERVICE%20wikibase%3Alabel%20%7B%20bd%3AserviceParam%20wikibase%3Alanguage%20%22ru%22.%20%7D%0A%7D Объекты в более чем 3000 км от южного полюса, но всё ещё относящиеся к Антарктике] | |||
* [https://query.wikidata.org/#SELECT%20DISTINCT%20%3Fcountry%20%3FcountryLabel%20%3Fcapital%20%3FcapitalLabel%0AWHERE%0A%7B%0A%20%20%3Fcountry%20wdt%3AP31%20wd%3AQ3624078%20.%0A%20%20FILTER%20NOT%20EXISTS%20%7B%3Fcountry%20wdt%3AP31%20wd%3AQ3024240%7D%0A%20%20OPTIONAL%20%7B%20%3Fcountry%20wdt%3AP36%20%3Fcapital%20%7D%20.%0A%0A%20%20SERVICE%20wikibase%3Alabel%20%7B%20bd%3AserviceParam%20wikibase%3Alanguage%20%22ru%22%20%7D%0A%7D%0AORDER%20BY%20%3FcountryLabel Существующие страны и их столицы, алфавитно] | |||
* [https://query.wikidata.org/#SELECT%20DISTINCT%20%3FcountryLabel%20%3Fpopulation%0A%7B%0A%20%20%3Fcountry%20wdt%3AP31%20wd%3AQ6256%20%3B%0A%20%20%20%20%20%20%20%20%20%20%20wdt%3AP1082%20%3Fpopulation%20.%0A%20%20SERVICE%20wikibase%3Alabel%20%7B%20bd%3AserviceParam%20wikibase%3Alanguage%20%22ru%22%20%7D%0A%7D%0AGROUP%20BY%20%3Fpopulation%20%3FcountryLabel%0AORDER%20BY%20DESC%28%3Fpopulation%29 Страны по убыванию населения] | |||
* [https://query.wikidata.org/#%23defaultView%3AMap%0ASELECT%20DISTINCT%20%3Fcity%20%3FcityLabel%20%3Fpopulation%20%3Fcountry%20%3FcountryLabel%20%3Floc%20WHERE%20%7B%0A%09%7B%0A%09%09SELECT%20%28MAX%28%3Fpopulation%29%20AS%20%3Fpopulation%29%20%3Fcountry%20WHERE%20%7B%0A%09%09%09%3Fcity%20wdt%3AP31%2Fwdt%3AP279%2a%20wd%3AQ515%20.%0A%09%09%09%3Fcity%20wdt%3AP1082%20%3Fpopulation%20.%0A%09%09%09%3Fcity%20wdt%3AP17%20%3Fcountry%20.%0A%09%09%7D%0A%09%09GROUP%20BY%20%3Fcountry%0A%09%09ORDER%20BY%20DESC%28%3Fpopulation%29%0A%09%7D%0A%09%3Fcity%20wdt%3AP31%2Fwdt%3AP279%2a%20wd%3AQ515%20.%0A%09%3Fcity%20wdt%3AP1082%20%3Fpopulation%20.%0A%09%3Fcity%20wdt%3AP17%20%3Fcountry%20.%0A%09%3Fcity%20wdt%3AP625%20%3Floc%20.%0A%09SERVICE%20wikibase%3Alabel%20%7B%0A%09%09bd%3AserviceParam%20wikibase%3Alanguage%20%22ru%22%20.%0A%09%7D%0A%7D Самый населённый город в каждой стране] | |||
* [https://query.wikidata.org/#SELECT%0A%09%3Fcountry%20%3FcountryLabel%0A%09%3FwikiPersons%0A%09%3Fpopulation%0A%09%28ROUND%28%3FwikiPersons%2F%3Fpopulation%2a1000000%29%20AS%20%3FwikiPersonsPerM%29%0AWHERE%0A%7B%0A%09%7B%20SELECT%20%3Fcountry%20%28count%28%2a%29%20as%20%3FwikiPersons%29%20WHERE%20%7B%0A%09%09%7BSELECT%20DISTINCT%20%3Fperson%20%3Fcountry%20WHERE%20%7B%0A%09%09%09%3Fcountry%20wdt%3AP31%20wd%3AQ185441%20.%0A%09%09%09%23%20BIND%28%20wd%3AQ30%20AS%20%3Fcountry%20%29%20%23%20use%20instead%20of%20previous%20line%20to%20check%20individual%20countries%0A%09%09%09%3Fperson%20wdt%3AP31%20wd%3AQ5%20.%0A%09%09%09%3Fperson%20wdt%3AP27%20%3Fcountry%20.%0A%09%09%09FILTER%20NOT%20EXISTS%7B%20%3Fperson%20wdt%3AP570%20%3Fdate%20%7D%20%23%20only%20count%20living%20people%0A%09%09%7D%20%7D%0A%09%7D%20GROUP%20BY%20%3Fcountry%20%20%7D%0A%09%3Fcountry%20wdt%3AP1082%20%3Fpopulation%0A%09SERVICE%20wikibase%3Alabel%20%7B%20bd%3AserviceParam%20wikibase%3Alanguage%20%22ru%22%20%7D%0A%7D%0AORDER%20BY%20DESC%28%3FwikiPersonsPerM%29 Количество записей о людях в Викиданных на каждый миллион населения в данной стране] | |||
== Внешние ссылки == | == Внешние ссылки == | ||
<references/> | <references/> |
Версия от 08:59, 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
- дата прекращения существования - https://www.wikidata.org/wiki/Property:P576
- дата окончания - https://www.wikidata.org/wiki/Property:P582
Географические предикаты в Wikidata
- Координаты (точка) - https://www.wikidata.org/wiki/Property:P625 (при выборке этого свойства появляется возможность представить результаты на карте в нижней части экрана)
- ID отношения из OpenStreetMap - https://www.wikidata.org/wiki/Property:P402
- принадлежность стране - https://www.wikidata.org/wiki/Property:P17
- столица - https://www.wikidata.org/wiki/Property:P36
- численность населения - https://www.wikidata.org/wiki/Property:P1082
Географические объекты в Wikidata
- континент - https://www.wikidata.org/wiki/Q5107
- суверенное государство - https://www.wikidata.org/wiki/Q3624078
- историческое государство - https://www.wikidata.org/wiki/Q3024240
- город - https://www.wikidata.org/wiki/Q515
- северный полюс - https://www.wikidata.org/wiki/Q934
- южный полюс - https://www.wikidata.org/wiki/Q933
Элементы запросов
Города в России с телефонными кодами
Самый простой пример.
- 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 его нет вообще.
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". }
}
Бывшие столицы государств
#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". }
}
Города примерно с таким же населением как и Пермь
± 1000 населения
#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" }
}
Примеры запросов
Часть примеров:
- Все континенты из Wikidata, отсортированные по убыванию их Wikidata идентификатора
- Объекты в более чем 3000 км от южного полюса, но всё ещё относящиеся к Антарктике
- Существующие страны и их столицы, алфавитно
- Страны по убыванию населения
- Самый населённый город в каждой стране
- Количество записей о людях в Викиданных на каждый миллион населения в данной стране