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,
Accountpeut être une étiquette.Propriétés : utilisées pour décrire les nœuds et les arêtes. Par exemple, un nœud
Personpeut avoir une propriéténameavec la valeurAlexet une propriétéidavec la valeur1.
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.
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 tableauAccount.
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
KEYpour 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
Accountutilise par défaut la clé primaire de la tableAccountcomme clé d'élément. - Le nœud
Person, quant à lui, spécifie explicitementidcomme clé d'élément avec la clauseKEY.
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.
Le libellé et les propriétés par défaut des arêtes sont définis de la même manière que les nœuds.
La clé d'élément de chaque bord est définie de la même manière que les nœuds.
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
PersonetAccount - 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
Persondont leidest identique auiddu bord. - Le nœud de destination d'un bord est un nœud
Accountdont leidest identique auaccount_iddu 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é
PersonOwnAccountpar 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
Personutilisent le libelléCustomerpour exposer la propriétéaddress. La propriétéaddressest définie par l'expressionCONCAT(city, ", ", country),qui fait référence aux colonnescityetcountryde la table d'entréePerson. - Pour
Account, le nœudAccountutilise le libelléAccountpour exposer les propriétésidetcreate_time. PersonetAccountont le libelléEntityavec les propriétés [id, name].- Pour
Person, les propriétésidetnameproviennent des colonnes de la table d'entrée. - Pour
Account, la propriéténamefait référence à la colonnenick_namede la table d'entrée.
- Pour
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 :
- Vous ne pouvez pas supprimer la table
Account. Pour ce faire, vous devez supprimer la définition du nœudAccount. Pour en savoir plus, consultez Supprimer des définitions de nœuds ou d'arêtes existantes. - Vous ne pouvez pas supprimer les colonnes
create_timede la tableAccount. Pour ce faire, vous devez supprimer la propriétécreate_timede la définition du nœudAccount. Pour en savoir plus, consultez Mettre à jour les définitions de nœuds ou d'arêtes existantes.
Toutefois, vous pouvez apporter les modifications de schéma suivantes :
- Modifiez le schéma de la table
Accountet des colonnesidetcreate_timesi 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
- Créez un schéma Spanner Graph.
- Mettre à jour ou supprimer un schéma Spanner Graph
- Gérez les données sans schéma avec Spanner Graph.