Architecture de SQL Graph
S’applique à : SQL Server 2017 (14.x) et versions ultérieures d’Azure SQL Database Azure SQL Managed Instance SQL database dans Microsoft Fabric
Découvrez l’architecture de SQL Graph. Connaître les 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 graphique est une collection de tables de nœud et de bord. 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 graphique logique. Une table de nœuds est une collection de nœuds similaires. Par exemple, une Person
table de nœuds contient tous les Person
nœuds appartenant à un graphique. De même, une table de bords est une collection de types similaires de bords. Par exemple, une Friends
table de bord contient tous les bords qui se connectent à 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.
Table de nœuds
Une table de nœuds représente une entité dans un schéma de graphe. Chaque fois qu’une table de nœuds est créée, ainsi que 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 contenues $node_id
sont générées automatiquement et sont une combinaison d’ID d’objet pour la table graphique de cette table de nœuds et d’une valeur bigint 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. $node_id
Il s’agit également d’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 $node_id_<unique suffix>
la forme .
Remarque
L’utilisation des pseudo-colonnes dans les requêtes est la seule méthode prise en charge et recommandée 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 affichée dans les pseudo-colonnes est un détail d’implémentation. Vous ne devez pas prendre de 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
celui-ci doit être évité. Ces comparaisons ont tendance à être inefficaces, en raison de la conversion vers la représentation JSON. Au lieu de cela, reposez sur la fonction MATCH autant que possible.
Il est recommandé que les utilisateurs créent une contrainte ou un index unique sur la $node_id
colonne au moment de la création d’une table de nœuds, mais s’il n’en est pas créé, 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 apparaît sur la colonne interne graph_id_<hex_string>
.
Tableau de bord
Une table de bord représente une relation dans un graphique. Les arêtes sont toujours dirigées et connectent deux nœuds. Une table de bord 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 edge. Chaque fois qu’une table de bord est créée, ainsi que les colonnes définies par l’utilisateur, trois colonnes implicites sont créées dans la table de bord :
Nom de colonne | Description |
---|---|
$edge_id |
Identifie de manière unique un bord 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 de bord et d’une valeur bigint 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 s’affiche sous $edge_id_<unique suffix> la forme . L’utilisation de noms pseudo-colonnes dans les requêtes est la méthode recommandée pour interroger la colonne interne $edge_id et utiliser un nom interne avec une chaîne hexadécimal doit être évitée. |
$from_id |
Stocke le $node_id nœud, à partir duquel provient le bord. |
$to_id |
Stocke le $node_id nœud, auquel se termine le bord. |
Les nœuds auxquels un bord donné peut se connecter sont contrôlés par les données insérées dans les colonnes et $to_id
les $from_id
colonnes. Dans la première version, il n’est pas possible de définir des contraintes sur la table de périphérie, pour la restreindre de la connexion de deux types de nœuds. Autrement dit, un bord peut connecter deux nœuds dans le graphique, quel que soit leur type.
Comme pour la $node_id
colonne, il est recommandé que les utilisateurs créent un index unique ou une contrainte sur la $edge_id
colonne au moment de la création de la table de bord, mais si l’un n’est pas créé, 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 apparaît 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 ($from_id
, $to_id
) colonnes, pour des recherches plus rapides dans la direction 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.
Métadonnées
Utilisez ces vues de métadonnées pour afficher 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
la valeur est 1, la table est une table de nœuds et si is_edge
elle est définie sur 1, la table est une table de bord.
Nom de la colonne | Type de données | Description |
---|---|---|
is_node | bit | Pour les tables de nœuds, is_node la valeur est 1. |
is_edge | bit | Pour les tables de périphérie, is_edge la valeur est 1. |
sys.columns
Les graph_type
colonnes et graph_type_desc
les colonnes de la sys.columns
vue sont utiles pour comprendre les différents types de colonnes utilisés dans les tableaux de nœud de graphe et de bord :
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 la 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 externe de caractère de l’ID de nœud. |
Les colonnes implicites d’une table de bord 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 de caractère de l’ID de bord. |
from_obj_id_\<hex_string> |
INT | 1 | Valeur interne object_id pour le « à partir du nœud ». |
from_id_\<hex_string> |
BIGINT | 1 | Valeur d’ID de graphique interne pour le « à partir du nœud ». |
$from_id_\<hex_string> |
NVARCHAR | 0 | représentation de caractères du « à partir du nœud ». |
to_obj_id_\<hex_string> |
INT | 1 | Interne object_id pour le « nœud à 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 externe de caractère 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 de la table de graphiques d’un node_id . |
GRAPH_ID_FROM_NODE_ID | Extrayez la valeur d’ID de graphique d’un node_id . |
NODE_ID_FROM_PARTS | Construisez un node_id à partir d’un ID d’objet pour la table de graphiques et une valeur d’ID de graphique. |
OBJECT_ID_FROM_EDGE_ID | Extraire l’ID d’objet de la table de graphe à partir de edge_id . |
GRAPH_ID_FROM_EDGE_ID | Extrayez la valeur d’ID du graphique pour un élément donné edge_id . |
EDGE_ID_FROM_PARTS | Construire edge_id à partir de l’ID d’objet pour la table de graphiques et la valeur d’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 de graphe. Les extensions de langage de requête permettent d’interroger et de parcourir le graphique à l’aide de la syntaxe d’art 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 désormais étendu pour prendre en charge la création d’une table AS NODE ou AS EDGE. Une table edge n’est pas nécessaire pour avoir des attributs définis par l’utilisateur. |
ALTER TABLE | ALTER TABLE (Transact-SQL) | Les tables de nœud et de périphérie 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 des colonnes de graphe internes, comme $node_id ou $edge_id , entraîne 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œud et de périphérie. Tous les types d’index sont pris en charge, notamment les index columnstore cluster et non cluster. |
CRÉER DES CONTRAINTES EDGE | CONTRAINTES EDGE (Transact-SQL) | Les utilisateurs peuvent désormais créer des contraintes de périphérie sur des tables de périphérie pour appliquer une sémantique spécifique et maintenir également l’intégrité des données |
DROP TABLE | DROP TABLE (Transact-SQL) | Les tables de nœud et de périphérie peuvent être supprimées de la même façon qu’une table relationnelle, à l’aide du 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. Il n’existe aucune prise en charge de la suppression en cascade des arêtes, 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 la colonne sont générées automatiquement. La tentative d’insertion d’une valeur dans $node_id ou $edge_id d’une colonne entraîne une erreur. Les utilisateurs doivent fournir des valeurs pour $from_id et $to_id des colonnes lors de l’insertion dans une table de bord. $from_id et $to_id sont les $node_id valeurs des nœuds qu’un bord donné se connecte. |
DELETE | DELETE (Transact-SQL) | Les données des tables de nœud ou de périphérie peuvent être supprimées de la même façon que celles des tables relationnelles. Toutefois, dans cette version, il n’existe aucune contrainte pour s’assurer qu’aucun bord ne pointe vers un nœud supprimé et qu’une suppression en cascade des arêtes n’est pas prise en charge lors de la suppression d’un nœud. Il est recommandé que chaque fois qu’un nœud est supprimé, tous les bords de connexion à ce nœud sont également supprimés. |
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 et $edge_id $from_id $to_id . |
MERGE | MERGE (Transact-SQL) | MERGE l’instruction est prise en charge sur un nœud ou une table de périphérie. |
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) | La fonctionnalité MATCH intégrée est introduite pour prendre en charge la mise en correspondance des modèles et la traversée par 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 nœud ou table 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 optimisées en mémoire.
- Les utilisateurs ne peuvent pas mettre à jour les colonnes d’un
$to_id
bord à l’aide de l’instruction$from_id
UPDATE. Pour mettre à jour les nœuds référencés par un bord, 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 graphiques ne sont pas prises en charge.
- Les pseudo-colonnes de graphe (
node_id
etedge_id
$from_id
$to_id
) ne peuvent pas être utilisées comme colonnes de tri pour un index columnstore cluster ordonné. Toute tentative d’utilisation de pseudo-colonnes de graphe comme colonnes de tri pour columnstore en cluster ordonné entraîne uneMsg 102: Incorrect syntax
erreur. - Dans la base de données SQL Fabric, SQL Graph est autorisé, mais les tables Node et Edge ne sont pas mises en miroir sur Fabric OneLake.
Voir aussi
Étapes suivantes
- Pour bien démarrer avec SQL Graph, consultez SQL Graph Database - Exemple