修改图模型

创建图模型,可以对其进行修改。 已经存储在图中的数据,如果不涉及到该修改动作,则会保持不变。 例如,如果你有100个Book顶点,然后向Book模式添加了一个属性,那么你仍然会有100个Book顶点,但属性值会从默认值变为新设定的值。 如果你删除了某个Book的属性,那么您仍然拥有所有Book,但是那个属性将会消失。

要安全地更新图形数据库纲目,用户应遵循以下过程:

  • 创建SCHEMA_CHANGE JOB,它定义ADD,ALTER和/或DROP语句的顺序。

  • 运行SCHEMA_CHANGE JOB(即RUN JOB job_name),它将执行以下操作:

    • 尝试更改图形数据库Schema

    • 如果更改成功,则任何与新图形数据库Schema不兼容的任何加载作业或查询失效。

    • 如果更改失败,则报告错误并返回到尝试更改之前的状态。

图数据库Schema的更改,会使得任何涉及到被更改部分的加载作业或查询作业失效。 尤其是:

• 如果加载作业涉及到已丢弃(删除)或更改过的顶点或边,则加载作业将停止工作。

• 如果查询引用了已删除的顶点,边或属性,则查询将变为无效。

无效的加载作业会被删除,无效的查询会被卸载。 因此在图形数据库Schema更新后,用户需要根据新的图形数据库Schema重新创建新的加载和查询作业。

对Schema未更改部分的作业和查询仍然有效,不需要重新开始。 但是,即使这些作业有效(例如它可以运行),用户也可能仍然需要检测它们是否真的运行完美。(例如,你想运行它们吗?)

在图数据库Schema更新之前开始的加载或查询操作将基于更改前的图数据库Schema完成。 在图数据库Schema更改之后开始并且尚未失效的加载或查询操作将基于更改后图数据库Schema完成。

全局Schema改动 vs. 局部Schema改动

只有管理员,设计者和超级用户才能创建和运行框架更改。 每种用户角色都可以创建和运行不同类型的框架更改。

只有超级用户才能添加,更改或删除全局顶点类或全局边类,这些类通过CREATE VERTEX或CREATE ... EDGE创建。 即使顶点类或边类仅用于一个图,此规则也适用。超级用户可以使用GLOBAL SCHEMA_CHANGE JOB执行这种更改操作。

管理员或设计者可以添加,更改或删除在局部图中创建的局部顶点类或局部边类。 使用SCHEMA_CHANGE JOB内的ADD语句创建局部顶点类和边类。 要更改或删除任何这些局部类,管理员用户可以使用常规命令SCHEMA_CHANGE JOB。

下面描述了两种类型的操作。

创建图数据库Schema_Change JOB

下例中的CREATE SCHEMA_CHANGE JOB代码块定义了ADD、ALTER和DROP的顺序,用于对指定图的更改。但是它并不改动图数据库Schema。

CREATE SCHEMA_CHANGE JOB 语法
CREATE SCHEMA_CHANGE JOB job_name FOR GRAPH graph_name {
   [sequence of DROP, ALTER, and ADD statements, each line ending with a semicolon]
}

CREATE SCHEMA_CHANGE JOB的一个用途是将另一个顶点类型和边类型定义为二级索引的结构。 例如,如果要索引User顶点的postalCode属性,则可以创建postalCode_idx(PRIMARY_ID id字符串,代码字符串)顶点类型和hasPostalCode(FROM User,TO postalCode_idx)边缘类型。 然后创建一个索引结构,每个User都有一条边到postalCode_idx顶点。

就其本质而言,SCHEMA_CHANGE JOB实际包含多个子语句。 所以如果要在交互式的GSQL shell中使用,则需要利用BEGIN和END命令使其可以在多行上输入SCHEMA_CHANGE JOB。 如果该操作的语句存储在脚本文件中,则不需要使用BEGIN和END。

请记住在该JOB语句块中的每个DROP,ALTER或ADD语句末尾需要标记一个分号。

如果SCHEMA_CHANGE JOB语句中定义了某个新边类指向新的顶点类,则ADD VERTEX语句应位于相关的ADD EDGE语句之前。 但是,ADD EDGE和ADD VERTEX语句可以位于相同的SCHEMA_CHANGE JOB中。

添加顶点和边(局部)

ADD语句用于定义新的顶点类或边类,并自动将其添加到图数据库Schema中。 ADD VERTEX | EDGE的语法类似于CREATE VERTEX | EDGE | GRAPH的语法,但它只能在SCHEMA_CHANGE JOB中使用。

ADD VERTEX / UNDIRECTED EDGE / DIRECTED EDGE
ADD VERTEX v_type_name (PRIMARY_ID id type [, attribute_list]) [WITH STATS="none"|"outdegree_by_edgetype"];
ADD UNDIRECTED EDGE e_type_name (FROM v_type_name, TO v_type_name [, edge_attribute_list]);
ADD DIRECTED EDGE e_type_name (FROM v_type_name, TO v_type_name [, edge_attribute_list])
   [WITH REVERSE_EDGE="rev_name"];

修改顶点和边

ALTER语句用于在已有的顶点类或边类中添加或删除属性。它只能在SCHEMA_CHANGE JOB中使用。基本语法如下:

ALTER VERTEX / EDGE
ALTER VERTEX|EDGE object_type_name ADD|DROP (attribute_list);

修改 ... 添加

新添加的属性被附加到到图数据库Schema的最后,新属性可以包括DEFAULT 字段:

ALTER ... ADD
ALTER VERTEX|EDGE object_type_name ADD ATTRIBUTE (
      attribute_name type [DEFAULT default_value]
   [, attribute_name type [DEFAULT default_value]]* );

修改... 删除

