检索所需数据有两个主要选项。在某些情况下,可以使用公开可用的 SPARQL 端点查询数据。这可能是最方便的方法,除非有明确的理由需要本地数据,否则可以采用这种方法。但是,这种方法存在局限性,在这些情况下,下载数据集并在本地对其进行查询是有意义的。我将首先描述远程端点解决方案,然后是使用本地查询的解决方案。SPARQL 端点的限制(例如,硬超时)意味着第一种方法不足以完成此特定任务,因此该问题的具体答案是第二种方法。
在这个问题之前,我不熟悉这些特定的数据集和本体,所以第一种方法也通过“熟悉数据”过程。
使用 SPARQL 端点
有一个开放数据社区 SPARQL 端点,您可以对它运行查询并获取一些数据。我以前没有查看过这些数据,因此我将介绍我用来确定要运行哪种查询的过程,而不是仅仅发布最终答案。
您链接到的页面之一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 结果
在上面链接的端点中。(这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 页面显示其lsoa为Birmingham 006C。该lsoa
物业的 IRI 是(您可以在下载的数据中看到这一点)
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 的绝对数量使得结果集非常大。UK Postcodes数据集包含四种类型的资源,按大小顺序排列:邮政编码单位、邮政编码部门、邮政编码区和邮政编码区。这些类型的资源分别有 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
SPARQL 结果
现在,数据集中有34378 个 LSOA,因此仍有大量数据可供选择,并且尝试下拉所有不同 losa/地区映射的文本结果仍会导致超时。事实上,由于每个 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
}
}
SPARQL 结果
在本地使用 TDB
使用 SPARQL 端点存在一些限制,例如上面遇到的超时。在这些情况下,下载数据并将其放入 Jena TDB 存储并使用tdbquery
. 英国邮政编码页面有zipped n-triples 的下载链接。下载这些数据后(并安装了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
. 但是,大约减少了 200,000 人。(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
果然,里面大概有20万行unit_without_lsoa.csv
:
$ wc -l unit_without_lsoa.csv
246770 unit_without_lsoa.csv
1440143 和 246770 的总和是 1686913,这正是邮政编码的数量(加上每个 CSV 文件中的标题的 2 行)。任务完成!