开发版本: 19 / devel
此文档适用于不受支持的 PostgreSQL 版本。
您可能需要查看当前版本的相同页面,或上面列出的其他受支持版本。

CREATE PROPERTY GRAPH

CREATE PROPERTY GRAPH — 定义 SQL 属性图

Synopsis

CREATE [ TEMP | TEMPORARY ] PROPERTY GRAPH name
    [ {VERTEX|NODE} TABLES ( vertex_table_definition [, ...] ) ]
    [ {EDGE|RELATIONSHIP} TABLES ( edge_table_definition [, ...] ) ]

where vertex_table_definition is:

    vertex_table_name [ AS alias ] [ KEY ( column_name [, ...] ) ] [ element_table_label_and_properties ]

and edge_table_definition is:

    edge_table_name [ AS alias ] [ KEY ( column_name [, ...] ) ]
        SOURCE [ KEY ( column_name [, ...] ) REFERENCES ] source_table [ ( column_name [, ...] ) ]
        DESTINATION [ KEY ( column_name [, ...] ) REFERENCES ] dest_table [ ( column_name [, ...] ) ]
        [ element_table_label_and_properties ]

and element_table_label_and_properties is either:

    NO PROPERTIES | PROPERTIES ALL COLUMNS | PROPERTIES ( { expression [ AS property_name ] } [, ...] )

or:

   { { LABEL label_name | DEFAULT LABEL } [ NO PROPERTIES | PROPERTIES ALL COLUMNS | PROPERTIES ( { expression [ AS property_name ] } [, ...] ) ] } [...]

描述

CREATE PROPERTY GRAPH 定义一个属性图。属性图由顶点和边组成,二者合称为元素;每个元素都带有关联的标签和属性,并且可以使用 SELECTGRAPH_TABLE 子句以及特殊的路径匹配语法进行查询。图中的数据存储在普通表中(或者视图、外部表等)。每个顶点或边都对应一张表。属性图定义会把这些表关联起来,形成一个可以使用图查询技术进行查询的图结构。

CREATE PROPERTY GRAPH 不会实际物化一个图。因此,它类似于 CREATE VIEW,只记录一个结构,而该结构仅在查询所定义对象时使用。

如果给出了模式名(例如,CREATE PROPERTY GRAPH myschema.mygraph ...),则属性图会创建在指定模式中。否则,它会创建在当前模式中。临时属性图存在于一个特殊模式中,因此在创建临时属性图时不能给出模式名。属性图与表以及其他关系类型共享一个命名空间,因此属性图的名称必须与同一模式中任何其他关系(表、序列、索引、视图、物化视图或外部表)的名称不同。

参数

name #

新属性图的名称(可以带模式限定)。

VERTEX/NODE
EDGE/RELATIONSHIP #

这些关键字分别是同义词。

vertex_table_name #

将在新属性图中包含顶点的表名称。

edge_table_name #

将在新属性图中包含边的表名称。

alias #

顶点表或边表的唯一标识符。默认值为表名。别名在属性图定义中必须唯一(跨所有顶点表和边表定义)。因此,如果同一张表被多次用作顶点表或边表,则至少其中一个必须显式指定别名,以便将它们区分开来。

KEY ( column_name [, ...] ) #

一组唯一标识顶点表或边表中某一行的列。默认使用主键。

source_table
dest_table #

边表所链接到的顶点表。它们分别引用源顶点表和目标顶点表的别名。

KEY ( column_name [, ...] ) REFERENCES ... ( column_name [, ...] ) #

连接边表与源顶点表或目标顶点表的两组列,类似于外键关系。如果这两张表之间已经存在外键约束,则默认使用该约束。

element_table_label_and_properties #

定义元素(顶点或边)表的标签和属性。每个元素至少有一个标签。默认情况下,标签与元素表别名相同。这可以显式指定为 DEFAULT LABEL。也可以指定一个或多个自由选择的标签名。(标签名在属性图中不必唯一。将相同的标签赋给不同元素是有用的。)每个标签都有一个属性列表,该列表可以为空。默认情况下,表的所有列都会自动暴露为属性。这可以显式指定为 PROPERTIES ALL COLUMNS。也可以指定一个表达式列表作为属性,这些表达式可以引用底层表的列。如果这些表达式不是普通的列引用,则还必须显式指定属性名。

注意

属性图定义必须满足以下一致性检查:

  • 在属性图中,对不同属性图元素使用的同名标签必须具有相同数量的属性,而且这些属性必须具有相同的名称。例如,下面的写法是允许的:

    CREATE PROPERTY GRAPH g1
        VERTEX TABLES (
            v1 LABEL foo PROPERTIES (x, y),
            v2 LABEL foo PROPERTIES (x, y)
        ) ...
    

    但下面这种写法不允许:

    CREATE PROPERTY GRAPH g1
        VERTEX TABLES (
            v1 LABEL foo PROPERTIES (x, y),
            v2 LABEL foo PROPERTIES (z)
        ) ...
    
  • 在属性图中,所有同名属性都必须具有相同的数据类型,而不管它们位于哪个标签上。例如,下面的写法是允许的:

    CREATE TABLE v1 (a int, b int);
    CREATE TABLE v2 (a int, b int);
    
    CREATE PROPERTY GRAPH g1
        VERTEX TABLES (
            v1 LABEL foo PROPERTIES (a, b),
            v2 LABEL bar PROPERTIES (a, b)
        ) ...
    

    但下面这种写法不允许:

    CREATE TABLE v1 (a int, b int);
    CREATE TABLE v2 (a int, b varchar);
    
    CREATE PROPERTY GRAPH g1
        VERTEX TABLES (
            v1 LABEL foo PROPERTIES (a, b),
            v2 LABEL bar PROPERTIES (a, b)
        ) ...
    
  • 对于每个属性图元素,所有同名属性在每个标签上的表达式都必须相同。例如,下面的写法是允许的:

    CREATE PROPERTY GRAPH g1
        VERTEX TABLES (
            v1 LABEL foo PROPERTIES (a * 2 AS x) LABEL bar PROPERTIES (a * 2 AS x)
        ) ...
    

    但下面这种写法不允许:

    CREATE PROPERTY GRAPH g1
        VERTEX TABLES (
            v1 LABEL foo PROPERTIES (a * 2 AS x) LABEL bar PROPERTIES (a * 10 AS x)
        ) ...
    

属性图使用 SELECTGRAPH_TABLE 子句进行查询。

GRAPH_TABLE 子句所依赖的基础关系的访问权限,由执行查询的用户权限决定,而不是由属性图所有者决定。因此,属性图的使用者必须对属性图以及 GRAPH_TABLE 子句所依赖的基础关系具备相应权限。

示例

CREATE PROPERTY GRAPH g1
    VERTEX TABLES (v1, v2, v3)
    EDGE TABLES (e1 SOURCE v1 DESTINATION v2,
                 e2 SOURCE v1 DESTINATION v3);

兼容性

CREATE PROPERTY GRAPH 符合 ISO/IEC 9075-16(SQL/PGQ)。