SotirisTsartsaris
SotirisTsartsaris

Reputation: 638

merging nodes into a new one with cypher and neo4j

using Neo4j - Graph Database Kernel 2.0.0-M02 and the new merge function, I was trying to merge nodes into a new one (merge does not really merges but binds to the returning identifier according to the documentation) and delete old nodes. I only care at the moment about properties to be transferred to the new node and not relationships. What I have at the moment is the cypher below

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 

Problems 1. When foreach runs it creates a new x for every n 2. Moving properties from n to x is replacing all properties each time with the new n so if the 1st n node from merge has 2 properties a,b and the second c,d in the and after the set x=n all new nodes end up with c,d properties. I know is stated in the documentation so my question is: Is there a way to merge all properties of N number of nodes (and maybe relationships as well) in a new node with cypher only?

Upvotes: 2

Views: 9239

Answers (2)

miro marchi
miro marchi

Reputation: 737

With Neo4j-3.x it is also possible to merge two nodes into one using a specific apoc procedure.

First you need to download the apoc procedures jar file in your into your $NEO4J_HOME/plugins folder and start the Neo4j server.

Then you can call apoc.refactor.mergeNodes this way:

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

As I can see it, the resulting node would have all the properties of both x and y, choosing the values of y if both are set.

Upvotes: 4

cybersam
cybersam

Reputation: 66967

I don't think the Cypher language currently has a syntax that non-destructively copies any and all properties from one node into another.

However, I'll present the solution to a simple situation that may be similar to yours. Let's say that some User nodes have the properties a & b, and some others have c & d. For example:

  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 });

This is how we would "merge" all User nodes with the same id into a single node:

  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

You can try this out in the neo4j sandbox at: http://console.neo4j.org/

Upvotes: 4

Related Questions