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
中的代码,以了解我可能应该实现和扩展一些 类 和接口,例如SpatialAlgebra
、SpatialSupport
、SpatialSupportInitializer
。看起来许多功能并未完全(或部分)在空间逻辑中实现。显然,有一个 DefaultSpatialAlgebra
其中 returns 很多 notSupported
。无论如何,理解什么是让 GEOSPARQL 正常工作的正确程序是一团糟(而且没有记录)。他们只说你可以实现自己的SpatialSupportInitializer
,但之后如何使用它是一个谜。
从文档中可以看出,显然还有一种使用其他 SAIL 的方法,但同样,对此并不清楚。
谁能给我提供一些指导,或者至少是一段代码,其中显示了如何实际将 SpatialAlgebra
或 SpatialSupport
或 SpatialSupportInitializer
传递给引擎,哪个不是默认的?或者是否已经存在实现所有这些方法的 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 函数:除了 distance
、union
、intersection
、symDifference
, difference
、convexHull
、boundary
、envelope
和 getSRID
也至少受支持。不幸的是,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 本身。
我正在使用 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
中的代码,以了解我可能应该实现和扩展一些 类 和接口,例如SpatialAlgebra
、SpatialSupport
、SpatialSupportInitializer
。看起来许多功能并未完全(或部分)在空间逻辑中实现。显然,有一个 DefaultSpatialAlgebra
其中 returns 很多 notSupported
。无论如何,理解什么是让 GEOSPARQL 正常工作的正确程序是一团糟(而且没有记录)。他们只说你可以实现自己的SpatialSupportInitializer
,但之后如何使用它是一个谜。
从文档中可以看出,显然还有一种使用其他 SAIL 的方法,但同样,对此并不清楚。
谁能给我提供一些指导,或者至少是一段代码,其中显示了如何实际将 SpatialAlgebra
或 SpatialSupport
或 SpatialSupportInitializer
传递给引擎,哪个不是默认的?或者是否已经存在实现所有这些方法的 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 函数:除了 distance
、union
、intersection
、symDifference
, difference
、convexHull
、boundary
、envelope
和 getSRID
也至少受支持。不幸的是,sfContains
目前不是默认设置的一部分。这主要是由于 RDF4J 与以前版本的 JTS 库(多边形支持所必需)的许可问题有关。然而,最近的 JTS 版本是作为 LocationTech 项目的一部分完成的,并且这些许可问题已经解决,所以我们应该希望能够在不久的将来扩展它(在 https://github.com/eclipse/rdf4j-storage/issues/89 上有一个问题跟踪这个)。