Architecture de SQL Graph

S’applique à : SQL Server 2017 (14.x) et versions ultérieures Azure SQL DatabaseAzure SQL Managed Instance

Découvrez l’architecture de SQL Graph. La connaissance des principes de base facilite la compréhension d’autres articles SQL Graph.

Base de données SQL Graph

Les utilisateurs peuvent créer un graphique par base de données. Un graphe est une collection de tables de nœuds et d’arêtes. Les tables de nœud ou de périphérie peuvent être créées sous n’importe quel schéma de la base de données, mais elles appartiennent toutes à un seul graphe logique. Une table de nœuds est une collection de types de nœuds similaires. Par exemple, une Person table de nœuds contient tous les Person nœuds appartenant à un graphe. De même, une table de bords est une collection de types similaires d’arêtes. Par exemple, une table d’arêtes Friends contient tous les bords qui relient un à un Person autre Person. Étant donné que les nœuds et les arêtes sont stockés dans des tables, la plupart des opérations prises en charge sur les tables régulières sont prises en charge sur les tables de nœud ou de périphérie.

Le diagramme suivant montre l’architecture de base de données SQL Graph.

Diagramme montrant l’architecture de base de données SQL Graph.

Table node

Une table de nœud représente une entité dans un schéma de graphe. Chaque fois qu’une table de nœud est créée, avec les colonnes définies par l’utilisateur, une colonne implicite $node_id est créée, qui identifie de manière unique un nœud donné dans la base de données. Les valeurs dans $node_id sont générées automatiquement et sont une combinaison d’ID d’objet pour la table de graphe de cette table de nœud et d’une valeur biginte générée en interne. Toutefois, lorsque la $node_id colonne est sélectionnée, une valeur calculée sous la forme d’une chaîne JSON s’affiche. En outre, $node_id est une pseudo-colonne qui correspond à un nom interne avec un suffixe unique. Lorsque vous sélectionnez la $node_id pseudo-colonne dans la table, le nom de la colonne apparaît sous la forme $node_id_<unique suffix>.

Notes

L’utilisation des pseudo-colonnes dans les requêtes est le seul moyen pris en charge et recommandé d’interroger la colonne interne $node_id . Vous ne devez pas utiliser directement les $node_id_<hex_string> colonnes dans les requêtes. En outre, la représentation JSON calculée indiquée dans les pseudo-colonnes est un détail d’implémentation. Vous ne devez pas prendre une dépendance directe sur le format de cette représentation JSON. Si vous devez traiter cette représentation JSON, envisagez d’utiliser la NODE_ID_FROM_PARTS() et d’autres fonctions système associées. Il n’est pas recommandé d’utiliser directement les pseudo-colonnes de graphe ($node_id, $from_id, $to_id) dans les prédicats. Par exemple, un prédicat comme n.$node_id = e.$from_id doit être évité. De telles comparaisons ont tendance à être inefficaces, en raison de la conversion en représentation JSON. Au lieu de cela, appuyez-vous autant que possible sur la fonction MATCH.

Il est recommandé aux utilisateurs de créer une contrainte ou un index unique sur la $node_id colonne au moment de la création de la table de nœud, mais si elle n’en est pas créée, un index unique et non cluster par défaut est automatiquement créé. Toutefois, tout index d’une pseudo-colonne de graphe est créé sur les colonnes internes sous-jacentes. Autrement dit, un index créé sur la $node_id colonne s’affiche sur la colonne interne graph_id_<hex_string> .

Table Edge

Une table d’arêtes représente une relation dans un graphique. Les bords sont toujours dirigés et connectent deux nœuds. Une table de périphérie permet aux utilisateurs de modéliser des relations plusieurs-à-plusieurs dans le graphique. Les colonnes définies par l’utilisateur (« attributs ») sont facultatives dans une table de périphérie. Chaque fois qu’une table de périphérie est créée, ainsi que les colonnes définies par l’utilisateur, trois colonnes implicites sont créées dans la table de périphérie :

Nom de la colonne Description
$edge_id Identifie de manière unique un edge donné dans la base de données. Il s’agit d’une colonne générée et la valeur est une combinaison de object_id de la table edge et d’une valeur biginte générée en interne. Toutefois, lorsque la $edge_id colonne est sélectionnée, une valeur calculée sous la forme d’une chaîne JSON s’affiche. $edge_id est une pseudo-colonne qui correspond à un nom interne avec un suffixe unique. Lorsque vous sélectionnez $edge_id dans la table, le nom de la colonne apparaît sous la forme $edge_id_<unique suffix>. L’utilisation de noms de pseudo-colonnes dans les requêtes est la méthode recommandée pour interroger la colonne interne $edge_id et éviter d’utiliser un nom interne avec une chaîne hexadécimale.
$from_id Stocke le $node_id du nœud, d’où provient l’arête.
$to_id Stocke le $node_id du nœud, auquel l’arête se termine.

Les nœuds auxquels une périphérie donnée peut se connecter sont contrôlés par les données insérées dans les $from_id colonnes et $to_id . Dans la première version, il n’est pas possible de définir des contraintes sur la table edge, afin de la limiter à la connexion de deux types de nœuds. Autrement dit, une arête peut connecter n’importe quel nœud dans le graphe, quel que soit leur type.

