【问题标题】:Sparql Query Geometry doing strange thingsSparql 查询几何做奇怪的事情
【发布时间】:2019-01-13 05:48:00
【问题描述】:

我现在正在执行 Sparql 查询,以从 dbpedia Endpoint (Snorql) 中查找给定点的特定半径周围的地点。

我的第一个解决方案(已经在其他一些端点做)是这样的:

PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>
SELECT *
WHERE {
?resource rdfs:label ?label  .
?resource geo:lat ?lat .
?resource geo:long ?long .
?resource geo:geometry ?coordinates .
FILTER(bif:st_within(?coordinates, bif:st_geomFromText("POINT(10.2788 47.4093)"), 1)) .
FILTER (lang(?label)= "de") .
}

我注意到它没有给我任何结果。然后我用geo:latgeo:long 中给定的舍入值尝试了同样的事情:

PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>
SELECT *
WHERE {
?resource rdfs:label ?label  .
?resource geo:lat ?lat .
?resource geo:long ?long .
?resource geo:geometry ?coordinates .
FILTER(bif:st_within(bif:st_point(?long, ?lat), bif:st_geomFromText("POINT(10.2788 47.4093)"), 1)) .
FILTER (lang(?label)= "de") .
}

现在我得到 2 个结果。当我将第一个解决方案的半径增加到 21 时,有很多结果,但将其减小到 20 时,没有结果。我在第一个 Query 中犯了错误吗?

非常感谢, 锯

【问题讨论】:

    标签: sparql dbpedia geo virtuoso


    【解决方案1】:

    As I answered on Confluence...

    有趣!

    您的原始查询(添加了FROM &lt;http://dbpedia.org&gt; 子句)在run against the LOD Cloud Cache 时确实返回了预期的结果,它现在位于较旧的Virtuoso 引擎上。这看起来像是新版本中的回归。

    为了检查 DBpedia 上的内容,我从您的查询开始,并使用 st_distance() functionWHERE 子句中添加了几个 BINDs --

    BIND ( bif:st_distance ( ?coordinates, bif:st_geomFromText("POINT(10.2788 47.4093)") ) AS ?coord_distance ) . BIND ( bif:st_distance ( bif:st_point(?long, ?lat), bif:st_geomFromText("POINT(10.2788 47.4093)") ) AS ?latlong_distance ) }

    我还在查询中添加了最后一个 ORDER BY ?coord_distance

    我在DBpedia.org/sparql 上的结果清楚地显示了您想要的1 半径内的两个实体,无论基于?coordinates 还是st_point(?long, ?lat),计算的距离都是相同的,但除非bif:st_within 指定一个21 或更大的半径 - 这些结果包括在较大半径内的许多其他实体。

    我已将此问题提交给 Virtuoso Development,并在内部作为 bug#18399 进行跟踪。

    ... 以及后续...

    st_within() 使用st_distance(),因此鉴于srid4326(对于DBpedia 地理数据来说是典型的),“haversine function 用于计算地球上以千米为单位的大圆距离。”您可以将距离以米为单位除以 1000(或将其乘以 0.001),得到以公里为单位的距离,以便在 st_within() 调用中使用。

    计算时间取决于实例主机、实例上的其他负载等。公共 DBpedia 实例的响应时间很可能超出您的承受能力。您可以在本地服务器或云中设置自己的镜像(AMIs 基于DBpedia 2016-10 Snapshot [current DBpedia.org/sparql] 或 DBpedia-Live [current live.DBpedia.org/sparql]),您可以放置在任何 AWS 实例类型上——这样您就可以为它提供任意数量的处理器和/或 RAM。

    请注意,LOD Cloud Cache instance 可能随时升级到更新的 Virtuoso 引擎,因此您不应依赖此通过 st_within() 提供所需的结果。 A slightly adjusted DBpedia query 将仅使用st_distance() 函数提供what I think you want(此处从?coordinates 计算,但您也可以使用基于?long?lat 的更复杂的构造),而不是故障st_within() .

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-18
      • 1970-01-01
      • 1970-01-01
      • 2019-02-14
      • 1970-01-01
      • 1970-01-01
      • 2012-04-07
      • 2019-06-27
      相关资源
      最近更新 更多