REMOVE
REMOVE 子句用于从节点和关系中删除属性,以及从节点中删除标签。若要删除节点和关系,请使用 DELETE 子句。
| 从节点删除标签是一个幂等操作:如果您尝试从一个原本就不包含该标签的节点中删除标签,则不会发生任何事情。查询统计信息会告诉您是否执行了实际操作。 |
示例图
以下图表用于下方的示例
要重新创建它,请在空的 Neo4j 数据库中运行以下查询
CREATE
(a:Swedish {name: 'Andy', age: 36, propTestValue1: 42}),
(t:Swedish {name: 'Timothy', age: 25, propTestValue2: 42}),
(p:German:Swedish {name: 'Peter', age: 34}),
(a)-[:KNOWS]->(t),
(a)-[:KNOWS]->(p)
删除属性
Neo4j 不允许在属性中存储 null。相反,如果不存在值,则该属性直接不存在。因此,REMOVE 用于从节点或关系中删除属性值。
查询
MATCH (a {name: 'Andy'})
REMOVE a.age
RETURN a.name, a.age
返回该节点,且节点上不再存在 age 属性。
| a.name | a.age |
|---|---|
|
|
行:1 |
|
删除所有属性
REMOVE 不能用于从节点或关系中删除所有现有属性。相反,使用带有 = 和空映射(作为右操作数)的 SET 可以清除节点或关系的所有属性。
动态删除属性
即使属性键名不是静态已知的,也可以使用 REMOVE 删除节点或关系上的属性。这使得查询更加灵活,并降低了 Cypher® 注入的风险。(有关 Cypher 注入的更多信息,请参阅 Neo4j 知识库 → 防止 Cypher 注入)。
REMOVE n[key]
动态计算的键必须求值为 STRING 值。此查询创建了节点上每个属性的副本
查询
MATCH (n)
WITH n, [k IN keys(n) WHERE k CONTAINS "Test" | k] as propertyKeys (1)
FOREACH (i IN propertyKeys | REMOVE n[i]) (2)
RETURN n.name, keys(n);
| 1 | keys() 函数检索匹配节点的所有属性键,列表推导式 (list comprehension) 对这些键进行过滤,仅包含那些包含子字符串 "Test" 的键,并将结果列表分配给变量 propertyKeys。 |
| 2 | FOREACH 子句遍历 propertyKeys 列表中的每个键,并使用 REMOVE 子句删除相应的属性。 |
所有包含单词 "Test" 的属性均被删除
| n.name | keys(n) |
|---|---|
|
|
|
|
|
|
行:3 |
|
从节点中删除标签
要删除标签,请使用 REMOVE。
查询
MATCH (n {name: 'Peter'})
REMOVE n:German
RETURN n.name, labels(n)
| n.name | labels(n) |
|---|---|
|
|
行:1 |
|
动态删除节点标签
即使标签不是静态已知的,也可以使用 REMOVE 删除节点上的标签。
MATCH (n)
REMOVE n:$(expr)
表达式必须求值为 STRING NOT NULL | LIST<STRING NOT NULL> NOT NULL 值。
查询
MATCH (n {name: 'Peter'})
UNWIND labels(n) AS label (1)
REMOVE n:$(label)
RETURN n.name, labels(n)
| n.name | labels(n) |
|---|---|
|
|
行:1 |
|