Visão geral do esquema do Spanner Graph

Com o Spanner Graph, é possível modelar dados conectados como um gráfico de propriedades que representa informações como uma rede de nós e arestas. Os nós simbolizam entidades, e as arestas mostram as conexões entre elas. Nós e arestas incluem rótulos que os classificam em conjuntos. Os nós e as arestas também incluem propriedades que são pares de chave-valor.

Para definir um esquema de gráfico do Spanner, mapeie linhas de tabelas de entrada para nós e arestas do gráfico. Personalize rótulos e propriedades para nós e arestas e entenda como as mudanças de esquema afetam as dependências do gráfico. Também é possível gerenciar dados sem esquema para definições de gráficos mais flexíveis.

Para saber mais sobre o Spanner Graph, consulte a visão geral do Spanner Graph.

Entender o modelo de dados de gráfico de propriedades

Com um gráfico de propriedades, é possível modelar dados conectados. Ela representa informações como uma rede de nós e arestas. Os nós simbolizam entidades no cenário de dados, como clientes, produtos ou locais. As arestas mostram as conexões entre esses nós, capturando relações como "comprado", "segue" ou "localizado em".

Os nós e as arestas podem incluir as seguintes informações:

  • Rótulos, que classificam nós e arestas em conjuntos, por exemplo, cidade.
  • Propriedades, que são pares de chave-valor, por exemplo, população.

O exemplo na Figura 1 mostra como você pode projetar um gráfico para modelar atividades financeiras. Esse gráfico inclui os seguintes tipos de entidades modeladas como nós:

  • Pessoa:representa um indivíduo envolvido em transações financeiras.
  • Conta:representa uma conta bancária usada para transações.

Essas entidades estão conectadas por diferentes tipos de relações, que são representadas pelas seguintes arestas direcionadas:

  • Proprietário:uma pessoa é proprietária de uma ou mais contas.
  • Transferências:o dinheiro é movido de uma conta para outra.

Cada aresta direcionada indica uma relação unidirecional que flui de um nó de origem para um nó de destino. Por exemplo, uma aresta Transfers conecta uma origem Account a um destino Account, indicando o fluxo de dinheiro.

Diagrama de visão geral do esquema do Spanner Graph.

Figura 1. Exemplo de gráfico com vários nós e arestas direcionadas.

Os nós e as arestas incluem mais informações nas propriedades. Cada propriedade inclui um nome e um valor.

  • Os nós Person incluem estas propriedades:
    • name (STRING)
    • id (INT64)
  • As arestas Transfers incluem esta propriedade:
    • amount (FLOAT64)

Arestas direcionadas e não direcionadas

O gráfico de exemplo usa arestas direcionadas que indicam uma direção específica na relação entre entidades. No entanto, algumas relações, como a de amigo em uma rede social, não são direcionadas e representam uma conexão recíproca sem uma origem ou um endpoint distintos. Nesse caso, você pode modelar arestas não direcionadas como duas arestas direcionadas, uma em cada direção.

Design de esquema do Spanner Graph

Com o Spanner Graph, você pode usar a instrução CREATE PROPERTY GRAPH para criar um gráfico com base em tabelas. As tabelas que criam gráficos são chamadas de tabelas de entrada. Essa abordagem usa SQL/PGQ (consultas de grafo de propriedades), que faz parte dos padrões SQL:2023.

Definir um nó em um gráfico de propriedades

Para definir um nó, adicione uma definição na cláusula NODE TABLES. A forma mais simples de definição de nó contém apenas um nome de tabela de entrada. O Spanner Graph mapeia linhas da tabela de entrada para nós de gráfico.

No exemplo a seguir, você usa a cláusula NODE TABLES para definir o nó Account no gráfico de propriedades FinGraph. A definição do nó contém a tabela de entrada Account.

-- First, create an Account table.
CREATE TABLE Account (
  id           INT64 NOT NULL,
  create_time  TIMESTAMP,
) PRIMARY KEY (id);

-- Next, use the Account table as input table of Account node definition.
CREATE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Account
  );

Rótulos e propriedades padrão

Por padrão, todos os nós usam o nome da tabela de entrada como rótulo, e o gráfico do Spanner expõe todas as colunas da tabela de entrada como propriedades de nó.

No exemplo anterior,

  • Cada nó de conta usa o rótulo Account.
  • Cada nó de conta inclui propriedades [id, create_time] das colunas da tabela Account.

Chave do elemento

Uma definição de nó também define a chave do elemento que identifica de forma exclusiva um nó do gráfico.

  • Por padrão, a chave do elemento é a chave primária da tabela de entrada.
  • É possível usar a cláusula KEY para definir explicitamente as chaves de elemento.
  • É possível usar colunas com uma restrição de índice exclusivo como chaves de elemento.

O exemplo a seguir define os nós Account e Person.

  • Por padrão, o nó Account usa a chave primária da tabela Account como chave de elemento.
  • O nó Person, por outro lado, especifica explicitamente o id como a chave do elemento com a cláusula KEY.
CREATE TABLE Person (
  id           INT64 NOT NULL,
  name         STRING(MAX),
) PRIMARY KEY (id);

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

CREATE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Person KEY (id),
    Account
  );

Mapear uma linha na tabela de entrada para um nó no gráfico

  • Cada linha com uma chave de elemento não nula é mapeada para um nó exclusivo no gráfico, identificado pela chave do elemento.
  • As linhas com uma chave de elemento nulo são ignoradas.

Definir uma aresta em um gráfico de propriedades

Para definir uma aresta, adicione uma definição à cláusula EDGE TABLES. A forma mais simples de definição de aresta contém apenas um nome de tabela de entrada. O Spanner Graph mapeia linhas da tabela de entrada para arestas do gráfico.

