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

时间:2013-04-26 08:55:58

标签: neo4j

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

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替换所有属性 因此,如果合并的第一个n节点有2个属性a,b和第二个c,d在集合x = n之后,所有新节点都以c,d属性结束。我知道在文档中说明,所以我的问题是: 有没有办法在只有cypher的新节点中合并N个节点的所有属性(也可能是关系)?

2 个答案:

答案 0 :(得分:1)

我认为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沙箱中尝试此操作:http://console.neo4j.org/

答案 1 :(得分:1)

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

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

然后你可以这样打电话给apoc.refactor.mergeNodes

MATCH (x:User), (y:User)
WHERE x.id=y.id
call apoc.refactor.mergeNodes([x,y]) YIELD node
RETURN node

正如我所看到的,结果节点将具有x和y的所有属性,如果两者都设置,则选择y的值。