【问题标题】:Finding Longitude and Latitude using SPARQL使用 SPARQL 查找经度和纬度
【发布时间】:2021-01-17 18:23:15
【问题描述】:

我有一个包含很多地方的 OWL 本体:城市、国家、州、地区和特定地点,例如企业或教堂。我想使用 SPARQL 查询一些外部数据源(我假设一个 SPARQL 端点),找到匹配的地方并将长和纬度数据复制到我的本体。我的本体处理 Covid 大流行,称为 CODO。所以我尝试了这样的事情:

    PREFIX owl: <http://www.w3.org/2002/07/owl#>
    PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
    PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
    PREFIX codo: <http://www.isibang.ac.in/ns/codo#>
    PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> 
    PREFIX dbo: <http://live.dbpedia.org/> 
    INSERT  {?c codo:long ?long.
             ?c  codo:lat ?lat.} 
     WHERE {?c a codo:City. 
            ?c rdfs:label ?l. 
            ?dbpc a dbo:City. 
            ?dbpc rdfs:label ?l.    
            ?dbpc geo:long ?long.
            ?dbpc geo:lat ?lat.}

我从网上找到的示例中获得了这些特定的命名空间。我对从哪里获取数据没有偏好,Geonames、DBpedia 无关紧要。我认为部分问题是我不清楚何时/如何使用 SERVICE 和/或 FROM 关键字。

【问题讨论】:

  • 对于远程端点,您始终使用 SERVICE 关键字。 FROM 基本上用于将图形添加到查询评估期间使用的默认图形中。 SERVICE 关键字只是从远程端点包装了您需要的图形模式,例如construct {?c geo:long ?long ; geo:lat ?lat } where {?c a codo:City ; rdfs:label ?l. SERVICE &lt;http://dbpedia.org/sparql&gt; {?s a dbo:City; rdfs:label ?l ; geo:lat ?lat ; geo:long ?long}} - 对于 INSERT 查询它的工作方式相同
  • -注意,SERVICE 子句的实现有时是模糊的,即不清楚来自“外部”查询的数据是否内联-但这显然是避免获取所有数据和在本地进行连接。例如,使用 Apache Jena if 将为每个本地绑定运行一个远程查询。请记住这一点,如果同一 IP 地址在短时间内发生过多请求,远程服务可能会阻塞。
  • 您的任务的替代方案可能是 i) 只需下载 DBpedia lat/long 数据或 ii) 编写一个查询,在其中仅加载本地城市的数据,即 CONSTRUCT{?l geo:long ?long ; geo:lat ?lat.} WHERE {VALUES ?l {"city1label" "city2label" ... "citynlabel"} ?c a dbo:City ; rdfs:label ?l ; geo:long ?long ; geo:lat ?lat.} - 这将导致一个可能的大型查询,但应该更有效(比较标签时不要忘记语言标签!)
  • @UninformedUser 非常感谢您的建议。这有帮助。我喜欢只下载 DBpedia 数据的想法,但我不想为我们的城市加载数据,因为如果我理解你的建议,这意味着列出每个城市(还有州、地区、国家等),我们有一个随着我们将工作扩展到印度以外的地区,我们还会增加更多。
  • 我明白了。好的,那么您应该通过 SERVICE 关键字进行联合查询。我第一条评论中的CONSTRUCT 查询只是一个草图,但至少它可以工作 - 从命令行和一些虚拟数据使用 Apache Jena 对其进行了测试。

标签: geolocation sparql endpoint dbpedia geo


【解决方案1】:

我发现了问题所在。使用我正在使用的查询引擎(来自 Franz Inc. 的 Allegrograph 中的 Gruff)我什至不需要使用 SERVICE 关键字,我需要做的就是使用 Gruff 中的文件选项之一连接到端点。我已经这样做了,但是我在 DBpedia 中使用了错误的 IRI。现在可以使用以下方法:

PREFIX dbo: <http://dbpedia.org/ontology/> 
PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#> 
SELECT ?City ?long ?lat where {?City a dbo:City; geo:lat ?lat ; geo:long ?long} 
limit 200 

现在这正在工作,应该直接链接到我们本体中的位置并复制所需的数据。感谢 UninformedUser 和我的同事 Biswanath_Dutta 帮助我解决这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    相关资源
    最近更新 更多