如果没有数据库,这是一个小的优化尝试,不确定是否有帮助。
了解更多关于域模型和元素之间的基数(例如 d 和 t 之间的基数)也会很好
MATCH (d:Decision) WHERE id(d) IN {decisionsIds}
OPTIONAL MATCH (d)-[r]-(t)
DELETE d, r
WITH t, collect(r) as rels
WHERE NOT (id(t) IN {decisionsIds}) AND NOT t:User OR t:Decision
OPTIONAL MATCH (t)-[r2:VOTED_ON|:CREATED_BY|:VOTED_FOR]-(t1)
WHERE NOT (r2 in rels)
OPTIONAL MATCH (t1)-[r3:CONTAINS]-(t2)
DELETE t, r2, t2, r3;
更新
用你的数据库测试过,效果很好。关于你的断言,我不确定哪些是违反的。
export decisionsIds=[332,336,335,334,333,340,339,338,337,344,343,342,341]
MATCH (d:Decision) WHERE id(d) IN {decisionsIds}
OPTIONAL MATCH (d)-[r]-(t)
DELETE d, r
WITH t, collect(r) as rels
WHERE NOT (t:User OR t:Decision) AND NOT (id(t) IN {decisionsIds})
OPTIONAL MATCH (t)-[r2:VOTED_ON|:CREATED_BY|:VOTED_FOR|:CONTAINS]-(t1)
WHERE NOT (r2 in rels)
DELETE t, r2
WITH t1
OPTIONAL MATCH (t1)-[:CONTAINS]-(t2)
// will be detach delete in 2.3
FOREACH ( p IN (t2)--() | DELETE head(rels(p)))
DELETE t2;
+-------------------+
| No data returned. |
+-------------------+
Nodes deleted: 362
Relationships deleted: 723
340 ms
你可以像这样找到你的违规节点:
neo4j-sh (?)$ match (n)-[r]-() where id(n) = 86715 return labels(n),n,r;
+----------------------------------------------------------------------------------------------------------------------------------+
| labels(n) | n | r |
+----------------------------------------------------------------------------------------------------------------------------------+
| ["VoteGroup","_VoteGroup"] | Node[86715]{createDate:"1443124989049",avgVotesWeight:5.0,totalVotesCount:1} | :CONTAINS[173172]{} |
| ["VoteGroup","_VoteGroup"] | Node[86715]{createDate:"1443124989049",avgVotesWeight:5.0,totalVotesCount:1} | :VOTED_ON[173169]{} |
| ["VoteGroup","_VoteGroup"] | Node[86715]{createDate:"1443124989049",avgVotesWeight:5.0,totalVotesCount:1} | :VOTED_FOR[173170]{} |
+----------------------------------------------------------------------------------------------------------------------------------+
如果您想查看所有被此查询触摸/将被删除的数据,请使用:
MATCH (d:Decision) WHERE id(d) IN {decisionsIds}
OPTIONAL MATCH (d)-[r]-(t)
WITH t, collect(r) as rels
WHERE NOT (t:User OR t:Decision) AND NOT (id(t) IN {decisionsIds})
OPTIONAL MATCH (t)-[r2:VOTED_ON|:CREATED_BY|:VOTED_FOR|:CONTAINS]-(t1)
WHERE NOT (r2 in rels)
OPTIONAL MATCH (t1)-[:CONTAINS]-(t2)
RETURN *;
然后您可以在结果中找到您的违规节点,并确保您删除了它们周围的所有内容(每个 rel 类型)。