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

har*_*han 1 merge neo4j cypher

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

create (a:item{type:'detergent', weight:'500g', 'quantity':322}) 
Run Code Online (Sandbox Code Playgroud)

另一个节点像

create (b:customer{id:'933B3'})
Run Code Online (Sandbox Code Playgroud)

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'}

这意味着,无论洗涤剂的数量如何,所有label = itemtype = 洗涤剂重量 = 500g的节点都应该与id = 933B3 的客户有关系。

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

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

Inv*_*con 6

使用 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
Run Code Online (Sandbox Code Playgroud)