我正在尝试从Lower Layer Super Output Areas (LSOAs)和UK Postcodes数据集中获取一些信息。
我需要数据转储中的邮政编码和lsoa信息才能使用。
“低层超级输出区域”类型的表示法和标签。 http://opendatacommunities.org/doc/geography/lsoa/E01009437
E.g。每种类型的'邮政编码单位''lsoa' http://opendatacommunities.org/resource?uri=http%3A%2F%2Fdata.ordnancesurvey.co.uk%2Fid%2Fpostcodeunit%2FB721NB
我不知道如何在网站上使用SPARQL引擎来获取此信息,或者如何从我下载的N-Triples文件中提取信息...
答案 0 :(得分:13)
检索所需数据有两个主要选项。在某些情况下,可以使用公共可用的SPARQL端点查询数据。这可能是最方便的方法,除非有一些明确的理由说明你需要本地数据。但是,这种方法存在局限性,在这些情况下,在本地下载数据集并对其进行查询是有意义的。我将首先描述远程端点解决方案,然后使用本地查询描述解决方案。 SPARQL端点的限制(例如,硬超时)意味着第一种方法对于这个特定任务来说还不够,所以这个问题的具体答案是第二种方法。
在这个问题之前,我并不熟悉这些特定的数据集和本体,所以第一种方法也是通过“熟悉数据”来解决的。过程
您可以使用Open Data Communities SPARQL endpoint运行查询并获取一些数据。我之前没有查看过这些数据,所以我不会只是发布最终答案,而是会逐步完成我用来确定运行什么类型查询的过程。
您链接到的其中一个页面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
在上面链接的端点中。 (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
结果是这样的:
-----------------------------------------------------------------------------------------------------------------------------
| 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
的绝对数量使得结果集非常大。 UK Postcodes数据集按大小增加的顺序包含四种类型的资源:邮政编码单元,邮政编码扇区,邮政编码区和邮政编码区域。这些类型分别有1686911,10833,2087和120个资源。据我理解评论中的澄清,其想法是将这些与较低层超级输出区域(LSOA)相关联,例如Birmingham 006C。单个邮政编码单元与LSOA相关联,但较高级别的邮政编码区域则不相关。每个邮政编码单位是within其部门,区域和区域。例如,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 LSOAs,因此仍有大量数据需要选择,并且尝试下拉所有不同的losa / district映射的文本结果仍然会导致超时。事实上,由于每个LSOA都与某个区域相关联(我预期),因此输出结果可能与LSOA一样多。
看起来这就是我们开始为SPARQL端点点击response size limits and timeouts并且需要开始在本地访问数据的点。仅邮政编码数据为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端点有一些限制,例如上面遇到的超时。在这些情况下,下载数据并将其放入Jena TDB商店并使用tdbquery
进行查询并不困难。 UK postcodes页面包含download link for 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
中的行数会相同。但是,减少了大约20万。 (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
果然,unit_without_lsoa.csv
中有大约200,000行:
$ wc -l unit_without_lsoa.csv
246770 unit_without_lsoa.csv
1440143和246770的总和是1686913,这正是邮政编码的数量(每个CSV文件中的标题加2行)。任务完成了!
答案 1 :(得分:0)
您可以使用网络服务获取此信息,您可以使用comobie UK邮政编码(例如ZE1 0AE),部门,区域,城市和病房边界