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

我试图从低层超级输出区域(LSOAs)和英国Postcodes数据集中获取一些信息。

我需要将数据转储中的邮政编码和lsoa信息用于Excel。

types'低层超级输出区域'的符号和标签。 http://opendatacommunities.org/doc/geography/lsoa/E01009437

例如,每种types的“邮政编码”邮政编码单位http://opendatacommunities.org/resource?uri=http%3A%2F%2Fdata.ordnancesurvey.co.uk%2Fid%2Fpostcodeunit%2FB721NB

我不知道如何使用网站上的SPARQL引擎来获取这些信息,或者如何从我下载的N-Triples文件中提取信息…

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

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

使用SPARQL端点

有一个开放数据社区SPARQL端点 ,您可以运行查询并获取一些数据。 我之前没有看过这个数据,所以不是只发布最终答案,而是通过我用来确定要运行哪种查询的stream程。

您链接到的其中一个页面B72 1NB提到资源具有typesPostcodeUnit ,它具有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页面显示了它作为伯明翰006C的lsoa 。 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的绝对数量使结果集非常大。 英国邮政编码数据集包含四种types的资源,按大小顺序排列:邮政编码单位,邮政编码区域,邮政编码区域和邮政编码区域。 这些types分别有1686911,10833,2087和120个资源。 正如我理解评论中的说明,这个想法是将这些与低层超输​​出区域(LSOAs)联系起来,例如伯明翰006C 。 单个邮政编码单位与LSOAs相关联,但是较高级别的邮政编码区域不是。 每个邮政编码单位都在其部门,地区和地区内。 例如, 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 ,所以仍然有大量的数据可供select,并且尝试将所有不同的losa /分区映射的文本结果拉下来仍然会导致超时。 事实上,由于每个LSOA都与某个地区相关(我预期),因此LSOAs的输出结果可能与此相同。

看起来这是我们开始达到SPARQL端点的响应大小限制和超时的地步,需要在本地开始访问数据。 邮编数据本身是5.6 GB,所以这不是一个美妙的解决scheme。

但是,如果您愿意为每个地区select一个具有代表性的LSOA,我们可以使用SPARQL子查询将其取出,如下面的查询首先检索所有邮编区域,然后为每个邮政区域find一个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进行查询tdbquery 。 英国邮政编码页面有压缩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 

事实certificate,一些邮编单位没有相关的LSOAs。 我通过运行查询来检查这个

 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有大约20万行:

 $ wc -l unit_without_lsoa.csv 246770 unit_without_lsoa.csv 

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

您可以使用networking服务来获得这个信息,你可以comobie英国邮政编码(例如ZE1 0AE),部门,区,城市和病房边界

https://www.mashape.com/vanitysoft/uk-boundaries-io

这里是从邮区TA2查询返回组成TA2区域的多边形(GeoJson)的例子。 TA2区GeoJson