ALTER GRAPH TYPE¶
ALTER GRAPH TYPE语句用于修改当前会话中的 Schema 或指定 Schema 中的图类型,包括图类型中定义的点类型和边类型。
下表列出了使用ALTER GRAPH TYPE语句可对点类型和边类型执行的操作。
点类型
| 操作 | 描述 |
|---|---|
| 添加点类型 | 向图类型添加新的点类型。 |
| 删除点类型 | 从图类型中删除现有的点类型。 |
| 重命名点类型 | 更改现有点类型的名称。 |
| 更改标签 | 为点类型添加或删除标签。 |
| - 添加标签 | 为点类型添加新的标签。 |
| - 删除标签 | 为点类型删除标签。 |
| 更改属性 | 为点类型添加、删除、重命名或修改属性。 |
| - 添加属性 | 为点类型添加新的属性。 |
| - 删除属性 | 为点类型删除属性。 |
| - 重命名属性 | 更改现有属性的名称。 |
| - 修改属性 | 更改现有属性的值类型、能否为 NULL 或默认值。 |
边类型
| 操作 | 描述 |
|---|---|
| 添加边类型 | 向图类型添加新的边类型。 |
| 删除边类型 | 从图类型中删除现有的边类型。 |
| 重命名边类型 | 更改现有边类型的名称。 |
| 更改标签 | 为边类型添加或删除标签。 |
| - 添加标签 | 为边类型添加新的标签。 |
| - 删除标签 | 为边类型删除标签。 |
| 更改属性 | 为边类型添加、删除、重命名或修改属性。 |
| - 添加属性 | 为边类型添加新的属性。 |
| - 删除属性 | 为边类型删除属性。 |
| - 重命名属性 | 更改现有属性的名称。 |
| - 修改属性 | 更改现有属性的值类型、能否为 NULL 或默认值。 |
Note
- 图类型一旦被修改,基于该图类型创建的所有图中的点和边也会相应被修改。如果删除了某个点或边类型,基于该点或边类型创建的所有点或边不会立即从 Storage 服务中被物理删除,即不会立即释放磁盘空间。而是会在后续的 RocksDB Compaction(数据压缩)过程中被物理删除。
- 如果某个索引是基于点类型或边类型的属性创建的,当该属性、点类型或边类型被删除时,此索引会被自动删除。
Note
对非默认 Schema 或其中的对象执行操作时,用户既要通过隐式访问规则或显式USAGE授权获得该 Schema 的访问权,也要具备目标操作所需的权限。Schema 访问校验和目标操作所需的权限校验相互独立,满足其中一项不能替代另一项。Schema 访问控制不适用于临时图、内置 Procedure 和内置 Function。更多信息,请参见 Schema 访问控制。
前提条件¶
- 已创建图类型。更多信息,请参见 CREATE GRAPH TYPE。
- 若要修改图类型,必须是图类型的所有者,或具备对图类型执行
ALTER操作的权限,或具备在对应 Schema 执行ALTER ANY GRAPH TYPE操作的权限。更多信息,请参见角色与权限。
限制条件¶
- 主键
- 不能重新定义现有点类型的主键,即不能增加、删除或替换构成主键的属性。
- 不能使用
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。更多信息,请参见数据类型转换。
- 如果属性被基于该图类型创建的任意图中的常规索引、全文索引或向量索引引用,则无法使用
- 在同一条
语法¶
- 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 和 SHOW CURRENT_SCHEMA。
graph_type_name¶
待修改的图类型的名称。
node_type_name¶
点类型的名称。同一个图类型中所有点类型和边类型的名称必须唯一。
label_name¶
点类型或边类型的标签名称。同一个点类型或边类型中标签的名称必须唯一。
property_name¶
点类型或边类型的属性名称。同一个点类型或边类型中属性的名称必须唯一。若在一个图类型中,多个属性同名,则这些属性必须具有相同的值类型。
property_value_type¶
点类型或边类型的属性的值类型。更多信息,请参见 CREATE GRAPH TYPE。
primary_key_list¶
构成点类型的主键的属性列表。更多信息,请参见 CREATE GRAPH TYPE。
multiedge_key_list¶
构成边类型的多边键的属性列表。更多信息,请参见 CREATE GRAPH TYPE。
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¶
属性的新名称。
示例¶
以下示例基于示例数据集。
添加点类型和边类型至当前 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。