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

时间:2013-05-17 11:48:13

标签: rdf sparql n-triples

我正在尝试从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文件中提取信息...

2 个答案:

答案 0 :(得分:13)

检索所需数据有两个主要选项。在某些情况下,可以使用公共可用的SPARQL端点查询数据。这可能是最方便的方法,除非有一些明确的理由说明你需要本地数据。但是,这种方法存在局限性,在这些情况下,在本地下载数据集并对其进行查询是有意义的。我将首先描述远程端点解决方案,然后使用本地查询描述解决方案。 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

SPARQL results

在上面链接的端点中。 (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 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 results

结果是这样的:

-----------------------------------------------------------------------------------------------------------------------------
| 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 results

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

评论中的讨论指出,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 

SPARQL results

现在,数据集中有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 results

在本地使用TDB

使用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),部门,区域,城市和病房边界

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

这里是来自邮政区TA2的查询的示例,返回组成TA2区的多边形(GeoJson)的集合。TA2 District GeoJson