Запрос данных открытых сообществ данных с помощью SPARQL
Я пытаюсь получить некоторую информацию из супер выходных областей нижнего уровня (LSOA) и наборов данных почтовых индексов Великобритании.
Мне нужен почтовый индекс и информация lsoa в дампе данных для использования в Excel.
Обозначения и метки типа "Область верхнего вывода нижнего уровня". http://opendatacommunities.org/doc/geography/lsoa/E01009437
Например, "lsoa" для каждого типа "Почтовый индекс" http://opendatacommunities.org/resource?uri=http%3A%2F%2Fdata.ordnancesurvey.co.uk%2Fid%2Fpostcodeunit%2FB721NB
Я понятия не имею, как использовать движок SPARQL на сайте, чтобы получить эту информацию, или как извлечь информацию из файла N-Triples, который я скачал...
2 ответа
Есть два основных варианта получения нужных вам данных. В некоторых случаях можно запрашивать данные с помощью общедоступной конечной точки SPARQL. Это, вероятно, наиболее удобный подход, и его следует использовать, если нет какой-либо определенной причины, по которой вам нужны данные локально. Однако у этого подхода есть ограничения, и в этих случаях имеет смысл загружать набор данных и запрашивать его локально. Сначала я опишу решение для удаленной конечной точки, а затем решение с использованием локальных запросов. Ограничения конечной точки SPARQL (например, жесткие тайм-ауты) означают, что первого подхода недостаточно для этой конкретной задачи, поэтому конкретный ответ на этот вопрос - второй подход.
До этого вопроса я не был знаком с этими конкретными наборами данных и онтологиями, поэтому первый подход также проходит через процесс "ознакомления с данными".
Использование конечной точки SPARQL
Существует конечная точка SPARQL Open Data Communities, к которой вы можете выполнять запросы и получать некоторые данные. Я не смотрел эти данные раньше, поэтому вместо того, чтобы просто публиковать окончательный ответ, я пройдусь по процессу, который использовал, чтобы выяснить, какой запрос нужно выполнить.
На одной из страниц, на которую вы ссылаетесь, B72 1NB, упоминается, что ресурс имеет тип PostcodeUnit, который имеет URI
http://data.ordnancesurvey.co.uk/ontology/postcode/PostcodeUnit
Исходя из этого, первое, что я попробовал, был запрос SPARQL, чтобы попытаться получить некоторые единицы почтового индекса, поэтому я использовал следующий запрос в конечной точке выше. (Если вы скопируете и вставите его туда, перед удалением SELECT
, Я должен был сделать это, во всяком случае.)
SELECT * WHERE {
?postcodeUnit a <http://data.ordnancesurvey.co.uk/ontology/postcode/PostcodeUnit>
}
LIMIT 10
в конечной точке, связанной выше. (The LIMIT
помогает обеспечить своевременное возвращение результатов, и что мы не просим сервер делать слишком много.)
--------------------------------------------------------------
| postcodeUnit |
==============================================================
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/TA219HB> |
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/TF109DS> |
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/SY256SA> |
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/SY147HR> |
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/TF107BZ> |
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/SY134LH> |
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/TA202HF> |
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/SY44QZ> |
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/TA116SS> |
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/SY209DR> |
--------------------------------------------------------------
На странице B72 1NB его изоа отображается как Бирмингем 006C. IRI для lsoa
свойство (и вы можете увидеть это в данных, которые вы загрузили)
http://opendatacommunities.org/def/geography#lsoa
поэтому мы расширяем запрос SPARQL
SELECT * WHERE {
?postcodeUnit
a <http://data.ordnancesurvey.co.uk/ontology/postcode/PostcodeUnit> ;
<http://opendatacommunities.org/def/geography#lsoa> ?lsoa .
}
LIMIT 10
Результаты таковы:
-----------------------------------------------------------------------------------------------------------------------------
| postcodeUnit | lsoa |
=============================================================================================================================
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/TA219HB> | <http://opendatacommunities.org/id/geography/lsoa/E01029309> |
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/TF109DS> | <http://opendatacommunities.org/id/geography/lsoa/E01029706> |
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/SY147HR> | <http://opendatacommunities.org/id/geography/lsoa/E01018373> |
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/TF107BZ> | <http://opendatacommunities.org/id/geography/lsoa/E01014172> |
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/SY134LH> | <http://opendatacommunities.org/id/geography/lsoa/E01018514> |
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/TA202HF> | <http://opendatacommunities.org/id/geography/lsoa/E01029175> |
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/SY44QZ> | <http://opendatacommunities.org/id/geography/lsoa/E01014204> |
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/TA116SS> | <http://opendatacommunities.org/id/geography/lsoa/E01029225> |
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/SW65TP> | <http://opendatacommunities.org/id/geography/lsoa/E01001950> |
| <http://data.ordnancesurvey.co.uk/id/postcodeunit/TF15AX> | <http://opendatacommunities.org/id/geography/lsoa/E01014155> |
-----------------------------------------------------------------------------------------------------------------------------
Вы можете использовать префиксы в своем запросе, если хотите сделать его более читабельным и лаконичным:
PREFIX pc: <http://data.ordnancesurvey.co.uk/ontology/postcode/>
PREFIX geo: <http://opendatacommunities.org/def/geography#>
SELECT * WHERE {
?postcodeUnit
a pc:PostcodeUnit ;
geo:lsoa ?lsoa .
}
LIMIT 10
Результаты будут такими же, конечно. Внизу каждой из этих страниц результатов можно загрузить результаты в нескольких других форматах. Одним из форматов является CSV, и вам может повезти, если вы импортируете его непосредственно в электронную таблицу (вы сказали, что хотите использовать данные в Excel).
Обсуждение в комментариях указало, что огромное количество PostcodeUnit
s делает набор результатов очень большим. Набор данных почтовых индексов Великобритании содержит четыре типа ресурсов в порядке увеличения размера: единицы почтовых индексов, сектора почтовых индексов, районы почтовых индексов и области почтовых индексов. Существует 1686911, 10833, 2087 и 120 ресурсов этих типов соответственно. Как я понимаю, пояснения в комментариях, идея заключается в том, чтобы связать их с областями сверхвысокого уровня (LSOA), например, Бирмингем 006C. Отдельные блоки почтовых индексов связаны с LSOA, но области почтовых индексов более высокого уровня - нет. Каждая единица почтового индекса находится в пределах своего сектора, района и области. Например, TA21 9HB находится в пределах TA, TA21 9 и TA21. Используя эту информацию, мы можем запросить единицы почтового индекса и соответствующий им район (или сектор, или область), а также их LSOA, и сообщить только о районе и LSOA, игнорируя сам блок. Например:
PREFIX pc: <http://data.ordnancesurvey.co.uk/ontology/postcode/>
PREFIX geo: <http://opendatacommunities.org/def/geography#>
PREFIX sr: <http://data.ordnancesurvey.co.uk/ontology/spatialrelations/>
SELECT DISTINCT ?district ?lsoa
WHERE {
?postcodeunit a pc:PostcodeUnit ;
geo:lsoa ?lsoa ;
sr:within ?district .
?district a pc:PostcodeDistrict .
}
LIMIT 10
Теперь в наборе данных 34378 LSOA, так что все еще есть много данных, которые нужно выбрать, и попытка вытащить текстовые результаты для всех различных отображений лоса / района по-прежнему приводит к тайм-ауту. На самом деле, поскольку каждый LSOA связан (я ожидаю) с каким-то районом, результатов, вероятно, будет столько же, сколько LSOA.
Похоже, что именно в этот момент мы начинаем выходить за пределы размера ответа и тайм-ауты для конечной точки SPARQL, и нам нужно начать доступ к данным локально. Только данные почтового индекса составляют 5,6 ГБ, так что это не замечательное решение.
Но, если вы хотите использовать репрезентативную LSOA для каждого района, мы можем использовать подзапросы SPARQL для их извлечения, как в следующем запросе, который сначала извлекает все районы с почтовым индексом, а затем для каждого находит отдельную LSOA, которая какой-то почтовый индекс в округе есть. Я не знаю, является ли это приемлемым результатом, но вы получаете LSOA для каждого района, и результаты достаточно малы (есть 2087 строк, столько же, сколько и округов), чтобы их можно было опустить в любой из форматов результатов (включая CSV).
PREFIX pc: <http://data.ordnancesurvey.co.uk/ontology/postcode/>
PREFIX geo: <http://opendatacommunities.org/def/geography#>
PREFIX sr: <http://data.ordnancesurvey.co.uk/ontology/spatialrelations/>
SELECT ?region ?lsoa
WHERE {
{
SELECT ?region WHERE {
?region a pc:PostcodeDistrict .
}
}
{
SELECT ?lsoa WHERE {
?postcodeunit a pc:PostcodeUnit ;
geo:lsoa ?lsoa ;
sr:within ?region .
}
LIMIT 1
}
}
Использование TDB локально
Существуют ограничения на использование конечной точки SPARQL, такие как время ожидания, указанное выше. В этих ситуациях нетрудно загрузить данные и поместить их в хранилище Jena TDB и выполнить запрос, используя tdbquery
, На странице почтовых индексов Великобритании есть ссылка для скачивания z-n-троек. После загрузки этих данных (и установки Apache Jena 2.10) я запустился (в системе Unix):
$ tdbloader2 --loc tdb dataset_data_postcodes_20130506183000.nt
где tdb
это локальный каталог, который я создаю для хранения индексов TDB. Загрузка данных занимает некоторое время (1125 секунд здесь), как и индексирование. После того, как все загружено, я сохранил следующий запрос в файле с именем postcodes.sparql
и выполнил запрос с
$ tdbquery --loc tdb --results CSV --query postcodes.sparql > unit_lsoa.csv
генерировать результаты в формате CSV, хранящиеся в файле unit_lsoa.csv
, Вот первые несколько строк:
$ head -5 unit_lsoa.csv
postcodeUnit,lsoa
http://data.ordnancesurvey.co.uk/id/postcodeunit/AL11AE,http://opendatacommunities.org/id/geography/lsoa/E01023667
http://data.ordnancesurvey.co.uk/id/postcodeunit/AL11AG,http://opendatacommunities.org/id/geography/lsoa/E01023741
http://data.ordnancesurvey.co.uk/id/postcodeunit/AL11AJ,http://opendatacommunities.org/id/geography/lsoa/E01023741
http://data.ordnancesurvey.co.uk/id/postcodeunit/AL11AR,http://opendatacommunities.org/id/geography/lsoa/E01023684
Теперь было 1686911 определенных почтовых индексов, поэтому я изначально ожидал, что в строке будет столько же unit_lsoa.csv
, Однако их примерно на 200000 меньше. (wc -l
печатает количество строк в файле.)
$ wc -l unit_lsoa.csv
1440143 unit_lsoa.csv
Как выясняется, некоторые из блоков почтовых индексов не имеют связанных LSOA. Я проверил это, запустив запрос
PREFIX pc: <http://data.ordnancesurvey.co.uk/ontology/postcode/>
PREFIX geo: <http://opendatacommunities.org/def/geography#>
SELECT * WHERE {
?postcodeUnit
a pc:PostcodeUnit .
FILTER NOT EXISTS { ?postcodeUnit geo:lsoa ?lsoa }
}
хранится в файле postcodes_without_lsoa.sparql
:
$ tdbquery --loc tdb \
--results CSV \
--query postcodes_without_lsoa.sparql > unit_without_lsoa.csv
Конечно же, есть около 200000 строк в unit_without_lsoa.csv
:
$ wc -l unit_without_lsoa.csv
246770 unit_without_lsoa.csv
Сумма 1440143 и 246770 равна 1686913, что является точным количеством почтовых индексов (плюс 2 строки для заголовков в каждом файле CSV). Миссия выполнена!
Вы можете использовать веб-сервис для получения этой информации. Вы можете использовать почтовый индекс Великобритании (например, ZE1 0AE), сектор, район, город и границы округа.
https://www.mashape.com/vanitysoft/uk-boundaries-io
Вот пример из запроса почтового округа. TA2 возвращает коллекцию полигонов (GeoJson) секторов, которые составляют район TA2.