GeoSparql函数在RDF4J的存储库中未按预期工作

GeoSparql函数在RDF4J的存储库中未按预期工作,sparql,wkt,rdf4j,geosparql,Sparql,Wkt,Rdf4j,Geosparql,我和同事们正在使用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.

我和同事们正在使用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的结果:

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

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))
}
结果:-空表-

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

rdf4j存储3.6.0 rdf4j queryalgebra geosparql 3.6.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))
相反,得到了以下两个结果:

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的文字错误或警告,这是令人困惑的

更新:

再看一看注释,这实际上是RDF4J中的一个bug。正如中的第8.5节所述,参考系统的前缀URI不是WKT规范本身的一部分,而是对WKT文字定义的GeoSPARQL特定添加。因此,RDF4J需要在将其交给底层WKTReader之前对其进行预处理。错误票证创建为


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

这是一个有效的GeoSPARQL文本。请参见:中的第8.5节,对于geo:wktLiterals,起始URI标识几何体的空间参考系统。-这些CRS URI显然会影响整个处理过程,因为对于来自不同CRS的文本,您必须在转换过程中应用转换evaluation@RedCrusaderJr不确定geosparql中不存在是什么意思-这不是真的。[GeoSPARQL标准文档]中规定了地理空间关系的用法file:///tmp/mozilla_infai0/11-052r4_OGC_GeoSPARQL_-_A_Geographic_Query_Language_for_RDF_Data-1.pdf 当然可以在第7节中指定了这些关系作为RDF谓词在图形模式中的用法,在第9节中定义了作为空间函数的用法,即在过滤器子句中的用法。第11节声明了一个从关系谓词到过滤器的重写RIF规则。如果它在rdf4j中不起作用,那么它还没有实现。但正如我所说,如何将查询重写为过滤器函数在GeoSPARQL标准的第11节中有详细说明。所以,这最终不会太难,只是有人不得不这么做。我很确定RDF4J社区对任何贡献都很满意。@RedCrusaderJr我认为这个讨论有点超出了StackOverflow问题的形式:我建议您通过RDF4J社区支持渠道与我们联系-请参阅。@JeenBroekstra我通过RDF4J源代码查找了geosparql测试查询。我现在会尝试一下,但如果这让我束手无策,我会通过Gitter联系你。
<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))
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