使用SPARQL从地理名称中检索数据

时间:2013-10-16 01:43:35

标签: rdf sparql geonames

我试图在以下SPARQL中获取来自地理名称的链接数据,但显然我做错了。

prefix oxprop: <http://ophileon.com/ox/property#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix owl:  <http://www.w3.org/2002/07/owl#>
prefix wgs84_pos: <http://www.w3.org/2003/01/geo/wgs84_pos#>

select ?poi ?poiname ?geonames ?latitude


from  <http://www.ophileon.com/ox/poi.rdf>
# from  <http://sws.geonames.org/ >

where
{

   ?poi rdfs:label ?poiname.
   ?poi owl:sameAs ?geonames.
#   ?geonames wgs84_pos:lat ?latitude.


  FILTER(langMatches(lang(?poiname), "EN")).

}

,使用sparql.org的JSON输出:

{
  "head": {
    "vars": [ "poi" , "poiname" , "geonames" , "latitude" ]
  } ,
  "results": {
    "bindings": [
      {
        "poi": { "type": "uri" , "value": "http://ophileon.com/ox/poi/2" } ,
        "poiname": { "type": "literal" , "xml:lang": "en" , "value": "Wageningen" } ,
        "geonames": { "type": "uri" , "value": "http://sws.geonames.org/2745088" }
      } ,
      {
        "poi": { "type": "uri" , "value": "http://ophileon.com/ox/poi/3" } ,
        "poiname": { "type": "literal" , "xml:lang": "en" , "value": "Netherlands" } ,
        "geonames": { "type": "uri" , "value": "http://sws.geonames.org/2750405" }
      } ,
      {
        "poi": { "type": "uri" , "value": "http://ophileon.com/ox/poi/1" } ,
        "poiname": { "type": "literal" , "xml:lang": "en" , "value": "Amsterdam" } ,
        "geonames": { "type": "uri" , "value": "http://sws.geonames.org/2759794" }
      }
    ]
  }
}

我想要实现的是它使用geonames rdf服务检索每个节点的纬度,地址如“http://sws.geonames.org/2745088/about.rdf

以“#”开头的行是我怀疑不正确的行。

下一次迭代

在geonamesID后添加“/”并运行:

prefix oxprop: <http://ophileon.com/ox/property#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix owl:  <http://www.w3.org/2002/07/owl#>
prefix wgs84_pos: <http://www.w3.org/2003/01/geo/wgs84_pos#>

select *

from <http://www.ophileon.com/ox/poi.rdf>
from <http://sws.geonames.org/2745088/about.rdf>    
from <http://sws.geonames.org/2750405/about.rdf>    
from <http://sws.geonames.org/2759794/about.rdf>
where
{
   ?poi rdfs:label ?poiname.
   ?poi owl:sameAs ?geonames.
   ?geonames wgs84_pos:lat ?latitude.
   FILTER(langMatches(lang(?poiname), "EN")).
}

返回:

-------------------------------------------------------------------------------------------------------
| poi                            | poiname          | geonames                           | latitude   |
=======================================================================================================
| <http://ophileon.com/ox/poi/2> | "Wageningen"@en  | <http://sws.geonames.org/2745088/> | "51.97"    |
| <http://ophileon.com/ox/poi/3> | "Netherlands"@en | <http://sws.geonames.org/2750405/> | "52.5"     |
| <http://ophileon.com/ox/poi/1> | "Amsterdam"@en   | <http://sws.geonames.org/2759794/> | "52.37403" |
-------------------------------------------------------------------------------------------------------

下一次迭代:使用“SERVICE”关键字

prefix oxprop: <http://ophileon.com/ox/property#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix owl:  <http://www.w3.org/2002/07/owl#>
prefix wgs84_pos: <http://www.w3.org/2003/01/geo/wgs84_pos#>


select ?poi ?poiname ?geonameuri ?latitude

from <http://www.ophileon.com/ox/poi.rdf>

where
{
   ?poi rdfs:label ?poiname.
   ?poi owl:sameAs ?geonameuri.
   SERVICE <http://factforge.net/sparql>{
   ?geonameuri wgs84_pos:lat ?latitude.
   }
   FILTER(langMatches(lang(?poiname), "EN")).
}

导致我想要的,除了factforge以各种数据类型返回多个值 事实证明,此资源http://wifo5-03.informatik.uni-mannheim.de/latc/www2012/Session%201.html非常有用。

1 个答案:

答案 0 :(得分:6)

错别字和无法检索数据

我认为这里有两个问题。首先是一个小错字。当我运行您的查询时,注释行未注释,由于行

