Présentation du schéma Spanner Graph

Spanner Graph vous permet de modéliser des données connectées sous forme de graphe de propriétés qui représente des informations sous forme de réseau de nœuds et d'arêtes. Les nœuds symbolisent des entités, et les arêtes montrent les connexions entre elles. Les nœuds et les arêtes incluent des libellés qui classifient les types de nœuds et d'arêtes. Les nœuds et les arêtes incluent également des propriétés qui les décrivent.

Ce document explique comment définir un schéma Spanner Graph en mappant les lignes de tables sur les nœuds et les arêtes du graphe. Vous apprendrez également à personnaliser les libellés et les propriétés des nœuds et des arêtes et à utiliser les dépendances des objets de graphe et de schéma.

Si vous souhaitez des définitions de graphe plus flexibles, consultez Gérer les données sans schéma. Si vous souhaitez découvrir comment utiliser des vues SQL au lieu de tables pour définir des nœuds et des arêtes, consultez Présentation des graphes créés à partir de vues SQL. Pour en savoir plus sur Spanner Graph, consultez la présentation de Spanner Graph.

Comprendre le modèle de données de graphe de propriétés

Un graphe de propriétés vous permet de modéliser des données connectées. Il représente des informations sous forme de réseau de nœuds et d'arêtes. Les nœuds symbolisent des entités dans votre paysage de données, telles que des clients, des produits ou des lieux. Les arêtes montrent les connexions entre ces nœuds, capturant des relations telles que "acheté", "suit" ou "situé dans".

Les nœuds et les arêtes peuvent inclure les informations suivantes :

  • Libellés : classifient les nœuds et les types d'arêtes. Si vous ne définissez pas explicitement de libellé pour un nœud ou une arête, Spanner Graph utilise le nom de la table d'entrée comme libellé par défaut. Par exemple, Account peut être un libellé.

  • Propriétés : permettent de décrire les nœuds et les arêtes. Par exemple, un nœud Person peut avoir une propriété name avec la valeur Alex et une propriété id avec la valeur 1.

L'exemple de la figure 1 montre comment vous pouvez concevoir un graphe pour modéliser des activités financières. Ce graphe inclut les types d'entités suivants modélisés en tant que nœuds :

  • Person : représente une personne impliquée dans des transactions financières.
  • Account : représente un compte bancaire utilisé pour les transactions.

Ces entités sont connectées par différents types de relations, qui sont représentées par les arêtes dirigées suivantes :

  • Owns : une personne possède un ou plusieurs comptes.
  • Transfers : l'argent passe d'un compte à un autre.

Chaque arête dirigée indique une relation unidirectionnelle qui va d'un nœud source à un nœud de destination. Par exemple, une arête Transfers connecte un Account source à un Account de destination, indiquant le flux d'argent.

Diagramme de présentation du schéma Spanner Graph.

Figure 1 : Exemple de graphe avec plusieurs nœuds et arêtes dirigées.

Les nœuds et les arêtes incluent des informations supplémentaires dans les propriétés.

  • Les nœuds Person incluent les propriétés suivantes :
    • name (STRING)
    • id (INT64)
  • Les arêtes Transfers incluent la propriété suivante :
    • amount (FLOAT64)

Arêtes dirigées et non dirigées

L'exemple de graphe utilise des arêtes dirigées qui indiquent une direction spécifique dans la relation entre les entités. Toutefois, certaines relations, comme la relation ami dans un réseau social, ne sont pas dirigées et représentent une connexion réciproque sans origine ni point de terminaison distincts. Dans ce cas, vous pouvez modéliser des arêtes non dirigées comme deux arêtes dirigées, une dans chaque direction.

Conception de schéma Spanner Graph

