一、什么是 SET
语句?
SET
语句是 Cypher 中用于更新节点或关系的属性、标签的语句。
SET
可以修改现有属性、添加新属性、删除属性或更新标签。SET
可与MATCH
、MERGE
结合使用,以更新数据。
二、SET
语法结构
SET variable.property = value
语法说明:
SET
:更新属性、标签的关键字。variable
:要更新的节点或关系的变量名。property
:属性名,可以是一个或多个。value
:要设置的属性值,可以是字符串、数字、布尔值、列表或NULL
。
三、SET
用于更新属性
3.1 更新单个属性
MATCH (n:Person {name: 'Alice'})
SET n.age = 30
RETURN n
- 匹配
name = 'Alice'
的Person
节点。 - 使用
SET
更新age
属性的值为30
。
3.2 更新多个属性
MATCH (n:Person {name: 'Alice'})
SET n.age = 30, n.city = 'New York'
RETURN n
SET
语句可以一次更新多个属性,age
和city
属性将被更新。
3.3 添加新属性
MATCH (n:Person {name: 'Alice'})
SET n.email = 'alice@example.com'
RETURN n
email
属性不存在时,SET
会自动添加新属性。
3.4 使用 SET
更新属性并保留原有属性
MATCH (n:Person {name: 'Alice'})
SET n += {age: 30, city: 'New York'}
RETURN n
+=
操作符会将新属性添加到节点中,并保留原有属性。
3.5 用 SET
替换所有属性
MATCH (n:Person {name: 'Alice'})
SET n = {name: 'Alice', age: 30, city: 'New York'}
RETURN n
- 使用
=
赋值时,会替换节点或关系的所有现有属性。 - 旧属性将被删除,只保留
name
、age
和city
。
3.6 将属性设置为 NULL
(删除属性)
MATCH (n:Person {name: 'Alice'})
SET n.age = NULL
RETURN n
- 将
age
属性设置为NULL
会删除该属性。
四、SET
用于更新标签
4.1 添加标签
MATCH (n:Person {name: 'Alice'})
SET n:Employee
RETURN n
SET n:Employee
为n
添加Employee
标签。- 节点
n
现在具有两个标签:Person
和Employee
。
4.2 添加多个标签
MATCH (n:Person {name: 'Alice'})
SET n:Employee:Manager
RETURN n
- 同时添加
Employee
和Manager
标签。
4.3 替换标签
MATCH (n:Person {name: 'Alice'})
REMOVE n:Person
SET n:Employee
RETURN n
REMOVE
语句删除Person
标签,SET
添加Employee
标签。
4.4 使用 SET
替换所有标签
MATCH (n:Person {name: 'Alice'})
SET n:Employee
RETURN n
- 如果节点
n
之前有Person
标签,将只保留Employee
标签。
五、SET
与 MERGE
结合使用
5.1 使用 ON CREATE SET
设置属性
MERGE (n:Person {name: 'Alice'})
ON CREATE SET n.age = 30, n.city = 'New York'
RETURN n
- 如果
Alice
不存在,则创建新节点,并设置age
和city
属性。 - 如果
Alice
已存在,不执行ON CREATE SET
逻辑。
5.2 使用 ON MATCH SET
更新属性
MERGE (n:Person {name: 'Alice'})
ON MATCH SET n.lastLogin = timestamp()
RETURN n
- 如果
Alice
已存在,则更新lastLogin
属性为当前时间戳。
5.3 同时使用 ON CREATE SET
和 ON MATCH SET
MERGE (n:Person {name: 'Alice'})
ON CREATE SET n.age = 30, n.city = 'New York'
ON MATCH SET n.lastLogin = timestamp()
RETURN n
ON CREATE SET
和ON MATCH SET
可以一起使用,以应对不同的情况。
六、SET
与 MATCH
结合使用
6.1 更新匹配到的节点属性
MATCH (n:Person {name: 'Alice'})
SET n.age = 35, n.city = 'Los Angeles'
RETURN n
MATCH
语句匹配Alice
节点,并使用SET
更新age
和city
属性。
6.2 更新匹配到的关系属性
MATCH (a:Person {name: 'Alice'})-[r:KNOWS]->(b:Person {name: 'Bob'})
SET r.since = 2020
RETURN a, b, r
- 匹配
Alice
和Bob
之间的KNOWS
关系,更新since
属性。
七、SET
与 WITH
结合使用
7.1 使用 WITH
进行数据预处理
MATCH (n:Person)
WITH n, n.age + 5 AS newAge
SET n.age = newAge
RETURN n
WITH
语句将age
加5
作为newAge
传递给SET
语句。
7.2 更新多个节点
MATCH (n:Person)
WITH n, size(n.name) AS nameLength
SET n.nameLength = nameLength
RETURN n
- 计算
name
的长度,并将其作为新属性nameLength
设置在Person
节点上。
八、删除属性或标签
8.1 删除单个属性
MATCH (n:Person {name: 'Alice'})
SET n.age = NULL
RETURN n
- 将
age
设置为NULL
会删除该属性。
8.2 删除多个属性
MATCH (n:Person {name: 'Alice'})
SET n += {age: NULL, city: NULL}
RETURN n
- 使用
+=
将age
和city
属性设置为NULL
,删除这些属性。
8.3 删除标签
MATCH (n:Person {name: 'Alice'})
REMOVE n:Employee
RETURN n
REMOVE
语句删除Employee
标签,不影响Person
标签。
8.4 删除多个标签
MATCH (n:Person {name: 'Alice'})
REMOVE n:Employee:Manager
RETURN n
- 删除
Employee
和Manager
标签。
九、使用 SET
批量更新数据
9.1 批量更新属性
UNWIND ['Alice', 'Bob', 'Charlie'] AS name
MATCH (n:Person {name: name})
SET n.status = 'active'
RETURN n
- 使用
UNWIND
批量更新多个Person
节点的status
属性。
9.2 使用 SET
批量设置关系属性
MATCH (a:Person)-[r:KNOWS]->(b:Person)
WHERE a.name IN ['Alice', 'Bob']
SET r.since = 2023
RETURN a, b, r
- 为
Alice
和Bob
的KNOWS
关系批量更新since
属性。
十、SET
的注意事项
10.1 SET
会覆盖现有属性
MATCH (n:Person {name: 'Alice'})
SET n = {name: 'Alice', city: 'Los Angeles'}
RETURN n
- 直接使用
SET
赋值时,会替换所有现有属性,未包含的属性将被删除。
10.2 使用 +=
可以保留原有属性
MATCH (n:Person {name: 'Alice'})
SET n += {city: 'Los Angeles'}
RETURN n
+=
操作符用于添加或更新属性,不会删除现有属性。
10.3 更新标签时要注意覆盖问题
MATCH (n:Person {name: 'Alice'})
SET n:Employee
RETURN n
- 直接
SET
标签时,不会删除原有标签。
十一、总结
SET
语句是 Cypher 中更新节点和关系属性、标签的关键语句。SET
可用于更新、添加或删除属性,并可修改节点或关系的标签。SET
支持多种写法,如SET n.property = value
、SET n = {}
和SET n += {}
等。SET
可与MATCH
、MERGE
、WITH
等语法结合使用,灵活实现批量更新或条件更新。
通过灵活运用 SET
,可以有效管理 Neo4j 图数据的属性、标签和关系属性,从而提升数据维护和分析的效率。