使用spring数据neo4j删除连接节点的节点的最佳方法是什么?

时间:2016-09-13 12:10:09

标签: neo4j

neo4j数据库中存储了一个树结构。需要删除包含所有子节点的节点。到目前为止,我可以提出两种方法:

  1. 编写自定义查询以删除节点及其所有子节点 与他们在数据库级别的关系。
  2. 删除节点本身并在单独的线程上运行递归函数,以删除所有子节点及其在应用程序级别的关系。
  3. 可以估计这些方法的有效性,并确定哪一种方法在没有基准的情况下更好(更快)?

2 个答案:

答案 0 :(得分:1)

你可以估计,是的,你应该估计第一个总是更快。如果您可以编写一个标识所有错误节点的查询,那么就这样做,然后DETACH DELETE结束那些节点。一个事务,一个Cypher翻译,然后其余的事务由专门的,专门构建的数据库代码处理。如果您能够在应用程序级别提出更快的方法,那么您应该编写一个竞争数据库。

答案 1 :(得分:1)

方法#2使用线程同时删除同一子图中的节点/关系,容易出错,应该避免使用。

删除关系时,neo4j的默认锁定机制将锁定关系及其端点;当多个线程同时尝试删除同一子图中的节点/关系时,这会导致死锁错误。

此外,线程可能会发现它正在尝试处理的节点/关系已经消失(由于其他线程的操作)。

以下是使用方法#1的Cypher查询示例。它应该在DETACH DELETE树中找到所有不同的节点并删除树(使用MATCH p=(a:Foo {id: 123})-[:BAR*0..]->(b:Foo) WITH COLLECT(b) AS ns1 UNWIND ns1 AS n WITH COLLECT(DISTINCT n) AS ns2 FOREACH(y IN ns2 | DETACH DELETE y); ,@ ToreEschliman也建议):

[EDITED]

CodeSet

[UPDATE]

根据评论中的新信息,以下是如何删除以特定MATCH p=(root:CodeSet {id: 123})<-[*0..]-(node) DETACH DELETE p; 节点为根的整个树:

MATCH

使用的{{1}}模式假定所有后代节点都是通过指向根节点的关系连接的。