Dans Spanner Graph, vous utilisez l' instruction CREATE PROPERTY GRAPH pour créer un graphe à partir de tables ou de vues SQL. Les tables utilisées pour créer des graphes sont appelées tables d'entrée. Ce document vous explique comment utiliser des tables pour créer un graphe. Pour en savoir plus sur l'utilisation des vues SQL, consultez Créer un graphe Spanner à partir d'une vue SQL.

Définir un nœud à partir d'une table

Pour définir un nœud, ajoutez une définition de nœud dans la clause NODE TABLES. La forme la plus simple d'une définition de nœud contient le nom d'une table d'entrée qui a défini des références de nœud source et de destination. Spanner Graph mappe les lignes de la table d'entrée sur les nœuds du graphe.

Dans l'exemple suivant, vous utilisez la clause NODE TABLES pour définir le nœud Account dans le graphe de propriétés FinGraph. La définition du nœud contient la table d'entrée 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
  );

Libellés et propriétés par défaut

En plus d'utiliser le nom de la table d'entrée comme libellé par défaut, Spanner Graph expose toutes les colonnes de la table d'entrée en tant que propriétés de nœud.

Dans l'exemple précédent,

  • chaque nœud de compte utilise le libellé Account ;
  • chaque nœud de compte inclut les propriétés [id, create_time] des colonnes de la table Account.

Clé d'élément

Une définition de nœud définit également la clé d'élément qui identifie de manière unique un nœud de graphe.

  • Par défaut, la clé d'élément est la clé primaire de la table d'entrée.
  • Vous pouvez utiliser la clause KEY pour définir explicitement les clés d'élément.
  • Vous pouvez utiliser des colonnes avec une contrainte d'index unique comme clés d'élément.

L'exemple suivant définit le nœud Account et le nœud Person.

  • Par défaut, le nœud Account utilise la clé primaire de la table Account comme clé d'élément.
  • Le nœud Person, en revanche, spécifie explicitement l'id comme clé d'élément avec la clause 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
  );

Mapper une ligne de la table d'entrée sur un nœud du graphe

  • Chaque ligne avec une clé d'élément non nulle est mappée sur un nœud unique dans le graphe, identifié par la clé d'élément.
  • Les lignes avec une clé d'élément nulle sont ignorées.

Définir une arête à partir d'une table

Pour définir une arête, ajoutez une définition d'arête dans la clause EDGE TABLES. La forme la plus simple de définition d'arête ne contient qu'un nom de table d'entrée. Spanner Graph mappe les lignes de la table d'entrée sur les arêtes du graphe.

Références de nœud source et de destination

Dans l'exemple suivant, vous créez un graphe de propriétés FinGraph avec les éléments suivants :

  • Nœuds Person et Account
  • Arête PersonOwnAccount
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)
  );

Une définition d'arête définit la référence de nœud source et de destination à l'aide des clauses SOURCE KEY, DESTINATION KEY et REFERENCES. L'exemple suivant utilise la définition d'arête de PersonOwnAccount pour illustrer ce concept :

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

Chaque PersonOwnAccount arête connecte un Person (source) à un Account (destination) nœud.

  • Le nœud source d'une arête est un nœud Person où l'id est le même que l'id de l'arête.
  • Le nœud de destination d'une arête est un nœud Account où le id est le même que le account_id de l'arête.

De plus, les éléments suivants sont vrais pour l'arête PersonOwnAccount :

  • La clé d'élément est la clé primaire de la table PersonOwnAccount, à savoir (id, account_id).
  • Chaque arête possède le même ensemble de propriétés que les colonnes de la table PersonOwnAccount.
  • Chaque arête possède le libellé PersonOwnAccount par défaut.

Mapper une ligne d'une table d'entrée d'arête sur des arêtes du graphe

  • Chaque ligne de la table d'entrée d'arête, où la clé d'élément n'est pas nulle, est généralement mappée sur une arête unique dans votre graphe.
  • Une ligne peut correspondre à zéro ou à plusieurs arêtes dans le graphe. Par exemple, cela se produit lorsque la référence du nœud source correspond à zéro ou à plusieurs nœuds dans la table de nœuds sources.

