Neo4j Spatial- Remove 图层导致添加的节点被删除。这是错误还是设计使然?

Neo4j Spatial- Remove layer cause the added nodes deleted. Is it a bug or by design?

我将 Neo4j 3.2 与 Neo4j Spatial 插件 0.24-neo4j-3.1.1 一起使用 添加层后,我尝试创建节点并将其添加到索引 spatial.addNode

CALL spatial.addPointLayer('geom');

CREATE (n:Node {latitude:60.1,longitude:15.2})
WITH n
CALL spatial.addNode('geom',n) YIELD node
RETURN node;

我也试过创建一个新的,稍后添加到索引中

CREATE (n:Node {latitude:60.1,longitude:55.2});

MATCH (n:Node {latitude:60.1,longitude:55.2})
WITH n
CALL spatial.addNode('geom',n) YIELD node
RETURN node;

后来我试着打电话给

CALL spatial.removeLayer("geom");

该过程删除所有节点,包括由

创建的节点
CREATE (n:Node {latitude:60.1,longitude:55.2});

这是设计使然的行为吗?

如果是,您能否建议在不删除位置节点的情况下 update/delete 索引的任何其他方法? 这里有一个建议的解决方案,但是当位置节点更改 lat/long 值时更新索引信息时,它看起来很笨拙且容易出错

我查看了 neo4j 空间包的源代码,了解 addNode 和 removeLayer 过程是如何实现的。

调用addNode时,节点本身会被直接添加到RTree中,即作为RTree中的叶子节点。

当您调用 removeLayer 时,RTree 中的所有内容将从 neo4j 中删除,包括该 RTree 中的所有节点和所有边。

由于我还没有找到一种在不触及叶节点的情况下删除RTree信息的方法,我建议采用以下方法:

当你想在RTree中添加一个节点时,你可以创建一个具有相同位置的新节点(复制原始节点)并创建一条从原始节点到这个新节点的边。这样,当您调用 removeLayer 时,只会删除您复制的节点。您的原始节点不会受到影响。代价是你需要花费更多的存储空间。

ps。当你想在这种情况下调用 removeLayer 时,你需要在调用 removeLayer 之前删除你创建的边。原因是如果有任何边连接到节点,则无法删除该节点。