Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j 将关系(及其属性)克隆到新节点_Neo4j_Cypher - Fatal编程技术网

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)