Source: https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/ddl/graph-type/create/ Documentation version: v5.3.2 # CREATE GRAPH TYPE `CREATE GRAPH TYPE`语句用于在当前会话中的 Schema 或指定 Schema 中创建图类型。 执行该语句的用户即为新建的图类型的所有者。创建成功后,图类型的所有者可以执行[修改](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/ddl/graph-type/alter-graph-type/)、[重命名](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/ddl/graph-type/rename/)或[销毁](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/ddl/graph-type/drop/)图类型等操作。图类型的所有权可以通过 [ALTER OWNER](https://dev-docs.yueshu.com.cn/v5.3.2/server-admin/authorization/alter-owner/) 转移给其他用户。 Note 对非默认 Schema 或其中的对象执行操作时,用户既要通过隐式访问规则或显式`USAGE`授权获得该 Schema 的访问权,也要具备目标操作所需的权限。Schema 访问校验和目标操作所需的权限校验相互独立,满足其中一项不能替代另一项。Schema 访问控制不适用于临时图、内置 Procedure 和内置 Function。更多信息,请参见 [Schema 访问控制](https://dev-docs.yueshu.com.cn/v5.3.2/server-admin/authorization/schema-access-control/)。 ## 前提条件 若要创建图类型,必须具备在对应 Schema 执行`CREATE GRAPH TYPE`操作的权限。更多信息,请参见[角色与权限](https://dev-docs.yueshu.com.cn/v5.3.2/server-admin/authorization/)。 ## 限制条件 - 每个点类型必须有且只有一个主键,该主键可以由一个或多个属性组成。 - 每个边类型可以有一个多边键,该多边键可以由零个或多个属性组成。 ## 语法 语法图源码 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](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` 待创建的图类型的名称。`graph_type_name`必须是一个标识符且不能以井号(`#`)开头。有关标识符的更多信息,请参见[标识符命名规则](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/overview/keywords-identifiers/)。 ### `node_type_name` 待创建的图类型中的点类型的名称。同一个图类型中所有点类型和边类型的名称必须唯一。 `node_type_name`必须是一个标识符。有关标识符的更多信息,请参见[标识符命名规则](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/overview/keywords-identifiers/)。 ### `label_name` 点类型或边类型的标签名称。如果同一个点类型或边类型中使用多个标签,这些标签的名称不能重复。 `label_name`必须是一个标识符。有关标识符的更多信息,请参见[标识符命名规则](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/overview/keywords-identifiers/)。 ### `property_name` 点类型或边类型的属性名称。每个点类型必须至少有一个属性。每个边类型可以有零个或多个属性。 同一个点类型或边类型中属性的名称必须唯一。若在一个图类型中,多个属性同名,则这些属性必须具有相同的值类型。 `property_name`必须是一个标识符。有关标识符的更多信息,请参见[标识符命名规则](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/overview/keywords-identifiers/)。 ### `property_value_type` 点类型或边类型的属性的值类型。有关值类型的更多信息,请参见[数据类型](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/data-types/)。 ### `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 主键在点类型创建后不能更改。后续插入此点类型的点时,构成主键的属性值的组合必须唯一。 对于每个点类型,系统会自动基于主键的属性创建主键索引。若要创建自定义索引,请参见[索引概述](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/ddl/index/)。 - `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` 构成点类型的主键的属性列表。这些属性必须满足以下条件: 1. 其值的组合必须唯一。 2. 不能有`NULL`或`DEFAULT value_expression`约束。 ### `multiedge_key_list` 构成边类型的多边键的属性列表,多边键是在两个点之间创建该边类型的平行边的前提条件。这些属性必须满足以下条件: 1. 其值的组合必须唯一。 2. 不能有`NULL`或`DEFAULT value_expression`约束。 ### `edge_type_name` 待创建的图类型的边类型的名称。同一个图类型中所有点类型和边类型的名称必须唯一。 `edge_type_name`必须是一个标识符。有关标识符的更多信息,请参见[标识符命名规则](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/overview/keywords-identifiers/)。 ### `source_node_type_name` 边类型的起始点类型的名称。起始点类型必须是图类型中定义的点类型之一。 `source_node_type_name`必须是一个标识符。有关标识符的更多信息,请参见[标识符命名规则](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/overview/keywords-identifiers/)。 ### `destination_node_type_name` 边类型的目标点类型的名称。目标点类型必须是图类型中定义的点类型之一。 `destination_node_type_name`必须是一个标识符。有关标识符的更多信息,请参见[标识符命名规则](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/overview/keywords-identifiers/)。 ## 示例 ### 在当前 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) } ''' ```` 上述示例展示了[示例数据集](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/overview/example-dataset/)中介绍的图类型`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`类型。 ## 更多信息 - [DESCRIBE GRAPH TYPE](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/data-admin/describe/describe-graph-type/) - [DESCRIBE NODE TYPE](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/data-admin/describe/describe-node-type/) - [DESCRIBE EDGE TYPE](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/data-admin/describe/describe-edge-type/) - [SHOW GRAPH TYPES](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/data-admin/show/show-graph-types/) - [SHOW CREATE GRAPH TYPE](https://dev-docs.yueshu.com.cn/v5.3.2/database-gql-reference/data-admin/show/show-create-graph-type/)