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

Rdf 使用SPARQL查询开放数据社区数据,rdf,sparql,n-triples,Rdf,Sparql,N Triples,我试图从数据和数据集中获得一些信息 我需要一个数据转储中的邮政编码和lsoa信息,以便excel使用 “下层超级输出区”类型的符号和标签。 例如,每种类型的“邮政编码单元”都有“lsoa” 我不知道如何使用站点上的SPARQL引擎来获取此信息,也不知道如何从我下载的N-Triples文件中提取信息…有两个主要选项用于检索所需的数据。在某些情况下,可以使用公开可用的SPARQL端点查询数据。这可能是最方便的方法,除非您有明确的理由需要本地数据,否则这是应该采取的方法。然而,这种方法有一些局限性

我试图从数据和数据集中获得一些信息

我需要一个数据转储中的邮政编码和lsoa信息,以便excel使用

“下层超级输出区”类型的符号和标签。

例如,每种类型的“邮政编码单元”都有“lsoa”


我不知道如何使用站点上的SPARQL引擎来获取此信息,也不知道如何从我下载的N-Triples文件中提取信息…

有两个主要选项用于检索所需的数据。在某些情况下,可以使用公开可用的SPARQL端点查询数据。这可能是最方便的方法,除非您有明确的理由需要本地数据,否则这是应该采取的方法。然而,这种方法有一些局限性,在这些情况下,下载数据集并在本地对其进行查询是有意义的。我将首先介绍远程端点解决方案,然后介绍使用本地查询的解决方案。SPARQL端点上的限制(例如,硬超时)意味着第一种方法不足以完成此特定任务,因此这个问题的具体答案是第二种方法

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

使用SPARQL端点 有一种方法,您可以根据它运行查询并获取一些数据。我以前没有看过这些数据,所以我将不只是发布最终答案,而是逐步了解我用来确定要运行哪种查询的过程

您链接到的其中一个页面提到资源具有类型,该类型具有URI

http://data.ordnancesurvey.co.uk/ontology/postcode/PostcodeUnit
基于此,我尝试的第一件事是使用SPARQL查询来检索一些邮政编码单元,因此我在上面的端点中使用了以下查询。(如果您将其复制并粘贴到其中,则需要在选择
之前删除任何前导空格。无论如何,我必须这样做。)

B72 1NB页面显示其as。
lsoa
属性的IRI为(您可以在下载的数据中看到)

因此,我们将SPARQL查询扩展到

SELECT * WHERE { 
  ?postcodeUnit
    a <http://data.ordnancesurvey.co.uk/ontology/postcode/PostcodeUnit> ;
    <http://opendatacommunities.org/def/geography#lsoa> ?lsoa .
}
LIMIT 10

现在,数据集中有,所以仍然有很多数据需要选择,并且尝试下拉所有不同losa/地区映射的文本结果仍然会导致超时。事实上,由于每个LSOA都与某个地区相关联(我预计),因此输出中的结果可能与LSOA中的结果一样多

看起来这是我们开始寻找SPARQL端点的地方,需要开始在本地访问数据。但是,仅邮政编码数据就有5.6GB,因此这不是一个很好的解决方案

但是,如果您愿意为每个地区获取一个具有代表性的LSOA,我们可以使用SPARQL子查询将其提取出来,如下面的查询中所示,该查询首先检索所有邮政编码地区,然后为每个地区查找该地区某个邮政编码单位拥有的单个LSOA。我不知道这是否是一个可接受的结果,但您最终得到的是每个地区的LSOA,结果足够小(有2087行,与地区数相同),可以以任何结果格式(包括CSV)下拉

其中
tdb
是我用来包含tdb索引的本地目录。加载数据需要一段时间(此处为1125秒),索引也需要一段时间。加载完所有内容后,我将以下查询存储在名为
postcodes.sparql
的文件中,并使用

$ tdbquery --loc tdb --results CSV --query postcodes.sparql > unit_lsoa.csv
以CSV格式生成结果,存储在文件
unit\u 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\u lsoa.csv
中的行数会相同。然而,大约少了20万人。(
wc-l
打印文件中的行数。)

事实证明,一些邮政编码单元没有相关的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 }
}
果然,
unit\u中大约有200000行没有lsoa.csv

$ wc -l unit_without_lsoa.csv
246770 unit_without_lsoa.csv

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

您可以使用web服务获取这些信息,您可以查看英国邮政编码(例如ZE1 0AE)、部门、地区、城市和病房边界


下面是一个查询邮政区TA2返回组成TA2区的扇区多边形集合(GeoJson)的示例。

我添加了一个答案,但除了“邮政编码和lsoa信息”,我不确定您是否也在尝试获取其他信息。如果你能澄清你需要什么信息,我可以更新我的答案。太棒了,谢谢你,这会让我花很长时间才弄明白。@user1514580太棒了!很高兴我能帮忙。如果此答案满足您的需要,请通过接受(单击向上投票/向下投票按钮附近的绿色箭头)来表示“谢谢”!祝你玩得开心!我现在在获取数据方面有点问题。似乎有太多的数据行,当我尝试下载CSV时,请求超时,我将限制为1686911。我实际上并不需要完整的邮政编码单位,邮政编码地区就足够了,但我看不到该级别上的lsoa标记?@user1514580我进一步查看了本体,找到了一种将lsoa与不同邮政地区(单位、部门、地区和地区)关联的查询方法。它仍然有点太多的数据,并导致超时。你能更具体地说明你需要什么样的数据吗?也许我们可以把范围缩小一点?谢谢你的跟进,我需要在周一查看我的笔记并回复,我真的很感谢你的帮助!
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
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 
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 
  }
}
$ tdbloader2 --loc tdb dataset_data_postcodes_20130506183000.nt
$ tdbquery --loc tdb --results CSV --query postcodes.sparql > 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
$ wc -l unit_lsoa.csv 
1440143 unit_lsoa.csv
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 }
}
$ tdbquery --loc tdb \
    --results CSV \
    --query postcodes_without_lsoa.sparql > unit_without_lsoa.csv
$ wc -l unit_without_lsoa.csv
246770 unit_without_lsoa.csv