如果不存在,则在neo4j中创建关系;如果存在,则更新属性值

时间:2018-08-31 07:13:00

标签: neo4j merge cypher

我有一个具有三个属性的节点,比如说创建类似

create (a:item{type:'detergent', weight:'500g', 'quantity':322}) 

和另一个节点

create (b:customer{id:'933B3'})

从节点count到节点a应该存在具有属性b的关系。

如果该关系尚不存在,我想与count = 1建立关系,否则通过向其加1来更新其计数值,例如set relationship.count = relationship.count + 1

我可以同时使用MERGEON CREATEON MATCH。但是,这是问题所在: MERGE匹配整个模式,而我只想匹配节点a的两个属性,而不是全部三个。

因此,从技术上讲,我想在

之间建立关系

a:item{type:'detergent', weight:'500g'}b:customer{id:'933B3'}

这意味着,所有带有 label = item type =去污剂重量= 500g 的节点都应与<无论洗涤剂的量如何,strong> id = 933B3 。

如果我在节点a的两个属性上使用MERGE,它将不会在现有项目节点(具有3个属性)和客户节点之间建立关系,而是会创建具有MERGE中指定属性的新节点。如上所述,如果发现关系已经存在,我还需要更新count属性。

如何匹配已存在节点的选定属性,以初始化属性值来创建已存在节点之间的关系,否则如何更新已存在关系的属性值?

1 个答案:

答案 0 :(得分:4)

使用MERGE时,不必指定节点的所有属性。 MERGE就像一个MATCH,如果找不到匹配项,则创建一个CREATE。肯定有:item节点具有这些属性,并且除了MERGE中指定的属性之外,是否还有其他属性也没关系。

这应该对您有用:

MERGE (a:item{type:'detergent', weight:'500g'})
MERGE (b:customer{id:'933B3'})
MERGE (a)-[r:REL]->(b) // replace with your actual relationship type
ON CREATE SET r.count = 1
ON MATCH SET r.count = r.count + 1