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 之前删除你创建的边。原因是如果有任何边连接到节点,则无法删除该节点。
我将 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 之前删除你创建的边。原因是如果有任何边连接到节点,则无法删除该节点。