Запрос данных открытых сообществ данных с помощью 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

Результаты SPARQL

в конечной точке, связанной выше. (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

Результаты SPARQL

Результаты таковы:

-----------------------------------------------------------------------------------------------------------------------------
| 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

Результаты SPARQL

Результаты будут такими же, конечно. Внизу каждой из этих страниц результатов можно загрузить результаты в нескольких других форматах. Одним из форматов является 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 

Результаты SPARQL

Теперь в наборе данных 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 
  }
}

Результаты SPARQL

Использование 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. TA2 District GeoJson

Другие вопросы по тегам