Referências de nós de origem e destino

No exemplo a seguir, você cria um gráfico de propriedades FinGraph com o seguinte:

  • Nós Person e Account
  • PersonOwnAccount aresta
CREATE TABLE Person (
 id            INT64 NOT NULL,
 name          STRING(MAX),
) PRIMARY KEY (id);

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

CREATE TABLE PersonOwnAccount (
 id            INT64 NOT NULL,
 account_id    INT64 NOT NULL,
 create_time   TIMESTAMP,
 FOREIGN KEY (account_id) REFERENCES Account (id)
) PRIMARY KEY (id, account_id),
  INTERLEAVE IN PARENT Person;

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

Uma definição de aresta define a referência de nó de origem e destino usando as cláusulas SOURCE KEY, DESTINATION KEY e REFERENCES. O exemplo a seguir usa a definição de borda de PersonOwnAccount para ilustrar esse conceito:

EDGE TABLES (
  PersonOwnAccount
    SOURCE KEY (id) REFERENCES Person (id)
    DESTINATION KEY (account_id) REFERENCES Account (id)
)

Cada aresta PersonOwnAccount conecta um Person (origem) a um nó Account (destino).

  • O nó de origem de uma aresta é um nó Person em que o id é igual ao id da aresta.
  • O nó de destino de uma aresta é um nó Account em que o id é igual ao account_id da aresta.

Além disso, o seguinte é verdadeiro para a borda PersonOwnAccount:

  • A chave do elemento é a chave primária da tabela PersonOwnAccount, ou seja, (id, account_id).
  • Cada aresta tem o mesmo conjunto de propriedades das colunas da tabela PersonOwnAccount.
  • Cada aresta tem o rótulo padrão PersonOwnAccount.

Mapear uma linha em uma tabela de entrada de arestas para arestas no gráfico

  • Cada linha na tabela de entrada de arestas, em que a chave do elemento não é nula, geralmente é mapeada para uma aresta única no gráfico.
  • Uma linha pode corresponder a zero ou mais de uma aresta no gráfico. Por exemplo, isso acontece quando a referência do nó de origem corresponde a zero ou mais nós na tabela de nós de origem.
  • É possível usar a mesma tabela de entrada em diferentes definições de nó ou aresta para criar conjuntos diferentes de nós ou arestas. Para mais informações, consulte Mesclar tabelas de entrada de nós e arestas.

Personalizar rótulos e propriedades

Use as cláusulas LABEL e PROPERTIES para personalizar rótulos e propriedades.

O exemplo a seguir define dois nós: Person e Account.

  • Os nós Person usam o rótulo Customer para expor a propriedade address. A propriedade address é definida pela expressão CONCAT(city, ", ", country),, que se refere às colunas city e country da tabela de entrada Person.
  • Para Account, o nó Account usa o rótulo Account para expor as propriedades id e create_time.
  • Person e Account têm o rótulo Entity com as propriedades [id, name].
    • Para Person, as propriedades id e name vêm das colunas da tabela de entrada.
    • Para Account, a propriedade name se refere à coluna nick_name da tabela de entrada.
CREATE TABLE Person (
 id               INT64 NOT NULL,
 name             STRING(MAX),
 birthday         TIMESTAMP,
 country          STRING(MAX),
 city             STRING(MAX),
) PRIMARY KEY (id);

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

CREATE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Person KEY (id)
      LABEL Customer
        PROPERTIES (CONCAT(city, ", ", country) AS address)
      LABEL Entity PROPERTIES (id, name),
    Account KEY (id)
      LABEL Account PROPERTIES (id, create_time)
      LABEL Entity PROPERTIES (id, nick_name AS name)
  );

Consistência de rótulos e propriedades

Em um gráfico, os rótulos e as propriedades são identificados de forma exclusiva pelos nomes. É possível usar rótulos e propriedades com o mesmo nome em várias definições de nós ou arestas. No entanto, rótulos e propriedades com o mesmo nome precisam seguir estas regras:

  • Propriedades com o mesmo nome usam o mesmo tipo de valor.
  • Rótulos com o mesmo nome expõem a mesma lista de propriedades.

No exemplo anterior, o rótulo Entity é definido nos nós Person e Account. As duas definições incluem o mesmo conjunto de nomes de propriedades [id, name] com tipos de valor idênticos.

Dependências entre gráficos e outros objetos de esquema

O gráfico criado por CREATE PROPERTY GRAPH depende de outros objetos de esquema, como as tabelas de entrada das definições de nó e aresta e as colunas de tabela referenciadas pelas propriedades. O Spanner Graph não permite uma mudança de esquema que interrompa uma dessas dependências.

A instrução a seguir torna FinGraph dependente da tabela Account e das colunas id e create_time.

CREATE OR REPLACE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Account PROPERTIES (id, create_time)
  );

Neste exemplo, o Spanner Graph não permite as seguintes mudanças de esquema:

No entanto, é possível fazer as seguintes mudanças no esquema:

  • Modifique o esquema da tabela Account e das colunas id e create_time se outros requisitos de esquema permitirem. Para mais informações, consulte Fazer atualizações de esquema.

Ver uma visualização de esquema

É possível ver uma visualização de esquema no Spanner Studio depois de executar uma consulta do Spanner Graph. Para mais informações, consulte Trabalhar com visualizações do Spanner Graph.

Gerenciar dados sem esquema

O Spanner Graph também oferece suporte ao gerenciamento de dados sem esquema, o que é útil quando você precisa de uma definição de gráfico mais flexível. Para mais informações, consulte Gerenciar dados sem esquema no Spanner Graph.

A seguir