我正在使用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?
答案 0 :(得分:1)
我已经查看了neo4j空间包的源代码,以了解addNode和removeLayer程序是如何实现的。
当你调用addNode时,节点本身将直接添加到RTree中,这意味着它将作为RTree中的叶节点。
当您调用removeLayer时,RTree中的所有内容都将从neo4j中删除,包括此RTree中的所有节点和所有边缘。
由于我没有找到一种方法来删除RTree信息而不触及叶子节点,我建议采用以下方法:
如果要将节点添加到RTree中,可以创建具有相同位置的新节点(复制原始节点)并创建从原始节点到此新节点的边。通过这样做,当您调用removeLayer时,只会删除您复制的节点。您的原始节点不会受到影响。成本是您需要花费更多存储空间。
PS。如果要在这种情况下调用removeLayer,则需要在调用removeLayer之前删除您创建的边。原因是如果有任何边连接到节点,则无法删除该节点。