Aviv Paz
Aviv Paz

Reputation: 1125

Neo4j merge statement with id

I'm trying to do a merge statement. I'm trying to get the node with his node id, the problem that merging doesn't allow me to use 'where id(node)=nodeId'.

Something like:

merge( user:User) where id(user)=111 
on create set user = 
{facebookId:"13",name:"",gender:"",pushId:"", picoAccessToken:"",
   accessTokenExpires:""}
on match set user += 
{facebookId:"13",name:"",gender:"",pushId:"",picoAccessToken:"",
    accessTokenExpires:""}
return user

General question, should I use the node id to retrieve nodes? or should I add an id property to the node.

Upvotes: 1

Views: 2950

Answers (2)

wassgren
wassgren

Reputation: 19211

Michael Hunger from Neo Technology has already answered the question regarding internal ids here on StackOverflow.

The bottom line is that the node id should not be used, rather they should be considered an implementation detail.

So, the recommended approach is to use your own id property*. This can be a UUID, some kind of counter or whatever id that is suitable for your project.

Personally I like the UUID-approach. They are easy to generate from any language (e.g. the UUID-class in Java). The are unique and it is obvious that the are generated.

Upvotes: 2

Christophe Willemsen
Christophe Willemsen

Reputation: 20185

You can't use the "ID()" function with MERGE because it behaves as "MATCH or CREATE" and you can't assign internal ids manually to nodes.

On the other hand, YES! it is better to use an id generation at the application level that you will assign to nodes OR use the GraphAware UUID plugin that will do it for you https://github.com/graphaware/neo4j-uuid/tree/master.

Relying on nodes internal ids is considered as bad practice as ids of deleted nodes are reused in the database lifecycle.

Upvotes: 2

Related Questions