【问题标题】:GeoSparql functions not working as expected in RDF4J's repositoryGeoSparql 函数在 RDF4J 的存储库中未按预期工作
【发布时间】:2021-03-21 18:10:27
【问题描述】:

我和同事正在使用 RDF 数据集和 RDF4J 的内存存储库,我们正在尝试在使用 WKT 格式的几何数据时执行 GeoSparql 查询,如下所示:

@prefix geo: <http://www.opengis.net/ont/geosparql#> .
@prefix sf: <http://www.opengis.net/ont/sf> .
@prefix ex: <http://example.org/> .
@prefix geof: <http://www.opengis.net/def/function/geosparql/>.

ex:eiffelTower a ex:Landmark ;
        geo:hasGeometry ex:coordinates-et.
ex:coordinates-et a sf:Point;
        geo:asWKT "POINT(2.2945 48.8584)"^^geo:wktLiteral .

ex:towerBridge a ex:Landmark ;
          geo:hasGeometry ex:coordinates-tb.
ex:coordinates-tb a sf:Point;
        geo:asWKT "POINT(-0.0754 51.5055)"^^geo:wktLiteral .

场景 1: 到目前为止,我们成功地使用了geof:distance 函数,例如查询及其结果如下所示。目的是计算两个地标坐标之间的距离。

SELECT *
WHERE {
  ?lmA a ex:Landmark ;
       geo:hasGeometry [ geo:asWKT ?coord1 ].

  ?lmB a ex:Landmark ;
       geo:hasGeometry [ geo:asWKT ?coord2 ].

  BIND((geof:distance(?coord1, ?coord2, uom:metre)/1000) as ?dist) .
  FILTER (str(?lmA) < str(?lmB))
}

场景一的结果:

lmA => ex:eiffelTower
coord1 => "POINT(2.2945 48.8584)"
lmB =>  ex:towerBridge
coord2 => "POINT(-0.0754 51.5055)"
dist => "339.2412973915987"

场景 2: 当我们尝试使用其他功能时,例如geof:sfWithingeof:sfContains,我们遇到了一些奇怪的行为。带有geof:sfWithin 示例的查询及其结果如下所示。目的是获取位于给定多边形内的所有点。

SELECT *
WHERE {
  ?lmA a ex:Landmark ;
       geo:hasGeometry ?Geom.

  ?Geom geo:asWKT ?WKT.

  FILTER(geof:sfWithin(?WKT, '''
        <http://www.opengis.net/def/crs/OGC/1.3/CRS84>
            Polygon ((80.0 80.0, -80.0 80.0, -80.0 -80.0, 80.0 -80.0, 80.0 80.0))
        '''^^geo:wktLiteral))
}

结果: -empty table-

我们是否在查询中做错了什么? 我们的依赖:

  • rdf4j-storage 3.6.0
  • rdf4j-queryalgebra-geosparql 3.6.1

【问题讨论】:

    标签: sparql wkt rdf4j geosparql


    【解决方案1】:

    我认为问题在于您的多边形 wkt 文字的语法。你有:

    <http://www.opengis.net/def/crs/OGC/1.3/CRS84>
    Polygon ((80.0 80.0, -80.0 80.0, -80.0 -80.0, 80.0 -80.0, 80.0 80.0))
    

    我不确定第一行的 URI 来自哪里(我不是真正的 GeoSPARQL 专家),但对我来说这看起来不像是正确的 WKT 文字。我试过你的查询

    Polygon ((80.0 80.0, -80.0 80.0, -80.0 -80.0, 80.0 -80.0, 80.0 80.0))
    

    反而得到了以下两个结果:

    lmA=http://example.org/eiffelTower
    WKT="POINT(2.2945 48.8584)"^^<http://www.opengis.net/ont/geosparql#wktLiteral>
    Geom=http://example.org/coordinates-et
    
    lmA=http://example.org/towerBridge
    WKT="POINT(-0.0754 51.5055)"^^<http://www.opengis.net/ont/geosparql#wktLiteral>
    Geom=http://example.org/coordinates-tb
    

    诚然,查询静默失败而不是产生一些“无法处理 WKT 文字”错误或警告令人困惑。

    更新:

    再看一点(另见 cmets),这实际上是 RDF4J 中的一个错误。正如GeoSPARQL spec 中的第 8.5 节所示,参考系统的前缀 URI 不是 WKT 规范本身的一部分,而是对 WKT 文字定义的特定于 GeoSPARQL 的补充。因此,RDF4J 需要在将其交给底层 WKTReader 之前对其进行预处理。以https://github.com/eclipse/rdf4j/issues/2935 创建的错误票证。

    作为一种解决方法,您仍然可以移除 URI,因为 CRS84 实际上是默认参考系统。

    【讨论】:

    • 这是一个有效的 GeoSPARQL 文字。请参阅standards 中的第 8.5 节:对于 geo:wktLiterals,起始 URI 标识几何的空间参考系统。 - 这些 CRS URI 显然会影响整个处理,就像您拥有的来自不同 CRS 的文字一样在评估期间应用转换
    • @RedCrusaderJr 不确定您所说的“不在 geosparql 中”是什么意思 - 这不是真的。 [GeoSPARQL 标准文档](file:///tmp/mozilla_infai0/11-052r4_OGC_GeoSPARQL_-_A_Geographic_Query_Language_for_RDF_Data-1.pdf) 中明确指定了地理空间关系的使用。将这些关系用作图形模式中的 RDF 谓词在第 7 节中指定,作为空间函数的用法,即在 FILTER 子句中定义在第 9 节中。从关系谓词到 FILTER 的重写 RIF 规则在第 11 节中声明。
    • 如果它在 rdf4j 中不起作用,那么它根本没有实现(还)。但正如我所说,如何将查询重写为过滤器函数在 GeoSPARQL 标准的第 11 节中指定。所以,到最后也不会太难,只是需要有人去做。我很确定 RDF4J 社区对任何贡献都很高兴。
    • @RedCrusaderJr 我认为这个讨论有点超出了 StackOverflow 问题的格式 :) 我建议您通过 RDF4J 社区支持渠道之一与我们联系 - 请参阅 rdf4j.org/support。跨度>
    • @JeenBroekstra 我查看了 rdf4j 源代码,发现了 geosparql 测试查询。我现在会对此进行试验,但如果这让我陷入困境,我会在 Gitter 上与你联系。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    • 1970-01-01
    • 2019-10-30
    • 2015-04-11
    • 2022-01-25
    • 2019-12-22
    相关资源
    最近更新 更多