我想找到一个路径(在本例中是整个数据库),其中有:B
个节点没有传入:s
- 边缘,然后删除所有:B
个路径。
这是我的测试数据库:
MERGE (B1:B {name:"B1"})-[:t]->(B2:B {name:"B2"})-[:t]->(B3:B {name:"B3"})-[:t]->(B4:B {name:"B4"})-[:t]->(B5:B {name:"B5"})-[:t]->(C1:D {name:"D1"})
MERGE (A1:A {name:"A1"})-[:s]->(B1)
MERGE (A2:A {name:"A2"})-[:s]->(B2)
MERGE (A3:A {name:"A3"})-[:s]->(B4)
MERGE (A5:A {name:"A5"})-[:s]->(B5)
5)
我上次尝试的查询是这样的,但它会抛出一个错误:
MATCH p=(n:A)-[*] ->(o:B)-[:t*]->(m:D)
WITH NODES(p)[1..-1] AS Pspace_nodes, o, p
MATCH o WHERE NOT ()-[:s]->(o)
FOREACH (n IN Pspace_nodes| MATCH n-[*]-() DELETE n , r)
错误讯息:
py2neo.cypher.error.statement.InvalidSyntax: Invalid use of MATCH inside FOREACH (line 4, column 29 (offset: 143))
"FOREACH (n IN Pspace_nodes| MATCH n-[*]-() DELETE n , r)
我如何以有效的方式表达这一点?
答案 0 :(得分:1)
[EDITED]
这可能对您有用:
MATCH p=(:A)-[r*]-(:D)
WHERE ANY (x IN NODES(p)[1..-1] WHERE x:B AND NOT ()-[:s]->(x))
WITH REDUCE(s =[], y IN NODES(p)[1..-1]| CASE WHEN y:B THEN s + y ELSE s END ) AS todo
UNWIND todo AS node
WITH DISTINCT node
DETACH DELETE node;
在较大的数据库中,这可能需要很长时间才能运行,因为MATCH
指定了可变长度路径。如果这是一个问题,您应该使用合理的上限(例如[r*..5]
)。
WHERE
子句筛选具有B
节点但没有传入:s
关系的路径。 REDUCE
函数收集路径中的所有B
个节点。 UNWIND
将每个B
节点放在一个单独的行中。 DISTINCT
删除所有重复节点,以便删除尝试不会尝试两次删除节点(这会导致neo4j生成错误)。 DETACH DELETE
子句不仅会删除那些B
节点,还会删除所有关系(因为不允许删除节点而不删除节点)。