跳转至
开发版采用单机部署,无需产品 License 文件。需要多机部署或大规模性能测试? 了解企业版

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 variable_reference . property_name = value_expression , variable_reference . property_name = value_expression

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。

更新点的单个属性

  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。

关于使用表变量进行批量操作的更多信息,请参见定义表变量。