ALTER ... DROP
ALTER VERTEX|EDGE object_type_name DROP ATTRIBUTE (
     attribute_name [, attribute_name]* );

删除顶点或边(局部)

DROP语句会从数据库字典中删除指定的顶点类或边类。仅当没有正在执行的图操作时DROP语句才能使用:

drop vertex / edge
DROP VERTEX v_type_name [, v_type_name]*
DROP EDGE e_type_name [, e_type_name]*

运行Schema_CHANGE JOB

命令RUN JOB job_name执行图数据库Schema更改操作。 更改框架后,GSQL系统会检查所有现有的GSQL查询(详见“GSQL语言参考,第2部分:查询”)。 如果现有的GSQL查询涉及到已被删除的顶点,边或属性,则该查询将失效,并提示“图数据库Schema更新后查询query_name变为无效,请更新。”("Query query_name becomes invalid after schema update, please update it.")

下面的例子中,SCHEMA_CHANGE JOB add_reviews分别添加了Review顶点类和两种边类,以便分别使Review可以将User和Book连接起来:

SCHEMA_CHANGE JOB 的例子
USE GRAPH Book_rating
CREATE SCHEMA_CHANGE JOB add_reviews FOR GRAPH Book_rating {
   ADD VERTEX Review (PRIMARY_ID id UINT, review_date DATETIME, url STRING);
   ADD UNDIRECTED EDGE wrote_review (FROM User, TO Review);
   ADD UNDIRECTED EDGE review_of_book (FROM Review, TO Book);
}
RUN JOB add_reviews

USE GLOBAL命令

USE GLOBAL命令将超级用户的模式更改为全局模式(Global mode)。 在全局模式下,超级用户可以定义或修改全局顶点类和边类,以及指定哪些图形使用这些全局类。 用户应在创建或运行GLOBAL SCHEMA_CHANGE JOB之前运行USE GLOBAL命令。

创建GLOBAL SCHEMA_CHANGE JOB

语句块CREATE GLOBAL SCHEMA_CHANGE JOB定义了ADD,ALTER和DROP语句的顺序,这些语句修改全局顶点类或边类的属性或这些全局类的中的成员。 和非全局的schema_change job不同,该语句的标头(header)中不包含图形名称。 但是,语句内容中的ADD / ALTER / DROP语句则提及了图形。

CREATE GLOBAL SCHEMA_CHANGE JOB 语法
CREATE GLOBAL SCHEMA_CHANGE JOB job_name {
   [sequence of global DROP, ALTER, and ADD statements, each line ending with a semicolon]
}

全局框架改动和局部框架改动都包含ADD和DROP命令,但是它们的含义不尽相同。下表详述了它们的区别:

局部的

全局的

ADD

创建一个全新的局部顶点类或边类并将其添加到图域中

将一个或多个已有的全局顶点类和边类添加到图域中

DROP

删除一个局部顶点类或边类,以及其对应的实例

从图域中删除一个或多个现有的全局顶点类或边类

ALTER

添加或删除一个局部顶点类或边类中的属性

添加或删除一个全局顶点类或边类中的属性,这可能会影响到多个图

记住,在一个JOB语句块中,请在DROP、ALTER或ADD语句的末尾添加分号。

修改顶点和边(全局)

全局的ADD语句会将已有的全局顶点类或边类加入图中。

ADD VERTEX / UNDIRECTED EDGE / DIRECTED EDGE (Global)
ADD VERTEX v_type_name [,v_type_name...] TO GRAPH gname;
ADD EDGE e_type_name [,e_type_name...] TO GRAPH gname;

修改顶点和边

全局的ALTER语句在一个全局顶点类或边类中添加或删除属性。全局ALTER VERTEX | EDGE的语法与修改局部图数据库Schema的相关代码一致。

ALTER VERTEX / EDGE
ALTER VERTEX|EDGE object_type_name ADD|DROP (attribute_list);

修改 ... 添加

新增的属性会被附加到图数据库Schema的最后。新添加的属性包含了DEFAULT字段。

ALTER ... ADD
ALTER VERTEX|EDGE object_type_name ADD ATTRIBUTE (
      attribute_name type [DEFAULT default_value]
   [, attribute_name type [DEFAULT default_value]]* );

修改... 删除

ALTER ... DROP
ALTER VERTEX|EDGE object_type_name DROP ATTRIBUTE (
     attribute_name [, attribute_name]* );

删除顶点边(全局)

全局DROP语句删除指定的全局顶点类或边类,但它不会删除任何数据。

drop vertex / edge
DROP VERTEX v_type_name [,v_type_name...] FROM GRAPH gname;
DROP EDGE e_type_name   [,e_type_name...] FROM GRAPH gname;

运行 GLOBAL SCHEMA_CHANGE JOB

RUN JOB job_name执行全局图数据库Schema更改作业。 更改框架后,GSQL系统会检查所有现有的GSQL查询(详见“GSQL语言参考,第2部分:查询”)。 如果现有GSQL查询涉及到已被删除的顶点,边或属性,则查询将失效,并提示“框架更新后,该查询query_name变为无效,请更新”。("Query query_name becomes invalid after schema update, please update it.")

下面的例子中,命令SCHEMA_CHANGE JOB alter_friendship_make_library从边friend_of中删除了on_date属性,并将Book类添加到library图中。

GLOBAL SCHEMA_CHANGE JOB 的例子
USE GLOBAL
CREATE GRAPH library()
CREATE GLOBAL SCHEMA_CHANGE JOB alter_friendship_make_library {
   ALTER EDGE friend_of DROP ATTRIBUTE (on_date);
   ADD VERTEX Book TO GRAPH library;
}
RUN JOB alter_friendship_make_library

Last updated