neo4j数据库中存储了一个树结构。需要删除包含所有子节点的节点。到目前为止,我可以提出两种方法:
可以估计这些方法的有效性,并确定哪一种方法在没有基准的情况下更好(更快)?
答案 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}}模式假定所有后代节点都是通过指向根节点的关系连接的。