Comme pour la $node_id colonne, il est recommandé aux utilisateurs de créer un index ou une contrainte unique sur la $edge_id colonne au moment de la création de la table de périphérie, mais si elle n’en est pas créée, un index unique et non cluster par défaut est automatiquement créé sur cette colonne. Toutefois, tout index d’une pseudo-colonne de graphe est créé sur les colonnes internes sous-jacentes. Autrement dit, un index créé sur la $edge_id colonne s’affiche sur la colonne interne graph_id_<unique suffix> . Il est également recommandé, pour les scénarios OLTP, que les utilisateurs créent un index sur les colonnes ($from_id, $to_id) pour des recherches plus rapides dans le sens de la périphérie.

Le diagramme suivant montre comment les tables de nœud et de périphérie sont stockées dans la base de données.

Diagramme montrant la représentation de la table nœud et arête.

Métadonnées

Utilisez ces vues de métadonnées pour voir les attributs d’un nœud ou d’une table de périphérie.

sys.tables

Les colonnes suivantes bit dans sys.tables peuvent être utilisées pour identifier les tables de graphe. Si is_node est défini sur 1, la table est une table de nœud et si is_edge a la valeur 1, la table est une table edge.

Nom de la colonne Type de données Description
is_node bit Pour les tables de nœuds, is_node est défini sur 1.
is_edge bit Pour les tables de périphérie, is_edge est défini sur 1.

sys.columns

Les graph_type colonnes et graph_type_desc de la sys.columns vue sont utiles pour comprendre les différents types de colonnes utilisées dans les tables de nœuds et de bord de graphe :

Nom de la colonne Type de données Description
graph_type int Colonne interne avec un ensemble de valeurs. Les valeurs sont comprises entre 1 et 8 pour les colonnes de graphiques et NULL pour d’autres.
graph_type_desc nvarchar(60) Colonne interne avec un ensemble de valeurs.

Le tableau suivant répertorie les valeurs valides pour graph_type la colonne :

Valeur de colonne Description
1 GRAPH_ID
2 GRAPH_ID_COMPUTED
3 GRAPH_FROM_ID
4 GRAPH_FROM_OBJ_ID
5 GRAPH_FROM_ID_COMPUTED
6 GRAPH_TO_ID
7 GRAPH_TO_OBJ_ID
8 GRAPH_TO_ID_COMPUTED

sys.columns stocke également des informations sur les colonnes implicites créées dans des tables de nœud ou de périphérie. Les informations suivantes peuvent être récupérées à partir de sys.columns, mais les utilisateurs ne peuvent pas sélectionner ces colonnes à partir d’un nœud ou d’une table de périphérie.

Les colonnes implicites d’une table de nœuds sont les suivantes :

Nom de la colonne Type de données is_hidden Commentaire
graph_id_\<hex_string> bigint 1 Valeur d’ID de graphique interne.
$node_id_\<hex_string> NVARCHAR 0 Représentation de caractères externe de l’ID de nœud.

Les colonnes implicites d’une table edge sont les suivantes :

Nom de la colonne Type de données is_hidden Commentaire
graph_id_\<hex_string> bigint 1 Valeur d’ID de graphique interne.
$edge_id_\<hex_string> NVARCHAR 0 Représentation en caractères de l’ID d’arête.
from_obj_id_\<hex_string> INT 1 Valeur interne object_id pour le nœud « from ».
from_id_\<hex_string> bigint 1 Valeur d’ID de graphique interne pour le nœud « from ».
$from_id_\<hex_string> NVARCHAR 0 représentation en caractères du nœud « from ».
to_obj_id_\<hex_string> INT 1 Interne object_id pour le « nœud à ».
to_id_\<hex_string> bigint 1 Valeur d’ID de graphique interne pour le « nœud à ».
$to_id_\<hex_string> NVARCHAR 0 Représentation de caractères externe du « à nœud ».

Fonctions système

Vous pouvez utiliser les fonctions intégrées suivantes pour interagir avec les pseudo-colonnes dans les tables de graphiques. Des références détaillées sont fournies pour chacune de ces fonctions dans les références de fonction T-SQL respectives.

Intégré Description
OBJECT_ID_FROM_NODE_ID Extrayez l’ID d’objet pour la table de graphe à partir d’un node_id.
GRAPH_ID_FROM_NODE_ID Extrayez la valeur de l’ID de graphe d’un node_id.
NODE_ID_FROM_PARTS Construisez un node_id à partir d’un ID d’objet pour la table de graphe et d’une valeur d’ID de graphique.
OBJECT_ID_FROM_EDGE_ID Extrayez l’ID d’objet pour la table de graphe à partir de edge_id.
GRAPH_ID_FROM_EDGE_ID Extrayez la valeur d’ID de graphe pour un donné edge_id.
EDGE_ID_FROM_PARTS Construire edge_id à partir de l’ID d’objet pour la table de graphe et la valeur de l’ID de graphique.