Définir des nœuds et des arêtes dans une seule table

Vous pouvez définir un nœud et ses arêtes entrantes ou sortantes dans une seule table si les colonnes de votre table définissent une relation avec une autre table. Cette approche réduit le nombre de tables, simplifie la gestion des données et peut améliorer les performances des requêtes en éliminant le besoin de jointure à une table d'arêtes distincte.

Par exemple, si la table Account suivante possède une clé primaire composite (owner_id, account_id), la partie owner_id peut être une clé étrangère qui fait référence à une table Person. Cette structure permet à la table Account de représenter à la fois le nœud Account et l'arête entrante du nœud Person.

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

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

Vous pouvez utiliser la table Account pour définir à la fois le nœud Account et son arête entrante Owns. Ceci est illustré dans l'instruction CREATE PROPERTY GRAPH suivante. Dans la clause EDGE TABLES, vous attribuez à la table Account l'alias Owns. En effet, chaque élément du schéma de graphe doit avoir un nom unique.

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

Personnaliser les libellés et les propriétés

Vous pouvez utiliser les LABEL et PROPERTIES pour personnaliser les libellés et les propriétés.

L'exemple suivant définit deux nœuds : Person et Account.

  • Les nœuds Person utilisent le libellé Customer pour exposer la propriété address. La propriété address est définie par l'expression CONCAT(city, ", ", country), qui fait référence aux colonnes city et country de la table d'entrée Person.
  • Pour Account, le nœud Account utilise le libellé Account pour exposer les propriétés id et create_time.
  • Person et Account ont le libellé Entity avec les propriétés [id, name].
    • Pour Person, les propriétés id et name proviennent des colonnes de la table d'entrée.
    • Pour Account, la propriété name fait référence à la colonne nick_name de la table d'entrée.
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)
  );

Cohérence des libellés et des propriétés

Dans un graphe, les libellés et les propriétés sont identifiés de manière unique par leur nom. Vous pouvez utiliser des libellés et des propriétés portant le même nom dans plusieurs définitions de nœud ou d'arête. Toutefois, les libellés et les propriétés portant le même nom doivent respecter les règles suivantes :

  • Les propriétés portant le même nom utilisent le même type de valeur.
  • Les libellés portant le même nom exposent la même liste de propriétés.

Dans l'exemple précédent, le libellé Entity est défini dans les nœuds Person et Account. Les deux définitions incluent le même ensemble de noms de propriétés [id, name] avec des types de valeurs identiques.

Dépendances entre les graphes et les autres objets de schéma

Le graphe créé par CREATE PROPERTY GRAPH dépend d'autres objets de schéma, tels que les tables d'entrée des définitions de nœud et d'arête, ainsi que les colonnes de table référencées par les propriétés. Spanner Graph n'autorise pas de modification de schéma qui rompt l'une de ces dépendances.

L'instruction suivante rend FinGraph dépendant de la table Account et des colonnes id et create_time.

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

Dans cet exemple, Spanner Graph n'autorise pas les modifications de schéma suivantes :

Toutefois, vous pouvez apporter les modifications de schéma suivantes :

  • Modifiez le schéma de la table Account et des colonnes id et create_time si d'autres exigences de schéma le permettent. Pour en savoir plus, consultez Effectuer des mises à jour de schéma.

Afficher une visualisation de schéma

Vous pouvez afficher une visualisation de schéma dans Spanner Studio après avoir exécuté une requête Spanner Graph. Pour en savoir plus, consultez Utiliser les visualisations Spanner Graph.

Gérer les données sans schéma

Spanner Graph est également compatible avec la gestion des données sans schéma, ce qui est utile lorsque vous avez besoin d'une définition de graphe plus flexible. Pour en savoir plus, consultez Gérer les données sans schéma dans Spanner Graph.

Étape suivante