1

我正在尝试从以下 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被证明是非常有用的。

4

1 回答 1

7

拼写错误和无法检索数据

我认为这里有两个问题。第一个是一个小错字。当我运行您的查询时,未注释注释行时,由于该行而出现解析错误

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。虽然快速的 Google 搜索显示了很多将 IRI 用作命名空间前缀的查询,但我没有看到任何将 IRI 用作可以从中选择三元组的图表的地方。我认为这与 geonames.org 在其文档中所说的相符:

GeoNames 语义网的入口点

有几种方法可以输入 GeoNames Semantic Web:

在该列表中没有看到 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具有 final的值/,例如http://sws.geonames.org/2745088/.

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

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

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

第一个 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 结果

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

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

SPARQL 结果

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

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

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

于 2013-10-16T11:01:22.300 回答