Neo4j 将关系(及其属性)克隆到新节点
这就是我想做的: 以可能为空的“原始”开头Neo4j 将关系(及其属性)克隆到新节点,neo4j,cypher,Neo4j,Cypher,这就是我想做的: 以可能为空的“原始”开头 WITH original, duplicate, [(original)-[rel1:HAS_RELATIONSHIPS]->(nodes) | nodes] as n UNWIND CASE WHEN size(n)=0 THEN [null] ELSE n END AS nodes FOREACH (o IN CASE WHEN NOT nodes is null THEN [1] ELSE [] END | MERGE (dupli
WITH original, duplicate, [(original)-[rel1:HAS_RELATIONSHIPS]->(nodes) | nodes] as n
UNWIND CASE WHEN size(n)=0 THEN [null] ELSE n END AS nodes
FOREACH (o IN CASE WHEN NOT nodes is null THEN [1] ELSE [] END |
MERGE (duplicate)-[rel2:HAS_RELATIONSHIPS]->(nodes)
SET rel2.Property=rel1.Property)
WITH duplicate, continue...
我基本上希望将rel1(存在于原始节点和节点之间)克隆到rel2(存在于重复节点和与rel1相同的节点之间)
我看过一些apoc,但坦率地说,我发现完全缺乏文档,所以我甚至不知道从哪里开始
WITH original, duplicate
match (original)-[rel:HAS_RELATIONSHIPS]->()
CALL apoc.refactor.from(rel, duplicate) YIELD input, output
WITH duplicate, continue...
但这场比赛会输
或
但这里的匹配可能会解除我的变量绑定
似乎应该有一种比apoc更简单的方法来做到这一点
我非常感谢你的指点。谢谢 这段代码应该适合您:
...
OPTIONAL MATCH (original)-[r:HAS_RELATIONSHIP]->(n)
FOREACH(x IN CASE WHEN n IS NOT NULL THEN [1] END |
MERGE (duplicate)-[r2:HAS_RELATIONSHIP]->(n)
SET r2 = r
)
...
FOREACH
用于避免在n
为NULL
时调用MERGE
,这将导致错误SET
可用于(如上所示)将所有属性从一个关系(或节点)复制到另一个关系。我将在完全QAE后更新发布,但我将尝试:
WITH original, duplicate,
[(original)-[rel1:HAS_RELATIONSHIP]->(node) | node {id: id(node), Prop: rel1.Prop}] as list
UNWIND CASE WHEN size(list)=0 THEN [null] ELSE list END AS nodes
FOREACH(o IN CASE WHEN NOT nodes is NULL THEN [nodes] ELSE [] END |
MERGE (n {id(n): nodes.id})
MERGE (duplicate)-[rel2:HAS_RELATIONSHIP]->(n)
SET rel2.Prop=nodes.Prop)
你能用一句话概括一下你想做什么吗?谢谢!忘了提到我不能做可选匹配,因为原始可能是空的。。。对于模式理解,没有其他方法可以做到这一点吗?如果
original
为NULL
,可选匹配
仍将“起作用”。它只会为r
和n
产生NULL
值。我的理解是,从NULL开始的可选匹配仍然会执行,就好像变量未绑定一样,并且最终会有很多匹配(也就是说,它会发现所有节点都有关系类型关系。现在我做了一些小测试,看起来你是对的。算了。谢谢!不。如果original
为NULL
,那么可选匹配将不匹配任何内容,只需将r
和n
绑定到NULL
值。是的-这是有效的。但必须使用生成的id,因为不能在neo4j id上合并。
WITH original, duplicate,
[(original)-[rel1:HAS_RELATIONSHIP]->(node) | node {id: id(node), Prop: rel1.Prop}] as list
UNWIND CASE WHEN size(list)=0 THEN [null] ELSE list END AS nodes
FOREACH(o IN CASE WHEN NOT nodes is NULL THEN [nodes] ELSE [] END |
MERGE (n {id(n): nodes.id})
MERGE (duplicate)-[rel2:HAS_RELATIONSHIP]->(n)
SET rel2.Prop=nodes.Prop)