【发布时间】:2013-10-16 01:43:34
【问题描述】:
我正在尝试从以下 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 被证明非常有用。
【问题讨论】:
-
数据在哪里?您针对哪个端点运行此查询?如果您需要从不同的端点获取三元组,您可能需要考虑使用
service关键字。 -
我正在使用 spargl.org 的通用端点 sparql.org/sparql.html 运行它。我也用各种图表做了试验,只是重复 FROM 子句。只要它们使用 ophileon.com 域并且它们只是 rdf 文件,就没有问题。数据部分位于我服务器上的 rdf 中,部分位于 geonames 域中。
-
在
from <http://sws.geonames.org/ >中的IRI 中实际上有空间吗?那将是一个问题。另外,请在不起作用工作时显示错误消息。当我在未注释的那些行(但在 IRI 中有空格)的情况下使用您的查询时,我收到一个解析错误。当我删除空格时,我收到一个描述性错误“无法确定三元组内容类型:(URI=sws.geonames.org:stream=null:hint=null)”,这意味着 Jena 尝试检索数据,但无法不知道如何解析它。 -
您是否更改了此查询正在检索的服务器上的数据?在我开始研究这个时得到的结果中,我得到了
geonames的结果,比如<http://sws.geonames.org/2745088>URI 上有 no final/,但是现在当我运行查询时,最后有一个/。我可以看到这是问题所在,但我无法解释为什么它似乎发生了变化,除了您在服务器上的数据发生了变化。 -
是的,我做了,我在我的编辑中声明了它;)我在 poi.rdf 中添加了斜杠