spring 数据 neo4j 空间处理多边形

spring data neo4j spatial working with polygons

美好的一天,

我想在更大范围内构建几何图形。为此,我将几何数据从各种来源(也包括 shp 文件)导入到使用 spring-data-neo4j 的嵌入式 neo4j 数据库中。到目前为止一切顺利。

我被困在哪里: 在我的域中,我定义了一个 Building 形状为 Polygon wkt; 的实体 是否可以通过 CRUDRepository?

创建具有 Polygon 属性 的节点

有了 Point 就可以正常工作了:例如

@NodeEntity
public class Building implements Serializable{
    @GraphId
    private Long id;
    @Indexed(indexType = IndexType.POINT, indexName = "building_wkt_index", unique = false)
    private Point wkt;
}

public interface BuildingRepository extends GraphRepository<Building>, SpatialRepository<Building>{
/**
 * CRUD
 */
}

Building b = new Building();        
b.setWkt(new Point(12,12));
buildingService.save(b);

问题是 LinesPolygons 没有实现 IndexType。 这是我使用 spring-data 和 neo4j 的第一个项目,所以我不确定应该朝哪个方向发展。 查看 neo4j 空间文档表明,使用 wkt 应该可以存储 Polygons(参见 http://neo4j-contrib.github.io/spatial/#spatial-server-plugin

also proposes to create a spatial index via REST. Another suggestion is this one: 。

我尝试像这样手动创建空间索引:

Transaction tx = template.getGraphDatabaseService().beginTx();
template.getGraphDatabaseService().index().forNodes("building_wkt_index", MapUtil.stringMap(
IndexManager.PROVIDER, "spatial", "geometry_type", "polygon", "wkt", "wkt"));
tx.success();

并调用存储库的 save()。 但是,这似乎不起作用。 wkt 没有存储,它是空的。

是否可以在我的 Building 中以某种方式使用这个命名索引(甚至可能) - 或者将所有事务移动到 neo4j 空间插件的 REST 上确实是唯一的方法。

是否可以实施新的 IndexType? 非常感谢所有输入!

对于任何对可能的解决方案感兴趣的人:

1st 我手动创建空间索引:

template.getGraphDatabaseService().index().forNodes("your_spatial_index", MapUtil.stringMap(
            IndexManager.PROVIDER, "spatial", "geometry_type","polygon","wkt", "wkt"));

在域实体中,wkt 存储为字符串:

String wkt;

然后我将存储库访问权限移至一项服务。 当一个新的节点被保存时,这个节点被手动添加到空间索引中:

Transaction tx = template.getGraphDatabase().beginTx();
Node n = template.getNode(b.getId());
template.getGraphDatabase().getIndex("your_spatial_index").add(n,"id",b.getId());
tx.success();
tx.close();

至少,这是将多边形 wkt 添加到 R 树的快速修复。 但是,更新和删除索引节点必须手动处理。