CREATE PROPERTY GRAPH — 定义 SQL 属性图
CREATE [ TEMP | TEMPORARY ] PROPERTY GRAPHname[ {VERTEX|NODE} TABLES (vertex_table_definition[, ...] ) ] [ {EDGE|RELATIONSHIP} TABLES (edge_table_definition[, ...] ) ] wherevertex_table_definitionis:vertex_table_name[ ASalias] [ KEY (column_name[, ...] ) ] [element_table_label_and_properties] andedge_table_definitionis:edge_table_name[ ASalias] [ 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] andelement_table_label_and_propertiesis either: NO PROPERTIES | PROPERTIES ALL COLUMNS | PROPERTIES ( {expression[ ASproperty_name] } [, ...] ) or: { { LABELlabel_name| DEFAULT LABEL } [ NO PROPERTIES | PROPERTIES ALL COLUMNS | PROPERTIES ( {expression[ ASproperty_name] } [, ...] ) ] } [...]
CREATE PROPERTY GRAPH 定义一个属性图。属性图由顶点和边组成,二者合称为元素;每个元素都带有关联的标签和属性,并且可以使用 SELECT 的 GRAPH_TABLE 子句以及特殊的路径匹配语法进行查询。图中的数据存储在普通表中(或者视图、外部表等)。每个顶点或边都对应一张表。属性图定义会把这些表关联起来,形成一个可以使用图查询技术进行查询的图结构。
CREATE PROPERTY GRAPH 不会实际物化一个图。因此,它类似于 CREATE VIEW,只记录一个结构,而该结构仅在查询所定义对象时使用。
如果给出了模式名(例如,CREATE PROPERTY GRAPH myschema.mygraph ...),则属性图会创建在指定模式中。否则,它会创建在当前模式中。临时属性图存在于一个特殊模式中,因此在创建临时属性图时不能给出模式名。属性图与表以及其他关系类型共享一个命名空间,因此属性图的名称必须与同一模式中任何其他关系(表、序列、索引、视图、物化视图或外部表)的名称不同。
name #新属性图的名称(可以带模式限定)。
VERTEX/NODEEDGE/RELATIONSHIP #这些关键字分别是同义词。
vertex_table_name #将在新属性图中包含顶点的表名称。
edge_table_name #将在新属性图中包含边的表名称。
alias #顶点表或边表的唯一标识符。默认值为表名。别名在属性图定义中必须唯一(跨所有顶点表和边表定义)。因此,如果同一张表被多次用作顶点表或边表,则至少其中一个必须显式指定别名,以便将它们区分开来。
KEY ( column_name [, ...] ) #一组唯一标识顶点表或边表中某一行的列。默认使用主键。
source_tabledest_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)
) ...
属性图使用 SELECT 的 GRAPH_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)。