使用SPARQL查询开放数据社区数据

use*_*580 3 rdf sparql n-triples

我正在尝试从低层超级输出区域(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文件中提取信息...

Jos*_*lor 13

检索所需数据有两个主要选项.在某些情况下,可以使用公共可用的SPARQL端点查询数据.这可能是最方便的方法,除非有一些明确的理由需要本地数据,否则这个方法.但是,这种方法存在局限性,在这些情况下,在本地下载数据集并对其进行查询是有意义的.我将首先描述远程端点解决方案,然后使用本地查询描述解决方案.SPARQL端点的限制(例如,硬超时)意味着第一种方法不足以完成此特定任务,因此该问题的具体答案是第二种方法.

在这个问题之前我不熟悉这些特定的数据集和本体,所以第一种方法也走过了"熟悉数据"的过程.

使用SPARQL端点

有一个Open Data Communities SPARQL端点,您可以根据该端点运行查询并获取一些数据.我之前没有看过这些数据,所以我不会只是发布最终答案,而是会介绍我用来确定要运行什么类型查询的过程.

您链接到的其中一个页面B72 1NB提到该资源的类型为PostcodeUnit,它具有URI

http://data.ordnancesurvey.co.uk/ontology/postcode/PostcodeUnit
Run Code Online (Sandbox Code Playgroud)

基于此,我尝试的第一件事是尝试检索一些邮政编码单元的SPARQL查询,所以我在上面的端点中使用了以下查询.(如果你将它复制并粘贴在那里,你将需要删除任何前导空格SELECT.无论如何,我必须这样做.)

SELECT * WHERE { 
  ?postcodeUnit a <http://data.ordnancesurvey.co.uk/ontology/postcode/PostcodeUnit>
}
LIMIT 10
Run Code Online (Sandbox Code Playgroud)

SPARQL结果

在上面链接的端点中.(这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> |
--------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

B72 1NB页面显示其lsoa伯明翰006C.该lsoa属性的IRI 是(您可以在下载的数据中看到这一点)

http://opendatacommunities.org/def/geography#lsoa
Run Code Online (Sandbox Code Playgroud)

所以我们将SPARQL查询扩展到

SELECT * WHERE { 
  ?postcodeUnit
    a <http://data.ordnancesurvey.co.uk/ontology/postcode/PostcodeUnit> ;
    <http://opendatacommunities.org/def/geography#lsoa> ?lsoa .
}
LIMIT 10
Run Code Online (Sandbox Code Playgroud)

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> |
-----------------------------------------------------------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

如果要使其更具可读性和简洁性,可以在查询中使用前缀:

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
Run Code Online (Sandbox Code Playgroud)

SPARQL结果

当然,结果将是相同的.在每个结果页面的底部,您可以使用许多其他格式下载结果.其中一种格式是CSV,您可能很幸运将其直接导入电子表格(您说您想在E​​xcel中使用数据).

评论中的讨论指出,PostcodeUnits 的绝对数量使得结果集非常大.在英国的邮政编码集包含4种类型的资源,在规模日益扩大的顺序:邮编单位,邮编部门,邮编区和邮政编码地区.这些类型分别有1686911,10833,2087和120个资源.据我理解评论中的澄清,其想法是将这些与低层超级输出区域(LSOA)相关联,例如Birmingham 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 
Run Code Online (Sandbox Code Playgroud)

SPARQL结果

现在,数据集中有34378个LSOA,因此仍有大量数据需要选择,并且尝试下拉所有不同的losa/district映射的文本结果仍然会导致超时.实际上,由于每个LSOA都与某个区域相关联(我预期),因此输出结果可能与LSOA一样多.

看起来这是我们开始达到SPARQL端点的响应大小限制和超时的点,并且需要开始本地访问数据.仅邮政编码数据为5.6 GB,因此这不是一个很好的解决方案.

但是,如果您愿意为每个区域采用代表性的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 
  }
}
Run Code Online (Sandbox Code Playgroud)

SPARQL结果

在本地使用TDB

使用SPARQL端点有一些限制,例如上面遇到的超时.在这些情况下,下载数据并将其放入Jena TDB商店并使用查询并不困难tdbquery.在英国的邮政编码页面有下载链接,压缩正三倍.下载这些数据后(并安装了Apache Jena 2.10),我运行(在Unix系统上):

$ tdbloader2 --loc tdb dataset_data_postcodes_20130506183000.nt
Run Code Online (Sandbox Code Playgroud)

tdb我在哪里制作包含TDB索引的本地目录.加载数据需要一段时间(此处为1125秒),索引也是如此.加载完所有内容后,我将以下查询存储在一个名为的文件中postcodes.sparql,然后运行查询

$ tdbquery --loc tdb --results CSV --query postcodes.sparql > unit_lsoa.csv
Run Code Online (Sandbox Code Playgroud)

生成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
Run Code Online (Sandbox Code Playgroud)

现在,有1686911个定义的邮政编码单位,所以我最初预计会有相同数量的行unit_lsoa.csv.但是,减少了大约20万.(wc -l打印文件中的行数.)

$ wc -l unit_lsoa.csv 
1440143 unit_lsoa.csv
Run Code Online (Sandbox Code Playgroud)

事实证明,一些邮政编码单元没有相关的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 }
}
Run Code Online (Sandbox Code Playgroud)

存储在文件中postcodes_without_lsoa.sparql:

$ tdbquery --loc tdb \
    --results CSV \
    --query postcodes_without_lsoa.sparql > unit_without_lsoa.csv
Run Code Online (Sandbox Code Playgroud)

果然,大约有200,000行unit_without_lsoa.csv:

$ wc -l unit_without_lsoa.csv
246770 unit_without_lsoa.csv
Run Code Online (Sandbox Code Playgroud)

1440143和246770的总和是1686913,这正是邮政编码的数量(每个CSV文件中的标题加上2行).任务完成!