Présentation du schéma Spanner Graph

Spanner Graph vous permet de modéliser les données connectées sous forme de graphique de propriétés qui représente les informations sous forme de réseau de nœuds et d'arêtes. Les nœuds symbolisent les entités et les arêtes montrent les connexions entre elles. Les nœuds et les arêtes incluent des libellés qui classent 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.

Vous définissez un schéma Spanner Graph en mappant les lignes des tables d'entrée aux nœuds et aux arêtes du graphique. Personnalisez les libellés et les propriétés des nœuds et des arêtes, et comprenez l'incidence des modifications de schéma sur les dépendances du graphique. Vous pouvez également gérer les données sans schéma pour des définitions de graphiques plus flexibles.

Pour en savoir plus sur Spanner Graph, consultez la présentation de Spanner Graph.

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

Un graphique de propriétés vous permet de modéliser des données connectées. Il représente les 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, comme les clients, les produits ou les 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 : classifiez les types de nœuds et d'arêtes. Si vous ne définissez pas explicitement de libellé pour un nœud ou un bord, Spanner Graph utilise le nom de la table d'entrée comme libellé par défaut. Par exemple, Account peut être une étiquette.

  • Propriétés : utilisées pour 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 concevoir un graphique pour modéliser des activités financières. Ce graphique inclut les types d'entités suivants modélisés en tant que nœuds :

  • Personne : représente une personne impliquée dans des transactions financières.
  • Compte : 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 orientées suivantes :

  • Propriétaire : une personne est propriétaire d'un ou plusieurs comptes.
  • Transferts : l'argent est transféré d'un compte à un autre.

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

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

Figure 1 : Exemple de graphique avec plusieurs nœuds et arêtes orienté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 orientées et non orientées

L'exemple de graphique 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 orientées et représentent une connexion réciproque sans origine ni point de terminaison distincts. Dans ce cas, vous pouvez modéliser les arêtes non orientées comme deux arêtes orientées, une dans chaque direction.

Conception de schéma Spanner Graph

Spanner Graph vous permet d'utiliser l'instruction CREATE PROPERTY GRAPH pour créer un graphique à partir de tables. Les tables qui créent des graphiques sont appelées tables d'entrée. Cette approche utilise SQL/PGQ (Property Graph Queries), qui fait partie des normes SQL:2023.

Définir un nœud à partir d'un tableau

Pour définir un nœud, ajoutez une définition de nœud dans la clause NODE TABLES. La forme la plus simple de définition de nœud ne contient qu'un nom de table d'entrée. Spanner Graph mappe les lignes de la table d'entrée aux nœuds du graphique.

Dans l'exemple suivant, vous utilisez la clause NODE TABLES pour définir le nœud Account dans le graphique 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 des propriétés [id, create_time] provenant des colonnes du tableau Account.

Clé de l'é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 graphique.

  • 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.

  • Le nœud Account utilise par défaut la clé primaire de la table Account comme clé d'élément.
  • Le nœud Person, quant à lui, spécifie explicitement 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
  );

Associer une ligne du tableau d'entrée à un nœud du graphique

  • Chaque ligne avec une clé d'élément non nulle correspond à un nœud unique dans le graphique, identifié par la clé d'élément.
  • Les lignes dont la clé d'élément est nulle sont ignorées.

Définir un bord à partir d'un tableau

Pour définir un bord, ajoutez une définition de bord 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 aux arêtes du graphique.

Références aux nœuds source et de destination

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

  • Nœuds Person et Account
  • bord 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 du nœud source et de destination à l'aide des clauses SOURCE KEY, DESTINATION KEY et REFERENCES. L'exemple suivant utilise la définition de périphérie PersonOwnAccount pour illustrer ce concept :

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

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

  • Le nœud source d'un bord est un nœud Person dont le id est identique au id du bord.
  • Le nœud de destination d'un bord est un nœud Account dont le id est identique au account_id du bord.

De plus, les informations suivantes s'appliquent à 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.

Associer une ligne d'un tableau d'entrée d'arêtes à des arêtes du graphique

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

Définir des nœuds et des arêtes dans un même tableau

Vous pouvez définir un nœud et ses arêtes entrantes ou sortantes dans une même 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 la nécessité d'une jointure à une table de périphérie distincte.

Par exemple, si le tableau Account suivant 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 à un tableau 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 Owns entrante. Ceci est illustré dans l'instruction CREATE PROPERTY GRAPH suivante. Dans la clause EDGE TABLES, vous attribuez l'alias Owns à la table Account. En effet, chaque élément du schéma de graphique 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 clauses 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 graphique, 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œuds ou d'arêtes. 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 graphiques et les autres objets de schéma

Le graphique 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œuds et d'arêtes, et les colonnes de table référencées par les propriétés. Spanner Graph n'autorise pas les modifications de schéma qui rompent 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 Mettre à jour le schéma.

Afficher une visualisation du schéma

Vous pouvez afficher une visualisation du 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 graphique plus flexible. Pour en savoir plus, consultez Gérer les données sans schéma dans Spanner Graph.

Étapes suivantes