2013-04-26 149 views
2

使用Neo4j - 图数据库内核2.0.0-M02和新的合并功能, 我试图将节点合并成一个新的(合并并不真正合并,但绑定到根据文档返回标识符)并删除旧节点。我现在只在意将要转移到新节点的属性而不是关系。 我目前所面对的是低于使用Neo4j合并节点到新的一个与cypher和neo4j

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从n到x为每次用替换所有属性创建一个新的x 2.移动性new n 因此,如果来自合并的第n个节点具有2个属性a,b和第二个c,d在集合x = n之后,则所有新节点都以c,d属性结束。我知道是在文档中说明,所以我的问题是: 有没有办法将一个新节点中的N个节点(也可能是关系)的所有属性与密码合并?

回答

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/

0

使用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的值,如果同时设置。