原子属性更新

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 表达式(第三个参数)中,作为 container(第一个参数)传入的实体使用变量 n 引用。如果节点或关系被重命名(如上例所示),仍然需要将其在表达式中引用为 n

表 6. 结果
p

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