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

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 PROPERTY GRAPH TYPE schema_reference / graph_type_name { 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 & { property_name :: TYPED property_value_type NULL NOT NULL DEFAULT value_expression PRIMARY KEY , , primary_key_list }
primary_key_list
PRIMARY KEY ( property_name , )
edge_type_filler
LABEL label_name LABELS IS : label_name & { 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 , )
alter_element_type_op
ADD LABELS IF NOT EXISTS label_name & DROP LABELS IF EXISTS label_name & ADD PROPERTIES IF NOT EXISTS { property_name :: TYPED property_value_type NULL NOT NULL DEFAULT value_expression , } DROP PROPERTIES IF EXISTS { property_name , } RENAME PROPERTIES { old_property_name TO new_property_name , } MODIFY PROPERTIES { property_name :: TYPED property_value_type NULL NOT NULL DEFAULT value_expression , }

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。