How to use Create Unique with Cypher

时间秒杀一切 提交于 2019-12-10 12:06:22

问题


My target is to create node + set new property to it in case not exists

if it's exist I just want to update it's property

Tried this:

MATCH (user:C9 {userId:'44'})
CREATE UNIQUE (user{timestamp:'1111'})
RETURN user

*in case the node with the property userId=44 already existed I just want to set it's property into 1111 else just create it and set it.

error I am getting:

user already declared (line 2, column 16 (offset: 46))
"CREATE UNIQUE (user{timestamp:'1111'})"

should I switch to Merge or?

thanks.


回答1:


Yes, you should use the MERGE statement.

MERGE (user:C9 {userId:'44'})
// you can set some initial properties when the node is created if required
//ON CREATE SET user.propertykey = 'propertyvalue' 
ON MATCH SET user.timestamp = '1111'
RETURN user

You mention unique constraints - I assume you have one set up. You definitely should do to prevent duplicate nodes being created. It will also create a schema index to improve the performance of your node lookup. If you do not yet have a unique constraint then it can be created like so

CREATE CONSTRAINT ON (u:C9) ASSERT u.userId IS UNIQUE

See the Neo4j MERGE documentation.

Finally, to understand what is going on in your query let's have a quick look line by line.

MATCH (user:C9 { userId:'44' })

This matches the node with label :C9 that has a userId property with value 44 and assigns it the identifier user.

CREATE UNIQUE (user{timestamp:'1111'})

This line is simply trying to create a new node with no label and a property timestamp with value '1111'. The exception you are seeing is a result of you using the same user identifier that has already been used in the first line. However, this is not a supported way to use CREATE UNIQUE as it requires a match first and will then create bits of the pattern that does not exist. The upside of this is that it is stopping this unwanted node (user{timestamp:'1111'}) being created in the graph.

RETURN user

This line is pretty self explanatory and is not being reached.

EDIT There seems to be some confusion surrounding CREATE UNIQUE and when it should be used. This query

CREATE UNIQUE (user:C9 {timestamp:'1111'})

will fail with the message

This pattern is not supported for CREATE UNIQUE

To use CREATE UNIQUE you would first match an existing node and then use that to create a unique pattern in the graph. So to create a relationship from user to a second node you would use

MATCH (user:C9 { userId: '44' }
CREATE UNIQUE (user)-[r:FOO]-(bar)
RETURN r

If there is no relationships of type FOO from user then a new node will be created to represent bar and relationship of type :FOO will be created between them. Conversely, if the MATCH statement does not make a match then no nodes or relationships will be created.



来源:https://stackoverflow.com/questions/33688139/how-to-use-create-unique-with-cypher

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!