Cypher - 删除具有给定属性的节点并重新连接图

时间:2016-12-14 11:59:40

标签: neo4j cypher

我有一个由路径组成的图表。 enter image description here 我需要删除所有具有属性的节点:     linksTo:'的javascript' 删除后我必须重新连接路径。这意味着我需要为每个差距创建一个新的关系。此关系具有名为deltaTime的属性,该属性包含一些整数值。此值(deltaTime)应该是此路径的已删除关系的所有deltaTime属性的总和。请查看以下图片以便更好地理解。 enter image description here 我不知道如何检测多个"坏"连续的节点,行长可变。

1 个答案:

答案 0 :(得分:0)

如果您可以提供图表中涉及的标签以及您正在使用的关系类型,那将会有所帮助。

假设所有这些路径都是链(只有连接每个节点的单一关系),这样的东西应该适合你:

// first, add a label on all the nodes we plan on deleting
// it helps if they already have the same label especially if linksTo property is indexed.
MATCH (n{linksTo:'javascript'})
SET n:ToDelete

在标记了适当的节点后,我们将找到要删除的节点段,需要连接的周围节点,以及创建新关系。我们确保a和b是链的起始和结束节点,确保没有:ToDelete节点链接到a或b。

MATCH (a:ToDelete)
WHERE NOT (:ToDelete)-->(a)
AND ()-->(a)
MATCH p = (a)-[rel*0..]->(b:ToDelete)
WHERE ALL(node in nodes(p) WHERE node:ToDelete)
AND NOT (b)-->(:ToDelete)
AND (b)-->()
WITH a, b, REDUCE(s = 0, r IN rel | s + r.value) as sum
// now get the adjacent nodes we need to connect
MATCH (x)-[r1]->(a), (b)-[r2]->(y)
WITH x, y, sum + r1.value + r2.value AS sumValue
// making up relationship type and property name as I don't know what you're using
MERGE (x)-[:Rel{value: sumValue}]->(y)

最后,当您确定新关系看起来正确时,请删除不再需要的节点。

MATCH (n:ToDelete)
DETACH DELETE n