【问题标题】:Querying Open Data Communities Data with SPARQL使用 SPARQL 查询开放数据社区数据
【发布时间】:2013-05-17 11:48:13
【问题描述】:

我正在尝试从 Lower Layer Super Output Areas (LSOAs)UK Postcodes 数据集中获取一些信息。

我需要数据转储中的邮政编码和 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 信息”之外,我不确定您是否也试图获取其他一些信息。如果你能澄清你需要什么信息,我可以更新我的答案。

标签: rdf sparql n-triples


【解决方案1】:

检索所需数据有两个主要选项。在某些情况下,可以使用公开可用的 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,您可能会幸运地将其直接导入电子表格(您说过您想使用 Excel 中的数据)。

cmets 中的讨论指出,PostcodeUnits 的绝对数量使得结果集非常大。 UK Postcodes 数据集包含四种类型的资源,按大小顺序排列:邮政编码单位、邮政编码部门、邮政编码区和邮政编码区。这些类型的资源分别有 1686911、10833、2087 和 120 个。据我了解 cmets 中的说明,其想法是将这些与下层超级输出区域 (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,因此仍有大量数据可供选择,尝试下拉所有不同的洛萨/地区映射的文本结果仍会导致超时。事实上,由于每个 LSOA 都与(我期望的)某个地区相关联,因此输出中的结果可能与 LSOA 的数量一样多。

看起来这是我们开始为 SPARQL 端点点击response size limits and timeouts 的点,并且需要开始在本地访问数据。仅邮政编码数据是 5.6 GB,所以这不是一个很好的解决方案。

但是,如果您愿意为每个地区获取一个有代表性的 LSOA,我们可以使用 SPARQL 子查询来提取它们,如下面的查询,它首先检索所有邮政编码地区,然后为每个地区找到一个single 区某邮政编码单位具有的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 中的行数会相同。但是,大约减少了 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

果然unit_without_lsoa.csv有20万行左右:

$ wc -l unit_without_lsoa.csv
246770 unit_without_lsoa.csv

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

【讨论】:

  • 太棒了,谢谢,这需要我很长时间才能弄清楚。
  • @user1514580 太好了!很高兴我能帮上忙。如果此答案满足您的需求,请也接受(单击赞成/反对按钮附近的绿色箭头)说“谢谢”! SPARQLing 快乐!
  • 我现在在获取数据时遇到了一点问题。似乎有太多的数据行,当我尝试下载 CSV 时请求超时,我对 1686911 设置了限制。我实际上不需要完整的邮政编码单元,邮政编码区就足够了,但我可以'在那个级别看不到 lsoa 标记?
  • @user1514580 我对本体进行了更多研究,并找到了一种方法来编写将 LSOA 与不同邮政区域(单位、部门、地区和区域)关联起来的查询。它仍然有点太多的数据,并导致超时。您能否更具体地说明您需要哪些数据?也许我们可以再缩小一点?
  • 感谢您的跟进,我需要在星期一查看我的笔记并回复,非常感谢您的帮助!
【解决方案2】:

您可以使用网络服务获取此信息,您可以结合英国邮政编码(例如 ZE1 0AE)、部门、地区、城市和区边界

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多