Bonnes pratiques pour le schéma de graphe

Ce document présente les bonnes pratiques à adopter pour définir votre schéma de graphe afin d'améliorer les performances de vos requêtes de graphe.

Définir la portée de vos définitions de propriétés

Les propriétés sont des paires clé/valeur qui fournissent des informations supplémentaires associées à des nœuds ou à des arêtes. Nous vous recommandons de n'inclure que les propriétés nécessaires dans les nœuds ou les arêtes, et d'éviter d'utiliser la syntaxe PROPERTIES ALL COLUMNS ou la syntaxe par défaut qui associe toutes les colonnes des tables de nœuds ou d'arêtes à la liste de propriétés. Un grand nombre de propriétés dans les nœuds ou les arêtes peut entraîner des analyses de colonnes inutiles dans les requêtes de graphe, ce qui dégrade les performances.

Pour limiter les propriétés que vous incluez dans une définition de nœud ou d'arête, utilisez le mot clé PROPERTIES lorsque vous définissez des propriétés d'élément dans votre instruction CREATE PROPERTY GRAPH.

La définition de table de nœuds suivante limite les propriétés de la table de nœuds Person à id et name :

NODE TABLES (
  graph_db.Person PROPERTIES (id, name)
)

Définir des contraintes de clé primaire et de clé étrangère sur les nœuds et les arêtes du graphe

BigQuery peut utiliser des contraintes de clé primaire et de clé étrangère sur vos tables de nœuds et d'arêtes pour optimiser vos requêtes de graphe en réduisant les analyses de tables inutiles. Toutefois, BigQuery n'applique pas de contraintes de clé primaire ni de clé étrangère aux tables. Si votre application ne peut pas garantir l'intégrité référentielle ni l'unicité des clés primaires, l'utilisation de clés primaires ou étrangères pour l'optimisation des requêtes peut entraîner des résultats de requête incorrects.

L'exemple suivant définit des contraintes de clé primaire et de clé étrangère sur les tables de nœuds Person et Account, et sur la table d'arêtes PersonOwnAccount :

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

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

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

Étape suivante