REMOVE

REMOVE 子句用于从节点和关系中移除属性,并从节点中移除标签。

要删除节点和关系,请参阅 DELETE

从节点中移除标签是幂等操作:如果您尝试从不具有该标签的节点中移除标签,则不会发生任何事情。查询统计信息将告诉您是否需要执行任何操作。

示例图

以下图用于下面的示例

graph remove clause

要重新创建它,请对空的 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

表 1. 结果
a.name a.age

"Andy"

<null>

行数:1
已设置属性: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() 函数检索匹配节点的所有属性键,而列表推导式则过滤这些键,仅包含那些包含子字符串“Test”的键,并将结果列表分配给变量 propertyKeys
2 FOREACH 子句遍历 propertyKeys 列表中的每个键,并使用 REMOVE 子句移除相应的属性。

所有包含“Test”字样的属性都将被移除

表 2. 结果
n.name keys(n)

"Andy"

["name", "age"]

"Timothy"

["name", "age"]

"Peter"

["name", "age"]

行数:3
已设置属性:2

从节点中移除标签

要移除标签,请使用 REMOVE

查询
MATCH (n {name: 'Peter'})
REMOVE n:German
RETURN n.name, labels(n)
表 3. 结果
n.name labels(n)

"Peter"

["Swedish"]

行数:1
已移除标签: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)
1 此处使用 UNWINDlabels() 函数的标签列表转换为单独的行,从而允许对每个标签单独执行后续操作。
表 4. 结果
n.name labels(n)

"Peter"

[]

行数:1
已移除标签:2

从节点中移除多个标签

要移除多个标签,请使用 REMOVE

查询
MATCH (n {name: 'Peter'})
REMOVE n:German:Swedish
RETURN n.name, labels(n)
表 5. 结果
n.name labels(n)

"Peter"

[]

行数:1
已移除标签:2

从节点中动态移除多个标签

可以使用 LIST<STRING> 动态移除多个标签,和/或通过用 : 分隔它们来链式移除。

查询
MATCH (n {name: 'Peter'})
REMOVE n:$(labels(n))
RETURN n.name, labels(n)
表 6. 结果
n.name labels(n)

"Peter"

[]

行数:1
已移除标签:2