Загрузка границ GeoJSON с использованием SPARQL из общедоступных данных

Мне интересно загрузить некоторые файлы границ из statistics.gov.scot, который является официальной статистикой репозиторий для обмена статистическими данными, использующими запросы SPARQL.

Фон

statistics.gov.scot обеспечивает доступ к границам GeoJSON для числа административных и статистических географических регионов, например административные границы локальных органов власти или доски для здоровья. В моем конкретном случае мне интересно загрузить набор данных с границами GeoJSON, относящимися к зонам данных. Зоны данных представляют собой статистические географии, разработанные с целью распространения данных о результатах жизни на небольшом уровне площади. При доступе через статистика .gov.scot область данных образцов выглядит следующим образом:

Пример зоны данных

К географии и связанным с ней данным можно отнести здесь. Соответствующие данные GeoJSON доступны здесь.

Проблема

Зоны данных доступны в двух итерациях, выпущенных в 2004 году, а другой обновлен в последнее время. Я хотел бы загрузить первую итерацию, выпущенную в 2004 году. Следуя информации о статистических объектах я составил следующий запрос:

PREFIX entity: <http://statistics.data.gov.uk/def/statistical-entity#>
PREFIX boundaries: <http://statistics.gov.scot/boundaries/>

SELECT ?boundary 
    WHERE {
        entity:introduced <http://reference.data.gov.uk/id/day/2004-02-01>
  }

LIMIT 1000

который возвращает следующее сообщение об ошибке:

Error There was a syntax error in your query: Encountered " "}" "} "" at line 7,
column 3. Was expecting one of: <IRIref> ... <PNAME_NS> ... <PNAME_LN> ...
<BLANK_NODE_LABEL> ... <VAR1> ... <VAR2> ... "true" ... "false" ... <INTEGER> ...
<DECIMAL> ... <DOUBLE> ... <INTEGER_POSITIVE> ... <DECIMAL_POSITIVE> ...
<DOUBLE_POSITIVE> ... <INTEGER_NEGATIVE> ... <DECIMAL_NEGATIVE> ...
<DOUBLE_NEGATIVE> ... <STRING_LITERAL1> ... <STRING_LITERAL2> ...
<STRING_LITERAL_LONG1> ... <STRING_LITERAL_LONG2> ... "(" ... <NIL> ... "[" ...
<ANON> ... "+" ... "*" ... "/" ... "|" ... "?" ...

при тестировании через конечную точку: http://statistics.gov.scot/sparql.

Комментарии

В идеале я хотел бы разработать другие запросы, которые позволили бы мне использовать другие статистические географические регионы, используя префикс entity:. Это должно быть возможно, так как entity: будет содержать информацию о доступных географических точках (имя, аббревиатура, дата создания).


Запрос:

PREFIX entity: <http://statistics.data.gov.uk/def/statistical-entity#>
PREFIX boundaries: <http://statistics.gov.scot/boundaries/>

SELECT DISTINCT ?boundary ?shape WHERE {
  ?shape entity:firstcode ?boundary
}

LIMIT 1000

Поделил меня чем-то, что похоже на список желаемых географических регионов, но я изо всех сил пытаюсь исправить границы GeoJSON.

Ответ 1

Ни статистика .gov.scot, ни statistics.data.gov.uk не содержит границы зон данных как WKT или строковые литералы.

Однако со следующим запросом можно легко создать URI файлов GeoJSON, которые используются на страницах ресурсов:

PREFIX pref1: <http://statistics.data.gov.uk/def/statistical-entity#>
PREFIX pref2: <http://statistics.gov.scot/id/statistical-entity/>
PREFIX pref3: <http://statistics.data.gov.uk/def/boundary-change/>
PREFIX pref4: <http://reference.data.gov.uk/id/day/>
PREFIX pref5: <http://statistics.data.gov.uk/def/statistical-geography#>
PREFIX pref6: <http://statistics.gov.scot/id/statistical-geography/>
PREFIX pref7: <http://statistics.gov.scot/boundaries/>

SELECT ?zone ?name ?json {
   ?zone pref1:code pref2:S01 .
   ?zone pref3:operativedate pref4:2004-02-01
   OPTIONAL { ?zone pref5:officialname ?name }
   BIND (CONCAT(REPLACE(STR(?zone), STR(pref6:), STR(pref7:)), ".json") AS ?json)
} ORDER BY (!bound(?name)) ASC(?name)

После этого можно легко получить файлы GeoJSON с помощью wget -i или что-то вроде этого.

Некоторое объяснение

Вы должны использовать <http://statistics.data.gov.uk/def/boundary-change/operativedate> вместо <http://statistics.data.gov.uk/def/statistical-entity#introduced>, последнее свойство скорее свойство класса:

SELECT * WHERE {
    ?S <http://statistics.data.gov.uk/def/statistical-entity#introduced> ?date .
    ?S <http://www.w3.org/2000/01/rdf-schema#label> ?label
}

Зоны данных второго поколения датируются 2014-11-06:

SELECT ?date (COUNT(?zone) AS ?count) WHERE {
    ?zone
        <http://statistics.data.gov.uk/def/statistical-entity#code>
            <http://statistics.gov.scot/id/statistical-entity/S01> ;
        <http://statistics.data.gov.uk/def/boundary-change/operativedate>
            ?date 
} GROUP BY ?date

Аналогично, если вам нужны URL-адреса соответствующих файлов GeoJSON, ваш запрос должен быть:

SELECT ?zone ?name ?json {
   ?zone pref1:code pref2:S01 .
   ?zone pref3:operativedate pref4:2014-11-06 .
   ?zone pref5:officialname ?name 
   BIND (CONCAT(REPLACE(STR(?zone), STR(pref6:), STR(pref7:)), ".json") AS ?json)
} ORDER BY ASC(?name)

Вам не нужно OPTIONAL, потому что все зоны данных второго поколения имеют "официальные имена".


Вероятно, эта страница на data.gov.uk будет интересна для вас.
Существует также opendata.stackexchange.com для вопросов, связанных с открытыми данными.

Ответ 2

В первом запросе отсутствует предмет. Запрос SPARQL определяет набор тройных шаблонов - субъект, предикат и объект - для соответствия графику RDF. Чтобы превратить предложение WHERE в тройной шаблон SPARQL, попробуйте:

?boundary entity:introduced <http://reference.data.gov.uk/id/day/2004-02-01>