使用cypher和neo4j将节点合并为新节点

使用cypher和neo4j将节点合并为新节点,neo4j,Neo4j,使用Neo4j-Graph数据库内核2.0.0-M02和新的合并函数, 我试图将节点合并到一个新节点中(merge并不真正合并,而是根据文档绑定到返回的标识符),并删除旧节点。我现在只关心要转移到新节点的属性,而不关心关系。 我现在拥有的是下面的密码 merge (n:User {form_id:123}) //I get the nodes with form_id=123 and label User with n match p=n //subject to change to ha

使用Neo4j-Graph数据库内核2.0.0-M02和新的合并函数, 我试图将节点合并到一个新节点中(merge并不真正合并,而是根据文档绑定到返回的标识符),并删除旧节点。我现在只关心要转移到新节点的属性,而不关心关系。 我现在拥有的是下面的密码

merge (n:User {form_id:123})  //I get the nodes with form_id=123 and label User 
with n match p=n  //subject to change to have the in a collection  
create (x) //create a new  node 
foreach(n in nodes(p): set x=n) //properties of n copied over to x
return n,x 
问题 1.当foreach运行时,它会为每个n创建一个新的x 2.将属性从n移动到x意味着每次都用新的n替换所有属性 因此,如果merge中的第一个n节点有两个属性a、b和第二个c、d,在集合x=n之后,所有新节点都以c、d属性结束。我知道文件中有说明,所以我的问题是:
有没有一种方法可以将N个节点(可能还有关系)的所有属性合并到一个只使用cypher的新节点中?

我认为cypher语言目前没有一种语法可以将任何和所有属性从一个节点无损地复制到另一个节点

但是,我将介绍一个简单情况的解决方案,可能与您的类似。假设有些用户节点具有属性a和b,而有些用户节点具有属性c和d。例如:

  CREATE (:User { id:1,a: 1,b: 2 }),(:User { id:1,c: 3,d: 4 }),
         (:User { id:2,a:10,b:20 }),(:User { id:2,c:30,d:40 });
这就是我们将具有相同id的所有用户节点“合并”为单个节点的方式:

  MATCH (x:User), (y:User)
  WHERE x.id=y.id AND has(x.a) AND has(y.c)
  SET x.c = y.c, x.d = y.d
  DELETE y
  RETURN x

您可以在neo4j沙箱中尝试此操作,网址为:

,使用neo4j-3.x,还可以使用特定的节点将两个节点合并为一个节点

首先,您需要将apoc程序jar文件下载到
$NEO4J_HOME/plugins
文件夹中,然后启动NEO4J服务器

然后你可以这样称呼:

MATCH (x:User), (y:User)
WHERE x.id=y.id
call apoc.refactor.mergeNodes([x,y]) YIELD node
RETURN node
如我所见,生成的节点将具有x和y的所有属性,如果都设置了,则选择y的值