原子属性更新

APOC 库包含可用于对节点和关系属性进行线程安全更新的过程。

用于对节点和关系属性进行线程安全更新的过程

限定名称 类型

apoc.atomic.add(container ANY, propertyName STRING, value INTEGER | FLOAT, retryAttempts INTEGER) - 将给定的属性设置为其自身与给定的 INTEGERFLOAT 值之和。该过程随后将属性设置为返回的和。

过程

apoc.atomic.concat(container ANY, propertyName STRING, string STRING, retryAttempts INTEGER) - 将给定属性设置为其自身与该 STRING 值的连接结果。随后,该过程将属性设置为返回的 STRING

过程

apoc.atomic.insert(container ANY, propertyName STRING, position INTEGER, value ANY, retryAttempts INTEGER) - 将值插入到属性的 LIST<ANY> 值中的指定位置。随后,该过程将结果设置回属性。

过程

apoc.atomic.remove(container ANY, propertyName STRING, position INTEGER, retryAttempts INTEGER) - 从属性的 LIST<ANY> 值中移除指定位置的元素。随后,该过程将属性设置为结果 LIST<ANY> 值。

过程

apoc.atomic.subtract(container ANY, propertyName STRING, number INTEGER | FLOAT, retryAttempts INTEGER) - 将值属性设置为其自身减去给定的 INTEGERFLOAT 值。随后,该过程将属性设置为返回的差值。

过程

apoc.atomic.update(container ANY, propertyName STRING, operation STRING, retryAttempts INTEGER) - 使用 Cypher 操作更新属性的值。

过程

示例

以下示例将进一步解释这些过程。

以下代码创建了示例节点
CREATE (p:Person {name:'Tom',age: 40})
CREATE (p:Person {name:'Will',age: 35})
CREATE (p:Person {name:'David', children: ['Anne','Sam','Paul']})
CREATE (p:Person {name:'John', cars: ['Class A','X3','Focus']})
CREATE (p:Person {name:'Ryan', salary1:1800, salary2:1500})
以下代码为 Tomage 属性增加了 10
MATCH (n:Person {name:'Tom'})
CALL apoc.atomic.add(n,'age',10,5)
YIELD oldValue, newValue
RETURN n
表 1. 结果
n

{"name":"Tom","age":50}

以下代码从 Tomage 属性中减去了 10
MATCH (n:Person {name:'Tom'})
CALL apoc.atomic.subtract(n,'age',10,5)
YIELD oldValue, newValue
RETURN n
表 2. 结果
n

{"name":"Tom","age":40}

以下代码将 iam 连接到 Willname 属性中
MATCH (p:Person {name:'Will',age: 35})
CALL apoc.atomic.concat(p,"name",'iam',5)
YIELD newValue
RETURN p
表 3. 结果
p

{"name":"William","age":35}

以下代码将 Mary 添加到 children 列表的第 2 位
MATCH (p:Person {name:'David'})
CALL apoc.atomic.insert(p,'children',2,'Mary',5)
YIELD newValue
RETURN p
表 4. 结果
p

{"name":"David","children":["Anne","Sam","Mary","Paul"]}

以下代码从数组 cars 中删除了位于第 1 位(索引位置)的元素 X3
MATCH (p:Person {name:'John'})
CALL apoc.atomic.remove(p,'cars',1,5)
YIELD newValue
RETURN p
表 5. 结果
p

{"name":"John","cars":["Class A","Focus"]}

以下代码使用表达式的结果更新 salary1
MATCH (p:Person {name:'Ryan'})
CALL apoc.atomic.update(p,'salary1','n.salary1*3 + n.salary2',5)
YIELD newValue
RETURN p

operation 表达式(第 3 个参数)中,作为 container(第 1 个参数)传入的实体使用变量 n 表示。如果节点或关系被重命名(如上例所示),则仍需在表达式中将其引用为 n

表 6. 结果
p

{"name":"Ryan","salary1":6900,"salary2":1500}