Informations de référence sur Transact-SQL

Découvrez les extensions Transact-SQL introduites dans SQL Server et Azure SQL Database qui permettent de créer et d’interroger des objets graphiques. Les extensions de langage de requête permettent d’interroger et de parcourir le graphe à l’aide de la syntaxe d’illustration ASCII.

Instructions du langage de définition de données (DDL)

Tâche Article connexe Notes
CREATE TABLE CREATE TABLE (Transact-SQL) CREATE TABLE est maintenant étendu pour prendre en charge la création d’une table AS NODE ou AS EDGE. Une table edge peut avoir ou non des attributs définis par l’utilisateur.
ALTER TABLE ALTER TABLE (Transact-SQL) Les tables de nœuds et d’arêtes peuvent être modifiées de la même façon qu’une table relationnelle à l’aide de ALTER TABLE. Les utilisateurs peuvent ajouter ou modifier des colonnes, des index ou des contraintes définis par l’utilisateur. Toutefois, la modification de colonnes de graphe internes, telles que $node_id ou $edge_id, génère une erreur.
CREATE INDEX CREATE INDEX (Transact-SQL) Les utilisateurs peuvent créer des index sur des pseudo-colonnes et des colonnes définies par l’utilisateur dans des tables de nœuds et de périphérie. Tous les types d’index sont pris en charge, y compris les index columnstore cluster et non cluster.
CRÉER DES CONTRAINTES D’ARÊTE CONTRAINTES EDGE (Transact-SQL) Les utilisateurs peuvent désormais créer des contraintes d’arête sur des tables de périphérie pour appliquer une sémantique spécifique et maintenir l’intégrité des données
DROP TABLE DROP TABLE (Transact-SQL) Les tables de nœuds et d’arêtes peuvent être supprimées de la même façon qu’une table relationnelle à l’aide de DROP TABLE. Actuellement, il n’existe aucun mécanisme pour empêcher la suppression de nœuds, qui sont référencés par des arêtes. La suppression en cascade des arêtes n’est pas prise en charge lors de la suppression d’un nœud (ou de la suppression de la table de nœuds entière). Dans tous ces cas, tous les bords connectés aux nœuds supprimés doivent être supprimés manuellement pour maintenir la cohérence du graphique.

Instructions du langage de manipulation de données

Tâche Article connexe Notes
INSERT INSERT (Transact-SQL) L’insertion dans une table de nœuds n’est pas différente de l’insertion dans une table relationnelle. Les valeurs de $node_id colonne sont générées automatiquement. La tentative d’insertion d’une valeur dans ou dans $node_id une $edge_id colonne entraîne une erreur. Les utilisateurs doivent fournir des valeurs pour $from_id les colonnes et $to_id lors de l’insertion dans une table de périphérie. $from_id et $to_id sont les $node_id valeurs des nœuds qu’un bord donné connecte.
Suppression DELETE (Transact-SQL) Les données des tables de nœud ou de périphérie peuvent être supprimées de la même manière qu’elles sont supprimées des tables relationnelles. Toutefois, dans cette version, aucune contrainte ne permet de s’assurer qu’aucune arête ne pointe vers un nœud supprimé et que la suppression en cascade des arêtes n’est pas prise en charge lors de la suppression d’un nœud. Il est recommandé de supprimer tous les bords de connexion à ce nœud chaque fois qu’un nœud est supprimé.
UPDATE UPDATE (Transact-SQL) Les valeurs des colonnes définies par l’utilisateur peuvent être mises à jour à l’aide de l’instruction UPDATE. Vous ne pouvez pas mettre à jour les colonnes de graphe internes, $node_id, $edge_id$from_id et $to_id.
MERGE MERGE (Transact-SQL) MERGE l’instruction est prise en charge sur un nœud ou une table edge.

Instructions de requête

Tâche Article connexe Notes
SELECT SELECT (Transact-SQL) Étant donné que les nœuds et les arêtes sont stockés en tant que tables, la plupart des opérations de table sont également prises en charge sur les tables de nœud et de périphérie.
MATCH MATCH (Transact-SQL) MATCH intégré est introduit pour prendre en charge la correspondance de modèles et la traversée via le graphique.

Limites

Il existe certaines limitations sur les tables de nœud et de périphérie :

  • Les tables temporaires locales ou globales ne peuvent pas être des tables de nœud ou de périphérie.
  • Les types de tables et les variables de table ne peuvent pas être déclarés en tant que table de nœud ou de périphérie.
  • Les tables de nœud et de périphérie ne peuvent pas être créées en tant que tables temporelles avec version système.
  • Les tables de nœud et de périphérie ne peuvent pas être des tables à mémoire optimisée.
  • Les utilisateurs ne peuvent pas mettre à jour les colonnes et $to_id d’une périphérie à l’aide $from_id de l’instruction UPDATE. Pour mettre à jour les nœuds référencés par une arête, les utilisateurs doivent insérer un nouveau bord pointant vers de nouveaux nœuds et supprimer le précédent.
  • Les requêtes inter-bases de données sur les objets graphe ne sont pas prises en charge.

Voir aussi

Étapes suivantes