SET
SET
子句用于更新节点上的标签和节点和关系上的属性。
SET
子句可与映射一起使用(以文字或参数形式提供)来设置属性。
在节点上设置标签是一个幂等操作,如果尝试在已具有该标签的节点上设置标签,则不会发生任何操作。查询统计信息将说明是否实际进行了任何更新。 |
示例图
以下图用于下面的示例
要重新创建它,请在空的 Neo4j 数据库上运行以下查询
CREATE
(a:Swedish {name: 'Andy', age: 36, hungry: true}),
(b {name: 'Stefan'}),
(c {name: 'Peter', age: 34}),
(d {name: 'George'}),
(a)-[:KNOWS]->(c),
(b)-[:KNOWS]->(a),
(d)-[:KNOWS]->(c)
设置属性
更新节点属性
MATCH (n {name: 'Andy'})
SET n.surname = 'Taylor'
RETURN n.name, n.surname
新更改的节点由查询返回。
n.name | n.surname |
---|---|
|
|
行数:1 |
更新关系属性
MATCH (n:Swedish {name: 'Andy'})-[r:KNOWS]->(m)
SET r.since = 1999
RETURN r, m.name AS friend
r | friend |
---|---|
|
|
行数:1 |
可以使用更复杂的表达式在节点或关系上设置属性。例如,与直接指定节点相比,以下查询显示了如何为由表达式选择的节点设置属性
MATCH (n {name: 'Andy'})
SET (CASE WHEN n.age = 36 THEN n END).worksIn = 'Malmo'
RETURN n.name, n.worksIn
n.name | n.worksIn |
---|---|
|
|
行数:1 |
如果节点表达式计算结果为 null
,则不会采取任何操作,如以下示例所示
MATCH (n {name: 'Andy'})
SET (CASE WHEN n.age = 55 THEN n END).worksIn = 'Malmo'
RETURN n.name, n.worksIn
由于没有节点与 CASE
表达式匹配,因此表达式返回 null
。因此,不会进行任何更新,因此不会设置 worksIn
属性。
n.name | n.worksIn |
---|---|
|
|
行数:1 |
更新属性
SET
可用于更新节点或关系上的属性。此查询强制更改 age
属性的类型
MATCH (n {name: 'Andy'})
SET n.age = toString(n.age)
RETURN n.name, n.age
age
属性已转换为 STRING
'36'
。
n.name | n.age |
---|---|
|
|
行数:1 |
动态设置或更新属性
SET
可用于设置或更新节点或关系上的属性,即使属性键名称不是静态已知的。
SET n[key] = expression
动态计算的键必须计算结果为 STRING
值。此查询创建节点上每个属性的副本
MATCH (n)
FOREACH (k IN keys(n) | SET n[k + "Copy"] = n[k]) (1)
RETURN n.name, keys(n);
现在,节点具有所有属性的副本。
n.name | keys(n) |
---|---|
|
|
|
|
|
|
|
|
行数:4 |
删除属性
虽然 REMOVE
通常用于删除属性,但有时使用 SET
命令来执行此操作会很方便。一个例子是如果属性由参数提供。
MATCH (n {name: 'Andy'})
SET n.name = null
RETURN n.name, n.age
现在 name
属性已丢失。
n.name | n.age |
---|---|
|
|
行数:1 |
在节点和关系之间复制属性
SET
可用于使用 properties()
函数将所有属性从一个节点或关系复制到另一个节点或关系。这将删除复制到的节点或关系上的所有其他属性。
MATCH
(at {name: 'Andy'}),
(pn {name: 'Peter'})
SET at = properties(pn)
RETURN at.name, at.age, at.hungry, pn.name, pn.age
'Andy'
节点的所有属性已被 'Peter'
节点的属性替换。
at.name | at.age | at.hungry | pn.name | pn.age |
---|---|---|---|---|
|
|
|
|
|
行数:1 |
使用映射和 =
替换所有属性
属性替换运算符 =
可与 SET
一起使用,以将节点或关系上所有现有属性替换为映射提供的属性
MATCH (p {name: 'Peter'})
SET p = {name: 'Peter Smith', position: 'Entrepreneur'}
RETURN p.name, p.age, p.position
此查询将 name
属性从 Peter
更新为 Peter Smith
,删除了 age
属性,并将 position
属性添加到 'Peter'
节点。
p.name | p.age | p.position |
---|---|---|
|
|
|
行数:1 |
使用空映射和 =
删除所有属性
可以通过使用 SET
与 =
和空映射作为右操作数来从节点或关系中删除所有现有属性
MATCH (p {name: 'Peter'})
SET p = {}
RETURN p.name, p.age
此查询从 'Peter'
节点中删除了所有现有属性,即 name
和 age
。
p.name | p.age |
---|---|
|
|
行数:1 |
使用映射和 +=
变异特定属性
属性变异运算符 +=
可与 SET
一起使用,以细粒度方式从映射中变异属性
-
映射中不在节点或关系上的任何属性都将添加。
-
映射中不在节点或关系上的任何属性将保持原样。
-
如果地图和节点或关系中都存在属性,则节点或关系中的属性将被替换。但是,如果地图中的任何属性为
null
,则该属性将从节点或关系中删除。
MATCH (p {name: 'Peter'})
SET p += {age: 38, hungry: true, position: 'Entrepreneur'}
RETURN p.name, p.age, p.hungry, p.position
此查询保留了name
属性,将age
属性从34
更新为38
,并将hungry
和position
属性添加到'Peter'
节点。
p.name | p.age | p.hungry | p.position |
---|---|---|---|
|
|
|
|
行数:1 |
与属性替换运算符=
相反,将空地图作为+=
的右操作数不会从节点或关系中删除任何现有属性。根据上面详细说明的语义,使用+=
传入空地图将没有效果。
MATCH (p {name: 'Peter'})
SET p += {}
RETURN p.name, p.age
p.name | p.age |
---|---|
|
|
行数:1 |
使用一个SET
子句设置多个属性
通过逗号分隔属性,可以一次设置多个属性。
MATCH (n {name: 'Andy'})
SET n.position = 'Developer', n.surname = 'Taylor'
|
行数: 0 |
使用参数设置属性
使用参数设置属性的值。
{
"surname": "Taylor"
}
MATCH (n {name: 'Andy'})
SET n.surname = $surname
RETURN n.name, n.surname
已将surname
属性添加到'Andy'
节点。
n.name | n.surname |
---|---|
|
|
行数:1 |
使用参数设置所有属性
这将用参数提供的新的集合替换节点上的所有现有属性。
{
"props" : {
"name": "Andy",
"position": "Developer"
}
}
MATCH (n {name: 'Andy'})
SET n = $props
RETURN n.name, n.position, n.age, n.hungry
'Andy'
节点的所有属性都被props
参数中的属性替换了。
n.name | n.position | n.age | n.hungry |
---|---|---|---|
|
|
|
|
行数:1 |
在节点上设置标签
使用SET
在节点上设置标签。
MATCH (n {name: 'Stefan'})
SET n:German
RETURN n.name, labels(n) AS labels
查询返回新标记的节点。
n.name | labels |
---|---|
|
|
行数:1 |
动态设置标签
即使标签不是静态已知的,SET
也可以用来在节点上设置标签。
MATCH (n)
SET n:$(expr)
MATCH (n:Swedish)
SET n:$(n.name)
RETURN n.name, labels(n) AS labels
查询返回新标记的节点。
n.name | labels |
---|---|
|
|
行数:1 |
使用参数设置标签
使用参数设置标签的值。
{
"label": "Danish"
}
MATCH (n {name: 'Stefan'})
SET n:$($label)
RETURN labels(n) AS labels
已将Danish
标签添加到'Stefan'
节点。
labels |
---|
|
行数:1 |
在节点上设置多个标签
使用SET
在节点上设置多个标签,并使用:
分隔不同的标签。
MATCH (n {name: 'George'})
SET n:Swedish:Bossman
RETURN n.name, labels(n) AS labels
查询返回新标记的节点。
n.name | labels |
---|---|
|
|
行数:1 |
在节点上动态设置多个标签
可以使用LIST<STRING>
或通过:
将它们单独链接起来,以动态设置多个标签。
WITH COLLECT { UNWIND range(0,3) AS id RETURN "Label" + id } as labels (1)
MATCH (n {name: 'George'})
SET n:$(labels)
RETURN n.name, labels(n) AS labels
1 | 一个COLLECT 子查询聚合了UNWIND range(0,3) AS id RETURN "Label" + id 的结果,该结果生成了一个LIST<STRING> 字符串("Label0","Label1","Label2","Label3"),并将它分配给变量labels 。 |
查询返回新标记的节点。
n.name | labels |
---|---|
|
|
行数:1 |