架构概览

本文档介绍了属性图表架构的组成部分,并演示了如何创建和管理图表架构。

借助图,您可以对关联数据进行建模,该图将信息表示为由节点和边缘组成的网络。图架构由节点和边组成,以及用于对节点和边的类型进行分类的标签和用于描述节点和边的属性。 您可以通过将输入表中的行映射到图表节点和边缘并定义自定义标签和属性来定义属性图表架构。如需详细了解 BigQuery Graph,请参阅 BigQuery Graph 概览

了解属性图表数据模型

借助属性图表,您可以将关联数据建模为由节点和边组成的网络。节点表示数据中的实体,例如客户、产品或地点。边表示这些节点之间的连接,描述购买、关注或位置等关系。

节点和边缘可以包含以下信息:

  • 标签:对节点和边缘类型进行分类。例如,班级中的学生可能具有 Student 标签和 Person 标签。如果您未明确定义节点或边的标签,BigQuery Graph 会使用输入表名称作为默认标签。

  • 属性:用于描述节点和边。例如,表示某个人的节点可能具有值为 Alexname 属性和值为 1id 属性。

图 1 中的示例展示了如何设计图表来对金融活动进行建模。此图表包含以下类型的以节点形式建模的实体:

  • Person:表示参与金融交易的个人。
  • Account:表示用于交易的银行账户。

这些实体通过不同类型的关系(由以下有向边缘表示)相连:

  • Owns:某人拥有一个或多个账号。
  • Transfers:资金从一个账号转到另一个账号。

每个有向边缘都表示一个单向关系,从来源节点流向目标节点。例如,Transfers 边缘将来源 Account 连接到目标 Account,从而表示资金流动。

金融图的节点、边、标签和属性。

图 1. 包含多个节点和有向边缘的示例图表。

节点和边缘可在属性中包含其他信息。

  • Person 节点包含以下属性:

    • name (STRING)
    • id (INT64)
  • Transfers 边包含以下属性:

    • amount (FLOAT64)

有向边缘和无向边缘

有向边表示实体之间关系的特定方向。例如,一个人可以拥有一个账号,但一个账号不能拥有一个人。不过,某些关系(例如社交网络中的好友关系)是无向的,表示相互连接。在这种情况下,您可以将无向边缘建模为两个有向边缘,每个方向一个边缘。

设计架构

借助 BigQuery Graph,您可以使用 CREATE PROPERTY GRAPH 语句通过表创建图表。用于创建图表的表称为“输入表”。

定义节点

节点由表中的行定义。 如需定义节点,请在 NODE TABLES 子句中添加节点定义。最简单的节点定义形式包含具有主键的输入表的名称。BigQuery Graph 会将输入表中的行映射到图表节点。

在以下示例中,您使用 NODE TABLES 子句在 FinGraph 属性图表中定义 Account 节点。节点定义包含输入表 Account

-- Create an Account table.
CREATE TABLE graph_db.Account (
  id           INT64 NOT NULL,
  create_time  TIMESTAMP,
  PRIMARY KEY (id) NOT ENFORCED
);

-- Use the Account table as the input table for the Account node definition.
CREATE PROPERTY GRAPH graph_db.FinGraph
  NODE TABLES (
    graph_db.Account
  );

默认情况下,BigQuery 使用表名称作为标签,并将输入表中的所有列都作为属性公开。

  • 每个 Account 节点都使用 Account 标签。
  • 每个 Account 节点都包含来自 Account 表列的 idcreate_time 属性。

元素键

节点定义还会定义元素键,即用于唯一标识图表节点的列的集合。默认情况下,元素键是输入表的主键。或者,您也可以使用 KEY 子句明确定义元素键。

以下示例定义了 Account 节点和 Person 节点。Account 节点会使用 Account 表的主键作为其元素键。Person 节点使用 KEY 子句明确将 id 列指定为元素键。

