如果基于特定属性不存在节点,则如何创建节点,否则返回现有节点

时间:2017-05-25 11:49:16

标签: neo4j cypher

我有一个名为User的节点,它有两个属性--id和name。 name和id都是唯一的属性。在创建新节点时,我的代码会随机生成id。

我需要的是一个cypherquery,它允许我通过匹配'name'字段来检查特定用户是否存在,如果已经存在,则返回该用户。如果用户不存在,我需要该查询来创建具有指定名称的新节点,并生成要在节点中设置的新ID。

我尝试使用CREATE UNIQUE,但我知道我没有以正确的方式使用它:

MATCH(u:User {name: 'John'}) 
CREATE UNIQUE (u:User {id: 'rksaxrN--', name: 'John'}) 
RETURN u;

我尝试过的另一种方法是使用MERGE,如下所示:

MERGE (u:User {name: 'John'}) 
SET u.id = "rksaxrN--";

但是在MERGE情况下,如果已经找到用户,则仍然执行SET命令,这意味着我需要指定一个id,即使它是一个现有节点。现在,因为id实际上是随机生成的,所以我最终会用新的id覆盖现有的id,我不希望这样。我希望能够仅在创建新节点时设置ID,否则无法设置。

1 个答案:

答案 0 :(得分:2)

你非常接近得到你想要的东西。您只需将ON CREATE添加到SET语句中即可。

MERGE (u:User {name: 'John'}) 
ON CREATE SET u.id = "rksaxrN--"
RETURN u;