SET¶
SET语句用于修改图或临时图中元素的属性。
在一条SET语句中,如果同一个属性被多次赋值,系统将随机选择一个值来赋给该属性。
Note
SET还可以用于执行赋值、聚合和函数调用操作。更多信息,请参见 SET。
Note
对非默认 Schema 或其中的对象执行操作时,用户既要通过隐式访问规则或显式USAGE授权获得该 Schema 的访问权,也要具备目标操作所需的权限。Schema 访问校验和目标操作所需的权限校验相互独立,满足其中一项不能替代另一项。Schema 访问控制不适用于临时图、内置 Procedure 和内置 Function。更多信息,请参见 Schema 访问控制。
前提条件¶
- 已创建图或临时图。更多信息,请参见 CREATE GRAPH 和 CREATE TEMPORARY GRAPH。
- 若要修改图中元素的属性,须具备在当前 Schema 执行
UPDATE ANY GRAPH操作的权限,或具备在当前图中执行UPDATE操作的权限。更多信息,请参见角色与权限。 - 若要修改临时图中元素的属性,必须是具备角色
ADMIN的用户或临时图的所有者。
限制条件¶
- 更新操作仅适用于可以通过唯一的点类型或边类型检索的点或边。如果检索到的点或边的点类型或边类型不唯一,则无法执行更新操作。
- 不支持修改被指定为主键或多边键的属性的值。
语法¶
- set_statement
set_statement ::=
'SET' variable_reference '.' property_name '=' value_expression ( ',' variable_reference '.' property_name '=' value_expression )*
参数¶
variable_reference¶
指定要修改其属性的图元素的变量名称,该名称是一个常规标识符。更多信息,请参见标识符命名规则。
property_name¶
待被更新的属性的名称,该名称是一个标识符。更多信息,请参见标识符命名规则。
value_expression¶
一个值表达式,该表达式的值将被用作新值。更多信息,请参见值表达式。
示例¶
以下示例基于示例数据集中的创建的图movie和图类型movie_type,展示如何使用SET语句。
在执行以下示例语句前,假设您已执行SESSION SET GRAPH movie语句将图movie设置为当前工作图;否则,需要在语句的开头指定图名称,如USE movie。更多信息,请参见 USE。
更新点的单个属性¶
-
查询名为
Mark Hamill的演员。MATCH (v@Actor{name:"Mark Hamill"}) RETURN v返回:
+---------------------------------------------------------------------------------+ | v | +---------------------------------------------------------------------------------+ | (288449535447924737@Actor:Person{birthDate:1951-09-25,id:2,name:"Mark Hamill"}) | +---------------------------------------------------------------------------------+ -
将名字
Mark Hamill更新为Mark Hamill2。MATCH (v@Actor{name:"Mark Hamill"}) SET v.name="Mark Hamill2" -
查询更新后的演员。
MATCH (v@Actor{name:"Mark Hamill2"}) RETURN v返回:
+----------------------------------------------------------------------------------+ | v | +----------------------------------------------------------------------------------+ | (288449535447924737@Actor:Person{birthDate:1951-09-25,id:2,name:"Mark Hamill2"}) | +----------------------------------------------------------------------------------+
更新点的多个属性¶
查询名为Mark Hamill的演员并更新其名字和出生日期。
MATCH (v@Actor{name:"Mark Hamill"}) SET v.name="Mark Hamill2", v.birthDate=date("1951-09-26")
更新边的单个属性¶
-
查询 ID 为
414的用户与电影Star Trek: The Motion Picture之间的边。MATCH(v1@`User`{id:414})-[e@Watch]->(v2@Movie{name:"Star Trek: The Motion Picture"}) RETURN e返回:
+----------------------------------------------------------------------+ | e | +----------------------------------------------------------------------+ | (289068899796779009)-[0@Watch:Watch{rate:3.0}]->(289099230855823361) | +----------------------------------------------------------------------+ -
将边的属性
rate的值更新为4.0。MATCH(v1@`User`{id:414})-[e@Watch]->(v2@Movie{name:"Star Trek: The Motion Picture"}) SET e.rate=4.0 -
检查更新后的边。
MATCH(v1@`User`{id:414})-[e@Watch]->(v2@Movie{name:"Star Trek: The Motion Picture"}) RETURN e返回:
+----------------------------------------------------------------------+ | e | +----------------------------------------------------------------------+ | (289068899796779009)-[0@Watch:Watch{rate:4.0}]->(289099230855823361) | +----------------------------------------------------------------------+
使用表变量批量更新点¶
'''
TABLE t { id, new_name } =
( 10001, 'Alice_renamed' ),
( 10002, 'Bob_renamed' ),
( 10003, 'Charlie_renamed' )
USE movie
FOR re IN t
MATCH (a@Actor) WHERE a.id = re.id
SET a.name = re.new_name
'''
上述语句定义了表变量t,并基于表变量的字段id匹配点类型为Actor的点。然后,根据表变量的字段new_name更新匹配到的点的属性name。
关于使用表变量进行批量操作的更多信息,请参见定义表变量。