CREATE GRAPH TYPE¶
CREATE GRAPH TYPE语句用于在当前会话中的 Schema 或指定 Schema 中创建图类型。
执行该语句的用户即为新建的图类型的所有者。创建成功后,图类型的所有者可以执行修改、重命名或销毁图类型等操作。图类型的所有权可以通过 ALTER OWNER 转移给其他用户。
Note
对非默认 Schema 或其中的对象执行操作时,用户既要通过隐式访问规则或显式USAGE授权获得该 Schema 的访问权,也要具备目标操作所需的权限。Schema 访问校验和目标操作所需的权限校验相互独立,满足其中一项不能替代另一项。Schema 访问控制不适用于临时图、内置 Procedure 和内置 Function。更多信息,请参见 Schema 访问控制。
前提条件¶
若要创建图类型,必须具备在对应 Schema 执行CREATE GRAPH TYPE操作的权限。更多信息,请参见角色与权限。
限制条件¶
- 每个点类型必须有且只有一个主键,该主键可以由一个或多个属性组成。
- 每个边类型可以有一个多边键,该多边键可以由零个或多个属性组成。
语法¶
- create_graph_type_statement
- node_type_filler
- primary_key_list
- edge_type_filler
- multiedge_key_list
create_graph_type_statement ::=
'CREATE' 'PROPERTY'? 'GRAPH TYPE' ('IF NOT EXISTS')? (schema_reference '/')? graph_type_name 'AS'? '{'
(
(
(('NODE' | 'VERTEX') 'TYPE'? node_type_name '(' node_type_filler ')')
|
(('EDGE' | 'RELATIONSHIP') 'TYPE'? 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 ')'
)
)
)
(
','
(
(('NODE' | 'VERTEX') 'TYPE'? node_type_name '(' node_type_filler ')')
|
(('EDGE' | 'RELATIONSHIP') 'TYPE'? 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 ')'
)
)
)
)*
)?
'}'
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)* )? ')'
参数¶
IF NOT EXISTS¶
该子句会检查是否已经存在同名的图类型。如果已存在,则不会创建图类型,也不会抛出异常。
若不指定该子句,且已经存在同名的图类型,则会抛出异常。
schema_reference¶
所引用的 Schema 路径。此处即待创建的图类型所在的 Schema 路径。
绝对路径或相对路径均可在语句中使用。如果指定了 Schema 路径,图类型将在指定的 Schema 中创建;否则,将在当前会话的 Schema 中创建。在指定的 Schema 中创建图类型之前,需确保该 Schema 已存在。关于设置和查看 Schema 的更多信息,请参见 SESSION SET 和 SHOW CURRENT_SCHEMA。
graph_type_name¶
待创建的图类型的名称。graph_type_name必须是一个标识符且不能以井号(#)开头。有关标识符的更多信息,请参见标识符命名规则。
node_type_name¶
待创建的图类型中的点类型的名称。同一个图类型中所有点类型和边类型的名称必须唯一。
node_type_name必须是一个标识符。有关标识符的更多信息,请参见标识符命名规则。
label_name¶
点类型或边类型的标签名称。如果同一个点类型或边类型中使用多个标签,这些标签的名称不能重复。
label_name必须是一个标识符。有关标识符的更多信息,请参见标识符命名规则。
property_name¶
点类型或边类型的属性名称。每个点类型必须至少有一个属性。每个边类型可以有零个或多个属性。
同一个点类型或边类型中属性的名称必须唯一。若在一个图类型中,多个属性同名,则这些属性必须具有相同的值类型。
property_name必须是一个标识符。有关标识符的更多信息,请参见标识符命名规则。
property_value_type¶
点类型或边类型的属性的值类型。有关值类型的更多信息,请参见数据类型。
NULL | NOT NULL | DEFAULT value_expression | PRIMARY KEY | MULTIEDGE KEY¶
属性的约束选项。具体介绍如下:
NULL:默认选项,表示属性的值可以为NULL。在插入具有该属性的点或边时,如果没有指定属性值,则属性值为NULL。
NOT NULL:表示属性的值不能为NULL。如果指定了NOT NULL,则在插入具有该属性的点或边时,必须为属性指定非NULL值,否则会抛出异常。
DEFAULT value_expression:指定属性的默认值。在插入具有该属性的点或边时,如果没有指定属性值,则使用此默认值。该约束条件可以与NULL或NOT NULL共用。value_expression必须是不依赖于任何变量的表达式。
-
PRIMARY KEY:指定该属性单独作为该点类型的主键。- 属性值不能为
NULL。 - 该约束不能与
NULL或DEFAULT value_expression共用。 - 每个点类型必须有且只有一个主键,如果主键由多个属性组成,则必须使用
primary_key_list指定这些属性。 -
该属性的值类型不能为
LIST、SET、MAP、VECTOR或GEOGRAPHY。Caution
SET和MAP当前不能用于构成主键。创建图类型时可能不会拒绝此类定义,但不支持写入以这些类型作为主键的点。
指定主键的方式如下:
- 如果主键仅由一个属性组成,可使用以下任意方式:
- 在
primary_key_list中指定。 - 在属性定义后面添加
PRIMARY KEY约束。
- 在
- 如果主键由多个属性组成,必须在
primary_key_list中指定这些属性。
Note
主键在点类型创建后不能更改。后续插入此点类型的点时,构成主键的属性值的组合必须唯一。
对于每个点类型,系统会自动基于主键的属性创建主键索引。若要创建自定义索引,请参见索引概述。
- 属性值不能为
-
MULTIEDGE KEY:指定该属性单独作为该边类型的多边键。- 属性值不能为
NULL。 - 该约束不能与
NULL或DEFAULT value_expression共用。 - 每个边类型可以有零个或一个多边键;如果多边键由多个属性组成,则必须使用
multiedge_key_list指定这些属性。 - 该属性的值类型不能为
VECTOR或GEOGRAPHY。
指定多边键的方式如下:
- 如果多边键仅由一个属性组成,可使用以下任意方式:
- 在
multiedge_key_list中指定。 - 在属性定义后面添加
MULTIEDGE KEY约束。
- 在
- 如果多边键由多个属性组成,必须在
multiedge_key_list中指定这些属性。 - 如果多边键不包含任何属性,必须将
multiedge_key_list设置为MULTIEDGE KEY()。
Note
多边键在边类型创建后不能更改。后续插入此边类型的平行边时,构成多边键的属性值的组合必须唯一。
- 属性值不能为
多个约束选项的组合
NULL和DEFAULT value_expression:表示该属性有默认值,且可以为NULL。在插入具有该属性的节点或边时,如果没有指定属性值,则使用默认值;如果指定为NULL,则属性值为NULL。NOT NULL和DEFAULT value_expression:表示该属性有默认值且不能为NULL。在插入具有该属性的点或边时,如果没有指定属性值,则使用默认值。NOT NULL和PRIMARY KEY:表示该属性单独作为该点类型的主键,且属性值不能为NULL。注意,若已经指定了PRIMARY KEY,NOT NULL可省略。NOT NULL和MULTIEDGE KEY:表示该属性单独作为该边类型的多边键,且属性值不能为NULL。注意,若已经指定了MULTIEDGE KEY,NOT NULL可省略。
primary_key_list¶
构成点类型的主键的属性列表。这些属性必须满足以下条件:
- 其值的组合必须唯一。
- 不能有
NULL或DEFAULT value_expression约束。
multiedge_key_list¶
构成边类型的多边键的属性列表,多边键是在两个点之间创建该边类型的平行边的前提条件。这些属性必须满足以下条件:
- 其值的组合必须唯一。
- 不能有
NULL或DEFAULT value_expression约束。
edge_type_name¶
待创建的图类型的边类型的名称。同一个图类型中所有点类型和边类型的名称必须唯一。
edge_type_name必须是一个标识符。有关标识符的更多信息,请参见标识符命名规则。
source_node_type_name¶
边类型的起始点类型的名称。起始点类型必须是图类型中定义的点类型之一。
source_node_type_name必须是一个标识符。有关标识符的更多信息,请参见标识符命名规则。
destination_node_type_name¶
边类型的目标点类型的名称。目标点类型必须是图类型中定义的点类型之一。
destination_node_type_name必须是一个标识符。有关标识符的更多信息,请参见标识符命名规则。
示例¶
在当前 Schema 创建空图类型¶
CREATE GRAPH TYPE IF NOT EXISTS empty_graph_type AS {}
上述示例创建一个名为empty_graph的空的图类型,其不包含任何点类型或边类型。
在指定 Schema 创建空图类型¶
'''
// 创建 Schema
CREATE SCHEMA IF NOT EXISTS /my_schema
'''
'''
// 为当前会话设置 Schema
SESSION SET SCHEMA /my_schema
'''
'''
// 创建图类型至指定 Schema
CREATE GRAPH TYPE IF NOT EXISTS /default_schema/my_graph_type AS { NODE Person (LABEL Person {id INT64 PRIMARY KEY, name STRING}) }
'''
上述示例在当前会话中的 Schema 为/my_schema的情况下,在/default_schema创建一个名为my_graph_type的图类型,其包含一个点类型。
创建每个点类型均使用id作为主键的图类型¶
'''
CREATE GRAPH TYPE IF NOT EXISTS movie_type AS {
NODE Actor (LABEL Person {id INT64, name STRING, birthDate DATE, PRIMARY KEY (id)}) ,
NODE Director (LABEL Person {id INT64, name STRING, birthDate DATE, PRIMARY KEY (id)}),
NODE `User` (LABEL Person {id INT64 PRIMARY KEY}),
NODE Movie (LABEL Movie {id INT64 PRIMARY KEY, name STRING}),
NODE Genre (LABEL Genre {id INT64 PRIMARY KEY, name STRING}),
EDGE Act (Actor)-[:Act]->(Movie),
EDGE Direct (Director)-[:Direct]->(Movie),
EDGE Watch (`User`)-[:Watch {rate FLOAT}]->(Movie),
EDGE WithGenre (Movie)-[:WithGenre]->(Genre)
}
'''
上述示例展示了示例数据集中介绍的图类型movie_type的定义。
创建边类型带多边键的图类型¶
'''
CREATE GRAPH TYPE IF NOT EXISTS social_network AS {
NODE Person (LABEL Person {id INT64 PRIMARY KEY, name STRING}),
NODE Company (LABEL Company {id INT64 PRIMARY KEY, name STRING}),
EDGE WorkAt (Person)-[:WorkAt {`from` DATE, to DATE, MULTIEDGE KEY ()}]->(Company),
EDGE Friend (Person)-[:Friend {since DATE MULTIEDGE KEY }]->(Person)
}
'''
上述示例创建一个名为social_network的图类型,其包含两个点类型Person和Company,以及两个边类型WorkAt和Friend。边类型WorkAt的多边键不包含任何属性,而边类型Friend的多边键由属性since组成。
创建点类型的属性带有默认值的图类型¶
'''
CREATE GRAPH TYPE IF NOT EXISTS social_network_2 AS {
NODE Person (LABEL Person {id INT64 PRIMARY KEY, name STRING DEFAULT 'unknown', age INT32 DEFAULT 0}),
NODE Company (LABEL Company {id INT64 PRIMARY KEY, name STRING})
}
'''
上述示例创建一个名为social_network_2的图类型,其包含两个点类型Person和Company。点类型Person的属性name和age分别有默认值unknown和0。
创建主键和多边键由多个属性组成的图类型¶
'''
CREATE GRAPH TYPE IF NOT EXISTS primary_key_multi_properties AS {
NODE Person (LABEL Person {id INT64, name STRING, PRIMARY KEY (id, name)}),
EDGE Know (Person)-[:`Like` {`from` DATE, to DATE, MULTIEDGE KEY (`from`,to)}]->(Person)
}
'''
上述示例创建一个名为primary_key_multi_properties的图类型,其包含一个点类型Person和一个边类型Know。点类型Person的主键由两个属性id和name组成,边类型Know的多边键由两个属性from和to组成。
创建属性值类型为VECTOR的图类型¶
'''
CREATE GRAPH TYPE IF NOT EXISTS ann_test AS {
NODE N1 (LABEL N1 {id INT64 PRIMARY KEY, vec1 VECTOR<3, FLOAT>, vec2 VECTOR<7, FLOAT>, vec3 VECTOR<3, FLOAT>}),
NODE N2 (LABEL N2 {id INT64 PRIMARY KEY, vec1 VECTOR<3, FLOAT>, vec2 VECTOR<7, FLOAT>, vec5 VECTOR<5, FLOAT>}),
EDGE E1 (N1)-[LABEL E1 {id INT64, vec1 VECTOR<3, FLOAT>, vec2 VECTOR<7, FLOAT>, vec3 VECTOR<3, FLOAT> }]->(N2)
}
'''
上述示例创建一个名为ann_test的图类型,其包含两个点类型N1和N2,以及一个边类型E1。这些点类型和边类型的属性均包含VECTOR类型。