Source: https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/dml/set/ Documentation version: v5.3.2 # SET `SET`语句用于修改图或临时图中元素的属性。 在一条`SET`语句中,如果同一个属性被多次赋值,系统将随机选择一个值来赋给该属性。 Note `SET`还可以用于执行赋值、聚合和函数调用操作。更多信息,请参见 [SET](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/set/)。 Note 对非默认 Schema 或其中的对象执行操作时,用户既要通过隐式访问规则或显式`USAGE`授权获得该 Schema 的访问权,也要具备目标操作所需的权限。Schema 访问校验和目标操作所需的权限校验相互独立,满足其中一项不能替代另一项。Schema 访问控制不适用于临时图、内置 Procedure 和内置 Function。更多信息,请参见 [Schema 访问控制](https://dev-docs.yueshu.com.cn/v5.3.2/server-admin/authorization/schema-access-control/)。 ## 前提条件 - 已创建图或临时图。更多信息,请参见 [CREATE GRAPH](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/ddl/graph/create/) 和 [CREATE TEMPORARY GRAPH](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/ddl/graph-projection/create/)。 - 若要修改图中元素的属性,须具备在当前 Schema 执行`UPDATE ANY GRAPH`操作的权限,或具备在当前图中执行`UPDATE`操作的权限。更多信息,请参见[角色与权限](https://dev-docs.yueshu.com.cn/v5.3.2/server-admin/authorization/)。 - 若要修改临时图中元素的属性,必须是具备角色`ADMIN`的用户或临时图的所有者。 ## 限制条件 - 更新操作仅适用于可以通过唯一的点类型或边类型检索的点或边。如果检索到的点或边的点类型或边类型不唯一,则无法执行更新操作。 - 不支持修改被指定为主键或多边键的属性的值。 ## 语法 语法图源码 set_statement ```` set_statement ::= 'SET' variable_reference '.' property_name '=' value_expression ( ',' variable_reference '.' property_name '=' value_expression )* ```` ## 参数 ### `variable_reference` 指定要修改其属性的图元素的变量名称,该名称是一个常规标识符。更多信息,请参见[标识符命名规则](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/overview/keywords-identifiers/)。 ### `property_name` 待被更新的属性的名称,该名称是一个标识符。更多信息,请参见[标识符命名规则](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/overview/keywords-identifiers/)。 ### `value_expression` 一个值表达式,该表达式的值将被用作新值。更多信息,请参见[值表达式](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/#_6)。 ## 示例 以下示例基于[示例数据集](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/overview/example-dataset/)中的创建的图`movie`和图类型`movie_type`,展示如何使用`SET`语句。 在执行以下示例语句前,假设您已执行`SESSION SET GRAPH movie`语句将图`movie`设置为当前工作图;否则,需要在语句的开头指定图名称,如`USE movie`。更多信息,请参见 [USE](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/dql/clauses/use-graph/)。 ### 更新点的单个属性 1. 查询名为`Mark Hamill`的演员。 ```` MATCH (v@Actor{name:"Mark Hamill"}) RETURN v ```` 返回: ```` +---------------------------------------------------------------------------------+ | v | +---------------------------------------------------------------------------------+ | (288449535447924737@Actor:Person{birthDate:1951-09-25,id:2,name:"Mark Hamill"}) | +---------------------------------------------------------------------------------+ ```` 2. 将名字`Mark Hamill`更新为`Mark Hamill2`。 ```` MATCH (v@Actor{name:"Mark Hamill"}) SET v.name="Mark Hamill2" ```` 3. 查询更新后的演员。 ```` 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") ```` ### 更新边的单个属性 1. 查询 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) | +----------------------------------------------------------------------+ ```` 2. 将边的属性`rate`的值更新为`4.0`。 ```` MATCH(v1@`User`{id:414})-[e@Watch]->(v2@Movie{name:"Star Trek: The Motion Picture"}) SET e.rate=4.0 ```` 3. 检查更新后的边。 ```` 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`。 关于使用表变量进行批量操作的更多信息,请参见[定义表变量](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/variable-definition/table-variable/)。