在单个查询中更新多个节点,每个节点具有不同的属性/值对

DRB*_*DRB 0 neo4j cypher

迈克尔·亨格在2013年初回答了类似的问题,但我无法将他对Neo4j/Cypher 3.x的回应翻译出来.

https://groups.google.com/forum/#!msg/neo4j/qZWhbMtMCTE/r3W7OZfCgAgJ

每个节点都具有UUID值的属性.在某些情况下,"second"属性是布尔值,在其他情况下是字符串.

我想更新其中一些节点,更改或添加属性到每个节点.

(n1 {uuid:"foo1", enabled: true})
(n2 {uuid:"foo2", example: "foo"})
(n3 {uuid:"foo3"})
Run Code Online (Sandbox Code Playgroud)

我当然可以为每个创建一个单独的MERGE和SET语句,但我希望有一个更优雅的解决方案:

MATCH (S {uuid:"foo0"})
MERGE (n2 {uuid:"foo2"})-[:BELONGS_TO]->(S)
    SET n2.example="bar"
MERGE (n3 {uuid:"foo3"})-[:BELONGS_TO]->(S)
    SET n3.enabled=true
Run Code Online (Sandbox Code Playgroud)

cyb*_*sam 5

以下简单的Cypher查询可用于为任意数量的uuid添加/更新任意属性集.它还将为uuid创建节点(如果尚不存在).

UNWIND {data} AS d
MERGE (x {uuid: d.uuid})
SET x += d.props;
Run Code Online (Sandbox Code Playgroud)

它希望{data} 参数是一个对象数组.以下数组包含与您的问题中相同的示例数据:

[
  {uuid: 'foo1', props:{enabled: true}},
  {uuid: 'foo2', props:{example: 'foo'}},
  {uuid: 'foo3', props:{}}
]
Run Code Online (Sandbox Code Playgroud)

在每个数据数组元素中,props对象可以包含任意数量的属性,并且它们将在具有给定的节点中相应地添加/更新uuid.