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

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
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_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 , )

 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

构成点类型的主键的属性列表。这些属性必须满足以下条件:

  1. 其值的组合必须唯一。
  2. 不能有NULL或DEFAULT value_expression约束。

multiedge_key_list

构成边类型的多边键的属性列表,多边键是在两个点之间创建该边类型的平行边的前提条件。这些属性必须满足以下条件:

  1. 其值的组合必须唯一。
  2. 不能有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类型。

更多信息