CREATE TABLE graph_db.Person (
  id           INT64 NOT NULL,
  name         STRING
);

CREATE TABLE graph_db.Account (
  id           INT64 NOT NULL,
  create_time  TIMESTAMP,
  PRIMARY KEY (id) NOT ENFORCED
);

CREATE PROPERTY GRAPH graph_db.FinGraph
  NODE TABLES (
    graph_db.Person KEY (id),
    graph_db.Account
  );
  • 具有非 null 元素键的每一行都会映射到图表中的唯一节点(该节点由元素键标识)。
  • 系统会忽略具有 null 元素键的行。

同一输入表可在多个节点定义中使用。在这种情况下,输入表中的给定行会映射到每个节点定义对应的一个节点。

定义边

边由表中的行定义。 如需定义边,请将边定义添加到 EDGE TABLES 子句中。最简单的边定义形式包含输入表的名称,并定义源节点和目标节点引用。BigQuery Graph 使用此定义将输入表中的行映射到图表边。

默认情况下,BigQuery 使用表名称作为标签,并将输入表中的所有列都作为属性公开。

来源节点和目标节点引用

边缘定义使用 SOURCE KEYDESTINATION KEYREFERENCES 子句定义来源节点和目标节点引用。您必须先定义来源节点和目标节点,然后才能在边缘定义中使用它们。

在以下示例中,您将使用以下内容创建属性图表 FinGraph

  • PersonAccount 节点
  • PersonOwnAccount 边缘
CREATE TABLE graph_db.Person (
  id            INT64 NOT NULL,
  name          STRING,
  PRIMARY KEY (id) NOT ENFORCED
);

CREATE TABLE graph_db.Account (
  id            INT64 NOT NULL,
  create_time   TIMESTAMP,
  PRIMARY KEY (id) NOT ENFORCED
);

CREATE TABLE graph_db.PersonOwnAccount (
  id            INT64 NOT NULL,
  account_id    INT64 NOT NULL,
  create_time   TIMESTAMP,
  FOREIGN KEY (account_id) REFERENCES graph_db.Account (id) NOT ENFORCED,
  PRIMARY KEY (id, account_id) NOT ENFORCED
);

CREATE PROPERTY GRAPH graph_db.FinGraph
  NODE TABLES (
    graph_db.Person,
    graph_db.Account
  )
  EDGE TABLES (
    PersonOwnAccount
      SOURCE KEY (id) REFERENCES Person (id)
      DESTINATION KEY (account_id) REFERENCES Account (id)
  );

每个 PersonOwnAccount 边缘都将一个 Person(来源)节点连接到一个 Account(目标)节点。

  • 边缘的来源节点是 Person 节点,其中 id 属性与边缘 id 属性相同。
  • 边缘的目标节点是 Account 节点,其中 id 属性与边缘 account_id 属性相同。
  • 元素键是 PersonOwnAccount 表的主键,即 (id, account_id)
  • 每个边缘都具有与 PersonOwnAccount 表中的列相同的属性集。
  • 每个边缘都具有默认的 PersonOwnAccount 标签。

将行映射到边

边缘输入表中元素键不为 null 的每一行通常都会映射到图表中的单个边。不过,如果来源或目标节点引用与来源或目标节点表中的零个或多个节点匹配,则边缘输入表中的相应行可能会在图表中生成零个或多个边缘。

在单个表格中定义节点和边

如果表的列定义了与另一个表的关系,您可以在单个表中定义节点及其传入或传出边缘。这种方法可以减少表的数量,简化数据管理,并消除与单独的边表联接的需求,从而提高查询性能。

例如,如果以下 Account 表具有复合主键 (owner_id, account_id),则 owner_id 列可以是引用 Person 表的外键。此结构允许 Account 表同时表示 Account 节点和来自 Person 节点的入向边。

CREATE TABLE graph_db.Person (
  id INT64 NOT NULL,
  PRIMARY KEY (id) NOT ENFORCED
);

