首页 > 解决方案 > 通过模式理解减少/避免空节点上的可选匹配

问题描述

如何将属性设置为节点上相关节点属性的迭代,这些节点是我在 foreach 中遵循可选匹配的语句的结果?

我正在用新节点替换旧节点,并相应地更改与旧节点相关的节点的 ID。ID 是链接的新节点的串联。

我尝试了两个后续的可选匹配,但害怕如果第一个返回 null,那么第二个将匹配 ALL,这将是很多问题。

 MATCH (old), (new)
 ...bunch of stuff...
 WITH old, new
 OPTIONAL MATCH (old)-[oldrel:HAS]->(parent)
 FOREACH (o IN CASE WHEN parent IS NOT NULL THEN [parent] ELSE [] END|           
 MERGE (new)-[newrel:HAS]->(parent)
 DELETE oldrel
 SET parent.newID=[(parent)<-[:HAS]-(children) | REDUCE(iterate="", child IN children |  iterate + "," + child.Property1+child.Property2)] )

也尝试过,但是当父母为空时有问题......

 MATCH (old), (new)
 ...bunch of stuff...
 WITH old, new
 OPTIONAL MATCH (old)-[oldrel:HAS]->(parent)
 FOREACH (o IN CASE WHEN parent IS NOT NULL THEN [parent] ELSE [] END| MERGE (new)-[newrel:HAS]->(parent))
 DELETE oldrel
 WITH old, new, parent
 OPTIONAL MATCH (parent)<-[:HAS]-(children)
 SET parent.newID=REDUCE(iterate="", child IN children |  iterate + "," + child.Property1+child.Property2)

期望的结果:

如果 oldchild 1 具有属性 1: 3 和属性 2: X

并且 newchild 1 具有属性 1: 9 和属性 2: Y

然后父 ID1 从 3X,5Q 切换到 5Q,9Y(理想情况下以这种方式排序)

并且父 ID2 从 0P、3X、6S 切换到 0P、6S、9Y(理想情况下以这种方式排序)

如果 old 没有父节点,则没有节点交换 ID

标签: neo4jcypher

解决方案


这可能对您有用:

MATCH (old), (new)
...bunch of stuff...
WITH old, new
MATCH (old)-[oldrel:HAS]->(parent)
MERGE (new)-[newrel:HAS]->(parent)
DELETE oldrel
WITH parent, new
OPTIONAL MATCH (parent)<-[:HAS]-(child)
WHERE child <> new
WITH parent, COLLECT(child) + new AS children
SET parent.newID=
    REDUCE(iterate="", child IN children |
      iterate + "," + child.Property1+child.Property2)

推荐阅读