Neo4j Spatial-删除层导致添加的节点被删除。这是一个bug还是设计?

时间:2017-06-25 17:40:13

标签: neo4j cypher neo4j-spatial

我正在使用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});

这是一种设计行为吗?

如果是,您能否建议在不删除位置节点的情况下更新/删除索引的其他方法? 这里有一个建议的解决方案,但当位置节点更改lat / long值时,更新索引信息似乎很容易出错并且容易出错 neo4j-spatial: What is the official way to delete a node from a spatial index?

1 个答案:

答案 0 :(得分:1)

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

当你调用addNode时,节点本身将直接添加到RTree中,这意味着它将作为RTree中的叶节点。

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

由于我没有找到一种方法来删除RTree信息而不触及叶子节点,我建议采用以下方法:

如果要将节点添加到RTree中,可以创建具有相同位置的新节点(复制原始节点)并创建从原始节点到此新节点的边。通过这样做,当您调用removeLayer时,只会删除您复制的节点。您的原始节点不会受到影响。成本是您需要花费更多存储空间。

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