Cypher:从Path中删除节点

时间:2016-03-30 15:42:34

标签: path neo4j cypher

我想找到一个路径(在本例中是整个数据库),其中有: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)

enter image description here

我上次尝试的查询是这样的,但它会抛出一个错误:

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)

我如何以有效的方式表达这一点?

1 个答案:

答案 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节点,还会删除所有关系(因为不允许删除节点而不删除节点)。