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

问题描述 投票:1回答:1

我有一个具有三个属性的节点,比如创建的东西

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

为此,我可以使用MERGE,以及ON CREATEON MATCH。但是,问题在于:MERGE匹配整个模式,而我只想匹配节点a的两个属性而不是全部三个。

因此,从技术上讲我想创建一种关系

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

这意味着,无论洗涤剂的数量如何,所有标签= item,type = detergent和weight = 500g的节点都应与客户id = 933B3建立关系。

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

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

neo4j merge cypher
1个回答
4
投票

使用MERGE时,不必指定节点的所有属性。 MERGE就像一个MATCH,如果找不到匹配,则创建一个CREATE。肯定有:具有这些属性的项目节点,除了您在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
© www.soinside.com 2019 - 2024. All rights reserved.