RDF4J 和 GEOSparql 空间函数不起作用(或未实现)

RDF4J and GEOSparql spatial functions not working (or not implemented)

我正在使用 RDF4J,因为我被 GEOSPARQL 的广告实现所吸引(我在其他 RDF 框架中没有找到)。我遵循了基本指南和教程,但不幸的是我基本上无法执行任何广告查询。

我阅读并遵循了 http://docs.rdf4j.org/programming/#_geosparql, and all the examples at http://graphdb.ontotext.com/documentation/standard/geosparql-support.html, and at https://portal.opengeospatial.org/files/?artifact_id=47664 上的所有文档。似乎在 SPARQL 查询中起作用的唯一空间函数是 geof:distance,所有其他函数都不会产生任何结果。

所以我最终深入研究了包 org.eclipse.rdf4j.query.algebra.evaluation.function.geosparql 中的代码,以了解我可能应该实现和扩展一些 类 和接口,例如SpatialAlgebraSpatialSupportSpatialSupportInitializer。看起来许多功能并未完全(或部分)在空间逻辑中实现。显然,有一个 DefaultSpatialAlgebra 其中 returns 很多 notSupported。无论如何,理解什么是让 GEOSPARQL 正常工作的正确程序是一团糟(而且没有记录)。他们只说你可以实现自己的SpatialSupportInitializer,但之后如何使用它是一个谜。

从文档中可以看出,显然还有一种使用其他 SAIL 的方法,但同样,对此并不清楚。

谁能给我提供一些指导,或者至少是一段代码,其中显示了如何实际将 SpatialAlgebraSpatialSupportSpatialSupportInitializer 传递给引擎,哪个不是默认的?或者是否已经存在实现所有这些方法的 SAIL,我该如何使用它?谢谢。

PS:我其实是依赖RDF4J的2.4.0 M2版本,里面好像没有org.eclipse.rdf4j.query.algebra.evaluation.function.geosparql包(我手动导入的)。我也尝试过 2.3.1 版,但我遇到了同样的问题。

更新 自RDF4J 2.4.0-M3以来,GeoSPARQL功能支持更加全面。 improved documentation 给出了所有支持函数的完整列表,并且希望能更好地解释如何开始使用 GeoSPARQL。简短而有趣的是,您需要做的就是添加这个 Maven 模块:

<dependency>
    <groupId>org.eclipse.rdf4j</groupId>
    <artifactId>rdf4j-queryalgebra-geosparql</artifactId>
    <version>2.4.0-M3</version>
</dependency>

您可以在任何类型的 RDF4J 存储库上使用 GeoSPARQL。

RDF4J 开箱即用地支持其他几个 GeoSPARQL 函数:除了 distanceunionintersectionsymDifferencedifferenceconvexHullboundaryenvelopegetSRID 也至少受支持。不幸的是,sfContains 目前不是默认设置的一部分。这主要是由于 RDF4J 与以前版本的 JTS 库(多边形支持所必需)的许可问题有关。然而,最近的 JTS 版本是作为 LocationTech 项目的一部分完成的,并且这些许可问题已经解决,所以我们应该希望能够在不久的将来扩展它(在 https://github.com/eclipse/rdf4j-storage/issues/89 上有一个问题跟踪这个)。

与此同时,您确实需要创建自己的“SpatialAlgebra”class,您可以通过“SpatialSupportInitializer”将其添加到 RDF4J。这是一个变通办法 hack,但您应该创建一个 class 并将 `org.eclipse.rdf4j.query.algebra.evaluation.function.geosparql.SpatialSupportInitializer` 作为其完全限定名称,并确保它扩展了 `org.eclipse.rdf4j.query.algebra.evaluation.function.geosparql.SpatialSupport` 抽象 class,覆盖其 getSpatialContext 和 getSpatialAlgebra 方法以提供您的自定义变体。添加到您的 classpath 并重新启动,RDF4J 将选择它并使用您的 SpatialAlgebra 实现而不是它自己的实现。 底线是:这一切都非常测试。坦率地说,如果您认为您可以使用我上面提到的解决方法实现额外的 GeoSPARQL 函数,那么我们很乐意听取您的意见(如果可能的话,也希望您提供帮助)将其实际添加到 RDF4J 本身。