-- Assume each account has exactly one owner.
CREATE TABLE graph_db.Account (
  owner_id INT64 NOT NULL,
  account_id INT64 NOT NULL,
  FOREIGN KEY (owner_id) REFERENCES graph_db.Person(id) NOT ENFORCED,
  PRIMARY KEY (owner_id, account_id) NOT ENFORCED
);

您可以使用 Account 表定义 Account 节点及其入向 Owns 边。具体可见以下CREATE PROPERTY GRAPH语句。在 EDGE TABLES 子句中,您为 Account 表指定了别名 Owns。这是因为图表架构中的每个元素都必须具有唯一的名称。

CREATE PROPERTY GRAPH graph_db.FinGraph
  NODE TABLES (
    graph_db.Person,
    graph_db.Account
  )
  EDGE TABLES (
    graph_db.Account AS Owns
      SOURCE KEY (owner_id) REFERENCES Person
      DESTINATION KEY (owner_id, account_id) REFERENCES Account
  );

自定义标签和属性

您可以使用 LABELPROPERTIES 子句自定义标签和属性。

以下示例定义了一个具有自定义属性的 Person 节点和一个具有多个标签的 Account 节点:

CREATE TABLE graph_db.Person (
  id               INT64 NOT NULL,
  name             STRING,
  birthday         TIMESTAMP,
  country          STRING,
  city             STRING,
  PRIMARY KEY (id) NOT ENFORCED
);

CREATE TABLE graph_db.Account (
  id               INT64 NOT NULL,
  create_time      TIMESTAMP,
  is_blocked       BOOL,
  nick_name        STRING,
  PRIMARY KEY (id) NOT ENFORCED
);

CREATE PROPERTY GRAPH graph_db.FinGraph
  NODE TABLES (
    graph_db.Person KEY (id)
      LABEL Customer
      PROPERTIES (CONCAT(city, ", ", country) AS address)
      LABEL Entity PROPERTIES (id, name),
    graph_db.Account KEY (id)
      LABEL Account PROPERTIES (id, create_time)
      LABEL Entity PROPERTIES (id, nick_name AS name)
  );
  • Person 节点使用 Customer 标签公开 address 属性。address 属性由表达式 CONCAT(city, ", ", country), 定义,该表达式引用输入表 Person 中的 citycountry 列。

  • Account 节点使用 Account 标签公开 idcreate_time 属性。

PersonAccount 节点都具有 Entity 标签,其中包含属性 idname

  • Person 节点中,idname 属性来自输入表列。
  • Account 节点中,name 属性引用输入表的 nick_name 列。

标签和属性一致性

在图表中,标签和属性通过其名称进行唯一标识。 您可以在多个节点或边缘定义中使用具有相同名称的标签和属性。不过,具有相同名称的标签和属性必须遵循以下规则:

  • 具有相同名称的属性必须使用相同的值类型。
  • 具有相同名称的标签必须公开相同的属性列表。

在前面的示例中,PersonAccount 节点中都定义了 Entity 标签。这两个定义都包含具有相同值类型的相同属性名称集,即 idname

管理架构依赖项

图表依赖于节点和边缘定义的输入表的架构,以及属性引用的表列。BigQuery 图不会检查删除或更改表或列是否会使现有图架构失效。

您有责任避免破坏性架构更改。请遵循以下最佳实践:

  • 在删除图节点定义中使用的表之前,请先从图中移除该节点定义。
  • 在从作为图表中属性公开的表中移除列之前,请先从相应的节点或边缘定义中移除该属性。

查看图架构

您可以在笔记本中直观呈现图表架构

更新图表架构

如需对现有图的架构进行任何更改,您必须使用 CREATE PROPERTY GRAPH 语句重新定义图架构。

删除图表架构

如需删除属性图表,请使用 DROP PROPERTY GRAPH 语句

后续步骤