RDF4J和GEOSparql空间功能不起作用(或未实现)

时间:2018-07-27 15:47:43

标签: java sparql rdf4j geosparql

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

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

因此,我最终会深入研究org.eclipse.rdf4j.query.algebra.evaluation.function.geosparql包中的代码,以了解有些类和接口可能应该实现和扩展,例如SpatialAlgebraSpatialSupportSpatialSupportInitializer。看来许多功能并未在空间逻辑中完全(或部分)实现。显然,有一个DefaultSpatialAlgebra返回了大量的notSupported。无论如何,了解使GEOSPARQL正常工作的正确过程是一个混乱的过程(没有文档记录)。他们只是说您可以实现自己的SpatialSupportInitializer,但是之后如何使用它是一个谜。

从文档中看,显然还有一种使用其他SAIL的方法,但同样,这还不清楚。

任何人都可以为我提供一些指导,或者至少是一段代码,向其展示如何将SpatialAlgebraSpatialSupportSpatialSupportInitializer实际传递给引擎不是默认的吗?还是已经存在实现所有这些方法的SAIL,该如何使用?谢谢。

PS:我实际上是依靠2.4.0 M2版本的RDF4J,它似乎没有org.eclipse.rdf4j.query.algebra.evaluation.function.geosparql包(我手动导入)。我也尝试使用2.3.1版,但是遇到了同样的问题。

1 个答案:

答案 0 :(得分:2)

更新自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函数:除了distanceunionintersectionsymDifference,{{1} },differenceconvexHullboundaryenvelope也至少受支持。不幸的是,getSRID当前不属于默认设置。这主要是由于RDF4J在早期版本的JTS库中存在许可问题(需要多边形支持)。但是,作为LocationTech项目的一部分,已经完成了更多的JTS发布,并且这些许可证问题已得到解决,因此我们希望能够在不久的将来进行扩展(在https://github.com/eclipse/rdf4j-storage/issues/89处存在跟踪该问题的问题)。

同时,您确实需要创建自己的`SpatialAlgebra`类,您可以通过`SpatialSupportInitializer`将其添加到RDF4J中。这是一种变通办法,但是您应该使用org.eclipse.rdf4j.query.algebra.evaluation.function.geosparql.SpatialSupportInitializer`作为其完全限定的名称来创建一个类,并确保它扩展了` org.eclipse.rdf4j.query.algebra.evaluation.function.geosparql.SpatialSupport`抽象类,重写其`getSpatialContext`和`getSpatialAlgebra`方法以提供您的自定义变体。添加到您的类路径并重新启动,RDF4J将选择它并使用您的`SpatialAlgebra`实现而不是其自己的实现。 底线是:这都是beta。坦率地说,如果您认为可以使用我上面提到的解决方法来实现其他GeoSPARQL功能,那么我们很乐意在实际将其添加到RDF4J本身时提供您的意见(如果可能的话,还有您的帮助)。