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

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


我添加了一个答案,但除了“邮政编码和LSOA信息”之外,我不确定您是否还想获取其他信息。如果您能澄清需要哪些信息,我可以更新我的答案。 - Joshua Taylor
2个回答

14
有两种主要的选项可以检索您想要的数据。在某些情况下,可以使用公开可用的SPARQL端点查询数据。这可能是最方便的方法,并且除非您有明确的原因需要本地数据,否则应采用该方法。但是,这种方法存在一些限制,在这些情况下,下载数据集并在本地进行查询是有意义的。我将首先描述远程端点解决方案,然后是使用本地查询的解决方案。 SPARQL端点的限制(例如硬超时)意味着第一种方法对于此特定任务不足够,因此对于此问题的具体答案是第二种方法。
在回答这个问题之前,我不熟悉这些特定的数据集和本体,因此第一种方法也会经过“熟悉数据”的过程。
使用SPARQL端点
有一个Open Data Communities 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伯明翰006Clsoa属性的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的数量使结果集非常大。UK Postcodes数据集包含四种资源类型,按大小顺序排列为:邮政编码单位、邮政编码区、邮政编码地区和邮政编码区域。分别有1686911、10833、2087和120个资源。据我理解,评论中的澄清意见是将它们与下一层次的超级输出区(LSOAs)相关联,例如Birmingham 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个LSOAs,因此仍有许多数据需要选择,尝试拉取所有不同的losa/district映射的文本结果仍会导致超时。实际上,由于每个LSOA都与某个区域相关联(我期望如此),因此输出结果与LSOAs数量相同。
看起来这是我们开始遇到响应大小限制和超时的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进行查询并不是太难。英国邮政编码页面有已压缩的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 中大约有 20 万行:

$ wc -l unit_without_lsoa.csv
246770 unit_without_lsoa.csv

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


非常棒,谢谢你。如果没有你,我可能要花很长时间才能搞明白。 - user1514580
@user1514580 很好!很高兴我能帮到你。如果这个答案满足了你的需求,请通过接受(点击赞成/反对按钮旁边的绿色箭头)来表示感谢!祝你在SPARQL中愉快! - Joshua Taylor
我现在遇到了一些问题,无法获取数据。似乎有太多的数据行,当我尝试下载CSV时请求超时,我将其限制为1686911。实际上,我并不需要完整的邮政编码单元,邮政编码区就足够了,但我看不到该级别的LSOA标签? - user1514580
@user1514580 好的,答案已经更新为基于TDB的方法。我认为这会产生你想要得到的数据。加载和查询花了一些时间;如果你通过电子邮件(或其他方式)联系我(我的地址在我的个人资料页面上),我可以通过电子邮件将结果发送给你,这样你就不必重复所有的工作。一旦所有东西都准备好并加载完成,查询运行得相当快;如果你有其他查询需要运行,本地拥有数据将非常有用。 - Joshua Taylor
谢谢 Joshua,我已经给您发了电子邮件。 - user1514580
显示剩余4条评论

0

你可以使用 Web 服务获取这些信息,可以组合英国邮政编码(例如 ZE1 0AE)、领域、区域、城市和选区边界。

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

这是一个关于编程的例子,查询邮政区TA2返回了由构成TA2区域的扇形多边形(GeoJson)组成的集合。TA2 District GeoJson


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接