Source: https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/ddl/graph-type/alter-graph-type/ Documentation version: v5.3.2 # ALTER GRAPH TYPE `ALTER GRAPH TYPE`语句用于修改当前会话中的 Schema 或指定 Schema 中的图类型,包括图类型中定义的点类型和边类型。 下表列出了使用`ALTER GRAPH TYPE`语句可对点类型和边类型执行的操作。 点类型 | 操作 | 描述 | 添加点类型 | 向图类型添加新的点类型。 | 删除点类型 | 从图类型中删除现有的点类型。 | 重命名点类型 | 更改现有点类型的名称。 | 更改标签 | 为点类型添加或删除标签。 | - 添加标签 | 为点类型添加新的标签。 | - 删除标签 | 为点类型删除标签。 | 更改属性 | 为点类型添加、删除、重命名或修改属性。 | - 添加属性 | 为点类型添加新的属性。 | - 删除属性 | 为点类型删除属性。 | - 重命名属性 | 更改现有属性的名称。 | - 修改属性 | 更改现有属性的值类型、能否为 NULL 或默认值。 边类型 | 操作 | 描述 | 添加边类型 | 向图类型添加新的边类型。 | 删除边类型 | 从图类型中删除现有的边类型。 | 重命名边类型 | 更改现有边类型的名称。 | 更改标签 | 为边类型添加或删除标签。 | - 添加标签 | 为边类型添加新的标签。 | - 删除标签 | 为边类型删除标签。 | 更改属性 | 为边类型添加、删除、重命名或修改属性。 | - 添加属性 | 为边类型添加新的属性。 | - 删除属性 | 为边类型删除属性。 | - 重命名属性 | 更改现有属性的名称。 | - 修改属性 | 更改现有属性的值类型、能否为 NULL 或默认值。 Note - 图类型一旦被修改,基于该图类型创建的所有图中的点和边也会相应被修改。如果删除了某个点或边类型,基于该点或边类型创建的所有点或边不会立即从 Storage 服务中被物理删除,即不会立即释放磁盘空间。而是会在后续的 [RocksDB Compaction(数据压缩)](https://github.com/facebook/rocksdb/wiki/Compaction)过程中被物理删除。 - 如果某个索引是基于点类型或边类型的属性创建的,当该属性、点类型或边类型被删除时,此索引会被自动删除。 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 TYPE](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/ddl/graph-type/create/)。 - 若要修改图类型,必须是图类型的所有者,或具备对图类型执行`ALTER`操作的权限,或具备在对应 Schema 执行`ALTER ANY GRAPH TYPE`操作的权限。更多信息,请参见[角色与权限](https://dev-docs.yueshu.com.cn/v5.3.2/server-admin/authorization/)。 ## 限制条件 - 主键 - 不能重新定义现有点类型的主键,即不能增加、删除或替换构成主键的属性。 - 不能使用`MODIFY PROPERTIES`修改主键属性的值类型、是否可为 NULL 或默认值。 - 添加新的点类型时,必须为该点类型指定主键。 - 多边键 - 不能重新定义现有边类型的多边键,即不能增加、删除或替换构成多边键的属性。 - 不能使用`MODIFY PROPERTIES`修改多边键属性的值类型、是否可为 NULL 或默认值。 - 添加新的边类型时,可以为该边类型指定多边键。 - 点类型和边类型 - 在同一条`ALTER GRAPH TYPE`语句中,每个点类型或边类型只能更改一次。例如,如果将点类型从 A 重命名为 B,则无法在同一语句中删除点类型 B 或添加一个名为 A 的新点类型。 - 标签 - 在同一条`ALTER GRAPH TYPE`语句中,每个点类型或边类型的每个标签只能更改一次。例如,无法在同一语句中添加标签 A 和删除标签 A。 - 属性 - 在同一条`ALTER GRAPH TYPE`语句中,每个点类型或边类型的每个属性只能更改一次。例如,如果将属性从 A 重命名为 B,则无法在同一语句中删除属性 B 或添加一个名为 A 的新属性。 - 在修改属性时: - 如果属性被基于该图类型创建的任意图中的常规索引、全文索引或向量索引引用,则无法使用`MODIFY PROPERTIES`修改该属性。修改前,需要删除所有引用该属性的索引。 - 不支持将属性从可为 NULL 改为不可为 NULL。 - 必须同时更改属性的值类型、可否为 NULL 状态和默认值。 - 仅当支持隐式类型转换时才允许修改。例如,支持将值类型从 INT32 更改为 INT64。更多信息,请参见[数据类型转换](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/fe/expressions/cast/)。 ## 语法 语法图源码 alter_graph_type_statement alter_graph_type_specification node_type_filler primary_key_list edge_type_filler multiedge_key_list alter_element_type_op ```` alter_graph_type_statement ::= 'ALTER' 'PROPERTY'? 'GRAPH TYPE' (schema_reference '/')? graph_type_name '{' alter_graph_type_specification ( ',' alter_graph_type_specification )* '}' alter_graph_type_specification ::= ADD ('NODE' | 'VERTEX') 'TYPE'? ('IF NOT EXISTS')? node_type_name ( node_type_filler ) | ADD ('EDGE' | 'RELATIONSHIP') 'TYPE'? ('IF NOT EXISTS')? edge_type_name ('(' source_node_type_name ')' '-[' edge_type_filler ']->' '(' destination_node_type_name ')' | '(' destination_node_type_name ')' '<-[' edge_type_filler ']-' '(' source_node_type_name ')' | '(' source_node_type_name ')' '~[' edge_type_filler ']~' '(' destination_node_type_name ')') | DROP ( ('NODE' | 'VERTEX') | ('EDGE' | 'RELATIONSHIP') ) 'TYPE'? ('IF EXISTS')? element_type_name | RENAME ( ('NODE' | 'VERTEX') | ('EDGE' | 'RELATIONSHIP') ) 'TYPE'? old_element_type_name 'TO' new_element_type_name | ALTER ( ('NODE' | 'VERTEX') | ('EDGE' | 'RELATIONSHIP') ) 'TYPE'? element_type_name alter_element_type_op+ node_type_filler ::= ('LABEL' label_name | ( 'LABELS' | ( 'IS' | ':' ) ) label_name ('&' label_name)*)? ( ('{' (property_name ('::' | 'TYPED')? property_value_type ('NULL' | 'NOT NULL' | 'DEFAULT' value_expression | 'PRIMARY KEY' )*) (',' (property_name ('::' | 'TYPED')? property_value_type ('NULL' | 'NOT NULL' | 'DEFAULT' value_expression| 'PRIMARY KEY' )*))* (',' primary_key_list)? '}') ) primary_key_list ::= 'PRIMARY KEY' '(' property_name (',' property_name)* ')' edge_type_filler ::= ( 'LABEL' label_name | ( 'LABELS' | ( 'IS' | ':' ) ) label_name ('&' label_name)*)? ('{' (property_name ('::' | 'TYPED')? property_value_type ('NULL' | 'NOT NULL' | 'DEFAULT' value_expression | 'MULTIEDGE KEY' )*) (',' (property_name ('::' | 'TYPED')? property_value_type ('NULL' | 'NOT NULL' | 'DEFAULT' value_expression | 'MULTIEDGE KEY')*))* (',' multiedge_key_list)? '}' | '{' ('MULTIEDGE KEY ( )')? '}') multiedge_key_list ::= 'MULTIEDGE KEY' '(' (property_name ( ',' property_name)* )? ')' alter_element_type_op ::= 'ADD' 'LABELS' ('IF NOT EXISTS')? label_name ('&' label_name)* | 'DROP' 'LABELS' ('IF EXISTS')? label_name ('&' label_name)* | 'ADD' 'PROPERTIES' ('IF NOT EXISTS')? '{' (property_name ('::' | 'TYPED')? property_value_type ('NULL' | 'NOT NULL' | 'DEFAULT' value_expression )*) (',' (property_name ('::' | 'TYPED')? property_value_type ('NULL' | 'NOT NULL' | 'DEFAULT' value_expression)*))* '}' | 'DROP' 'PROPERTIES' ('IF EXISTS')? '{' property_name (',' property_name)* '}' | 'RENAME' 'PROPERTIES' '{' (old_property_name 'TO' new_property_name) (',' (old_property_name 'TO' new_property_name))* '}' | 'MODIFY' 'PROPERTIES' '{' (property_name ('::' | 'TYPED')? property_value_type ('NULL' | 'NOT NULL' | 'DEFAULT' value_expression )*) (',' (property_name ('::' | 'TYPED')? property_value_type ('NULL' | 'NOT NULL' | 'DEFAULT' value_expression)*))* '}' ```` ## 参数 ### `IF NOT EXISTS` 该子句会检查是否已经存在相同名称的元素(元素可以是点类型、边类型、标签或属性)。如果已经存在,则不会添加元素,也不会抛出异常。 若不指定该子句,且已存在相同名称的元素,则会抛出异常。 ### `schema_reference` 所引用的 Schema 路径。此处即待修改的图类型所在的 Schema 路径。 绝对路径或相对路径均可在语句中使用。若想修改不在当前会话中的 Schema 中的图类型,则需指定对应 Schema 路径。关于设置和查看 Schema 的更多信息,请参见 [SESSION SET](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/sessions/set/) 和 [SHOW CURRENT_SCHEMA](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/data-admin/show/show-current-schema/)。 ### `graph_type_name` 待修改的图类型的名称。 ### `node_type_name` 点类型的名称。同一个图类型中所有点类型和边类型的名称必须唯一。 ### `label_name` 点类型或边类型的标签名称。同一个点类型或边类型中标签的名称必须唯一。 ### `property_name` 点类型或边类型的属性名称。同一个点类型或边类型中属性的名称必须唯一。若在一个图类型中,多个属性同名,则这些属性必须具有相同的值类型。 ### `property_value_type` 点类型或边类型的属性的值类型。更多信息,请参见 [CREATE GRAPH TYPE](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/ddl/graph-type/create/#property_value_type)。 ### `primary_key_list` 构成点类型的主键的属性列表。更多信息,请参见 [CREATE GRAPH TYPE](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/ddl/graph-type/create/#primary_key_list)。 ### `multiedge_key_list` 构成边类型的多边键的属性列表。更多信息,请参见 [CREATE GRAPH TYPE](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/ddl/graph-type/create/#multiedge_key_list)。 ### `edge_type_name` 边类型的名称。同一个图类型中所有点类型和边类型的名称必须唯一。 ### `source_node_type_name` 边类型的起始点类型的名称。起始点类型必须是图类型中定义的点类型之一。 ### `destination_node_type_name` 边类型的目标点类型的名称。目标点类型必须是图类型中定义的点类型之一。 ### `IF EXISTS` 该子句会检查待删除的元素(元素可以是点类型、边类型、标签或属性)是否存在。如果不存在,则不会删除元素,也不会抛出异常。 若不指定该子句,且待删除的元素不存在,则会抛出异常。 ### `element_type_name` 点类型或边类型的名称。 ### `old_element_type_name` 点类型或边类型的当前名称。 ### `new_element_type_name` 点类型或边类型的新名称。 ### `old_property_name` 属性的当前名称。 ### `new_property_name` 属性的新名称。 ## 示例 以下示例基于[示例数据集](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/overview/example-dataset/)。 ### 添加点类型和边类型至当前 Schema 中的图类型 ```` ''' ALTER GRAPH TYPE movie_type { ADD NODE TYPE Company (LABEL Company {id INT PRIMARY KEY, name STRING}), ADD EDGE TYPE Serve (Director)-[LABEL Serve{start_year INT, end_year INT}]->(Company) } ''' ```` 上述示例为当前 Schema 中图类型`movie_type`添加了一个点类型`Company`和一个边类型`Serve`。 ### 添加点类型和边类型至指定 Schema 中的图类型 ```` ''' // 创建 Schema CREATE SCHEMA IF NOT EXISTS /my_schema ''' ''' // 为当前会话设置 Schema SESSION SET SCHEMA /my_schema ''' ''' // 添加点类型和边类型 ALTER GRAPH TYPE /default_schema/movie_type { ADD NODE TYPE Company (LABEL Company {id INT PRIMARY KEY, name STRING}), ADD EDGE TYPE Serve (Director)-[LABEL Serve{start_year INT, end_year INT}]->(Company) } ''' ```` 上述示例在当前会话中的 Schema 为`/my_schema`的情况下,在`/default_schema`中为`movie_type`的图类型添加了一个点类型`Company`和一个边类型`Serve`。 ### 删除点类型和边类型 ```` ''' ALTER GRAPH TYPE movie_type { DROP NODE TYPE Company, DROP EDGE TYPE Serve } ''' ```` 上述示例删除点类型`Company`和边类型`Serve`。 ### 重命名点类型和边类型 ```` ''' ALTER GRAPH TYPE movie_type { RENAME NODE TYPE Actor TO Actor_renamed, RENAME EDGE TYPE Act TO Act_renamed } ''' ```` 上述示例将点类型`Actor`重命名为`Actor_renamed`,将边类型`Act`重命名为`Act_renamed`。 ### 为点类型和边类型添加标签 ```` ''' ALTER GRAPH TYPE movie_type { ALTER NODE TYPE `User` ADD LABELS Male&Above30, ALTER EDGE TYPE Watch ADD LABELS InCinema&AtHome } ''' ```` 上述示例为点类型`User`添加标签`Male`和`Above30`,为边类型`Watch`添加标签`InCinema`和`AtHome`。 ### 为点类型和边类型删除标签 ```` ''' ALTER GRAPH TYPE movie_type { ALTER NODE TYPE `User` DROP LABELS Male&Above30, ALTER EDGE TYPE Watch DROP LABELS InCinema&AtHome } ''' ```` 上述示例从点类型`User`中删除标签`Male`和`Above30`,从边类型`Watch`中删除标签`InCinema`和`AtHome`。 ### 为点类型和边类型添加属性 ```` ''' ALTER GRAPH TYPE movie_type { ALTER NODE TYPE `User` ADD PROPERTIES {email STRING, age INT64}, ALTER EDGE TYPE Watch ADD PROPERTIES {`count` INT64, platform STRING} } ''' ```` 上述示例为点类型`User`添加属性`email`和`age`,为边类型`Watch`添加属性`count`和`platform`。 ### 为点类型和边类型删除属性 ```` ''' ALTER GRAPH TYPE movie_type { ALTER NODE TYPE `User` DROP PROPERTIES {email, age}, ALTER EDGE TYPE Watch DROP PROPERTIES {`count`, platform} } ''' ```` 上述示例从点类型`User`中删除属性`email`和`age`,从边类型`Watch`中删除属性`count`和`platform`。 ### 重命名点类型和边类型的属性 ```` ''' ALTER GRAPH TYPE movie_type { ALTER NODE TYPE Director RENAME PROPERTIES {birthDate TO birth, name TO lastName }, ALTER EDGE TYPE Watch RENAME PROPERTIES {`rate` TO rating} } ''' ```` 上述示例将点类型`Director`的属性`birthDate`和`name`分别重命名为`birth`和`lastName`,将边类型`Watch`的属性`rate`重命名为`rating`。 ### 修改点类型和边类型的属性 ```` ''' ALTER GRAPH TYPE movie_type { ALTER NODE TYPE Director MODIFY PROPERTIES {name STRING DEFAULT "Alex", birthDate DATE DEFAULT date("2016-09-20") }, ALTER EDGE TYPE Watch MODIFY PROPERTIES {rate FLOAT DEFAULT 4.5} } ''' ```` 上述示例将点类型`Director`的属性`name`和`birthDate`的默认值分别修改为`Alex`和`2016-09-20`,将边类型`Watch`的属性`rate`的默认值修改为`4.5`。