,我得到一个解析错误
from  <http://sws.geonames.org/ >

因为IRI中不应该有空格。虽然这很容易解决。修复后,sparql.org上的服务会回复

Error 400: Failed to load URL (parse error) http://sws.geonames.org/ : Failed to determine the triples content type: (URI=http://sws.geonames.org/ : stream=null : hint=null)

Fuseki - version 1.0.0 (Build date: 2013-09-12T10:49:49+0100)
我相信,这意味着Jena能够提取IRI的内容,但无法弄清楚如何将其作为RDF阅读。虽然快速的谷歌搜索显示了大量的查询,其中IRI被用作命名空间前缀,但我没有看到它被用作可以选择三元组的图形的位置。我认为这符合geonames.org在其documentation中所说的内容:

  

进入GeoNames语义网的入口点

     

您可以通过多种方式进入GeoNames语义网:

     
      
  • mother earth开始,然后按照关联数据链接。
  •   
  • geonames search webservice type = rdf 参数选项一起使用。
  •   
  • 下载数据库转储并构建功能的URL   使用模式“http://sws.geonames.org/geonameId/
  •   
  • RDF dump   8514201功能和约125 mio rdf三倍(2013 08 27)。转储   每个文件的每一行都有一个rdf文件。注意:   文件很大。确保您用于解压缩的工具能够   处理大小并且在2GB之后不会停止,这是一个问题   发生在一些旧的(Windows)工具版本。
  •   

我有点惊讶在该列表中看到SPARQL端点,但我希望如果有一个,那么它将在这个选项列表中。

修改查询以获取一些数据

现在,成功的查询(没有注释行)会返回以下结果:

poi                            poiname          geonames                          latitude
<http://ophileon.com/ox/poi/2> "Wageningen"@en  <http://sws.geonames.org/2745088>   
<http://ophileon.com/ox/poi/3> "Netherlands"@en <http://sws.geonames.org/2750405>   
<http://ophileon.com/ox/poi/1> "Amsterdam"@en   <http://sws.geonames.org/2759794>

注意:这些是我开始撰写此答案时的结果。但是,这是基于http://www.ophileon.com/ox/poi.rdf中可能已更改的数据。在以后运行此查询时,我得到geonames的值为/的{​​{1}},例如http://sws.geonames.org/2745088/

基于相同的文档,其中也说:

  

对于法国的Embrun镇,我们有两个URI:

     
      
  1. http://sws.geonames.org/3020251/
  2.   
  3. http://sws.geonames.org/3020251/about.rdf
  4.         

    第一个URI [1]代表   法国小镇。如果要引用城镇,请使用此URI。   第二个URI [2]是具有geonames信息的文档   关于Embrun。

这表明使用那些特定地理名称IRI的查询也可以用作图名称。也就是说,像这样的查询可能有效:

prefix oxprop: <http://ophileon.com/ox/property#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
prefix owl:  <http://www.w3.org/2002/07/owl#>
prefix wgs84_pos: <http://www.w3.org/2003/01/geo/wgs84_pos#>

select ?poi ?poiname ?geonames ?latitude
from <http://www.ophileon.com/ox/poi.rdf>
from <http://sws.geonames.org/2745088/about.rdf>    
from <http://sws.geonames.org/2750405/about.rdf>    
from <http://sws.geonames.org/2759794/about.rdf>
where
{
   ?poi rdfs:label ?poiname.
   ?poi owl:sameAs ?geonames.
   ?geonames wgs84_pos:lat ?latitude.
   FILTER(langMatches(lang(?poiname), "EN")).
}

现在这个仍然没有返回任何结果,但似乎所有数据都应该存在。让我们尝试一个更简单的查询。如果您使用这样的查询:

select * 
from <http://sws.geonames.org/2759794/about.rdf>
where { ?s ?p ?o }

SPARQL results

你会得到一堆关于那个地方的三元组。这也适用于多个from子句。例如,如果您使用以下查询使用该数据和数据,则会得到合并的结果。

select * 
from <http://www.ophileon.com/ox/poi.rdf>
from <http://sws.geonames.org/2745088/about.rdf>  
where { ?s ?p ?o }

SPARQL results

在查看该数据集的结果时,我们终于可以看到问题出在哪里:地理名称资源的IRI以实际形式以/结尾,但没有/你的数据。您需要相应地更改数据。

注意:似乎http://www.ophileon.com/ox/poi.rdf中的数据已被更正。

看起来您最终可能需要运行第一个查询来确定要从地理名称获取的数据,检索该信息,然后对其运行第二个查询。或者,您可以下载Geonames提供的大数据转储并在本地使用它(可能是最简单的解决方案)。