La série jusqu’à présent:

  1. Bases de données Graphiques SQL Server – Partie 1: Introduction
  2. Bases de données Graphiques SQL Server – Partie 2: Interrogation de données dans une Base de données graphiques
  3. Bases de données graphiques SQL Server – Partie 3: Modification de données dans une Base de données Graphiques
  4. Bases de données graphiques SQL Server – Partie 4: Utilisation de données hiérarchiques dans une base de données graphiques
  5. Bases de données graphiques SQL Server – Partie 5: Importation de Données relationnelles dans une base de données graphique

Avec la sortie de SQL Server 2017, Microsoft a ajouté la prise en charge des bases de données graphiques pour mieux gérer les ensembles de données contenant des relations d’entités complexes, telles que le type de données générées par un site de médias sociaux, où vous pouvez avoir un mélange de relations plusieurs à plusieurs qui changent fréquemment. Les bases de données Graphiques utilisent les mêmes structures de tables que les bases de données SQL Server traditionnelles et prennent en charge les mêmes outils et instructions T-SQL, mais elles incluent également des fonctionnalités de stockage et de navigation dans des relations complexes.

Cet article est le premier d’une série sur les bases de données graphiques SQL Server. L’article vous présente les concepts graphiques de base et montre comment créer et remplir des tables de graphiques à l’aide de SQL Server Management Studio (SSMS) et d’une instance locale de SQL Server 2017. Dans les articles à suivre, nous explorerons comment interroger une base de données graphique et modifier ses données, mais pour cet article, nous commençons par les bases.

La base de données graphique SQL Server

Les bases de données graphiques de SQL Server peuvent aider à simplifier le processus de modélisation de données contenant des relations complexes de plusieurs à plusieurs et hiérarchiques. À la base, une base de données de graphes est une collection de nœuds et d’arêtes qui fonctionnent ensemble pour définir différents types de relations. Un nœud est une entité telle qu’une personne ou un emplacement. Un bord est une relation entre deux entités. Par exemple, une relation peut exister entre un lieu tel que Tolède et une personne nommée Chris, qui vit à Tolède. Chris et Toledo sont les entités, et « lives in » est la relation entre les deux.

Une table de nœuds dans SQL Server est une collection d’entités similaires, et une table de périphérie est une collection de relations similaires. Pour aider à comprendre comment cela fonctionne, considérez le modèle graphique illustré dans la figure suivante, qui est basé sur un forum fictif d’amateurs de poissons. Le modèle comprend trois nœuds (FishSpecies, FishLover et FishPost) et trois bords (Likes, Posts et LinksTo).

Les rectangles représentent les nœuds et les flèches reliant les nœuds représentent les bords, les flèches pointant dans la direction de la relation. Par exemple, les bords de Likes peuvent définir l’une des relations suivantes:

  • Un amoureux des poissons aime une espèce de poisson.
  • Un amateur de poissons aime un article sur le poisson.
  • Un amateur de poisson aime un autre amateur de poisson.

Vous pouvez représenter les trois relations sous forme de données dans une seule table de bord dans la base de données de graphiques, chaque relation se trouvant dans sa propre ligne. Une table de nœuds fonctionne de la même manière, sauf qu’elle inclut une ligne pour chaque entité. Vous pouvez également associer des propriétés à la fois aux nœuds et aux arêtes. Une propriété est un attribut clé-valeur qui est défini comme une colonne dans un nœud ou une table de périphérie. Par exemple, le nœud FishSpecies peut inclure des propriétés pour stocker les noms communs et scientifiques de chaque espèce. Les propriétés sont créées sous forme de colonnes définies par l’utilisateur dans la table FishSpecies. Lors de la création d’une table de nœuds, vous devez inclure au moins une propriété.

Pour la plupart des opérations, les tables node et edge fonctionnent comme n’importe quelle autre table définie par l’utilisateur SQL Server. Bien qu’il y ait quelques limitations — telles que ne pas pouvoir déclarer des tables temporaires ou des variables de table en tant que tables de nœuds ou de bords — la plupart du temps, vous constaterez que travailler avec des tables de graphiques sera un territoire familier.

Là où les choses deviennent un peu floues, c’est avec la base de données de graphiques elle-même. Bien que le nom puisse suggérer que vous créez un nouveau type d’objet de base de données, ce n’est pas le cas. Une base de données de graphes est simplement une construction logique définie dans une base de données définie par l’utilisateur, qui ne peut pas prendre en charge plus d’une base de données de graphes. L’existence de la base de données de graphiques est relativement transparente de l’extérieur et, pour la plupart, ne vous préoccupe pas. Lorsque vous travaillez avec des bases de données de graphiques, vous vous concentrez principalement sur les tables de graphiques et les données qu’elles contiennent.

En général, une base de données graphique ne fournit aucune fonctionnalité que vous ne pouvez pas atteindre en utilisant des fonctionnalités relationnelles traditionnelles. La promesse de la base de données graphique réside dans la capacité d’organiser et d’interroger certains types de données plus efficacement. Microsoft vous recommande d’envisager d’implémenter une base de données graphique dans les circonstances suivantes:

  • Vous devez analyser des données hautement interconnectées et les relations entre ces données.
  • Vous prenez en charge les données avec des relations multiples complexes qui évoluent continuellement.
  • Vous travaillez avec des données hiérarchiques, tout en essayant de naviguer dans les limites du type de données HierarchyID.

Les fonctionnalités de base de données graphique de SQL Server sont entièrement intégrées au moteur de base de données, en exploitant des composants tels que le processeur de requêtes et le moteur de stockage. Grâce à cette intégration, vous pouvez utiliser des bases de données graphiques en conjonction avec un large éventail de composants, y compris des index columnstore, des services d’apprentissage automatique, des SSM et diverses autres fonctionnalités et outils.

Définition des tables de nœuds de graphe

Pour créer une base de données de graphe basée sur le modèle illustré dans la figure précédente, vous devez créer trois tables de nœuds et trois tables de périphérie. Microsoft a mis à jour l’instruction CREATE TABLE dans SQL Server 2017 pour inclure des options permettant de définir l’un ou l’autre type de table. Comme déjà indiqué, vous pouvez créer les tables dans n’importe quelle base de données définie par l’utilisateur. Pour les exemples de cet article, j’ai créé une base de données de base nommée FishGraph, comme indiqué dans le code T-SQL suivant:

1
2
3
4
5
6

UTILISEZ master;
GO
DROP DATABASE S’IL EXISTE FishGraph;
GO
CRÉER UNE BASE DE DONNÉES FishGraph;
GO

Comme vous pouvez le voir, il n’y a rien de spécial ici. Vous créez la base de données comme toute autre base de données définie par l’utilisateur. Il n’y a rien de spécial à faire pour le configurer pour prendre en charge une base de données de graphiques.

Si vous envisagez d’essayer ces exemples par vous-même, vous pouvez utiliser la base de données FishGraph ou l’un de vos choix. Quoi que vous décidiez, l’étape suivante consiste à créer la table de nœuds FishSpecies, à l’aide de l’instruction CREATE TABLE suivante:

1
2
3
4
5
6
7
8
9

UTILISEZ FishGraph;
GO
DROP TABLE S’IL EXISTE FishSpecies;
GO
CRÉER UNE TABLE FishSpecies(
CLÉ PRIMAIRE D’IDENTITÉ FishID INT,
Nom commun NVARCHAR(100) NON NUL,
Nom scientifique NVARCHAR(100) NON NUL
) COMME NŒUD;

Les définitions des colonnes doivent être assez simples. Ce qui est important ici, c’est la clause AS NODE, que vous devez inclure pour créer une table de nœuds. Lorsque vous spécifiez cette clause, le moteur de base de données ajoute deux colonnes à la table (ce à quoi nous reviendrons sous peu) et crée un index unique et non clusterisé sur l’une de ces colonnes.

Vous pouvez vérifier si la table a été créée en tant que table de nœuds en interrogeant le système.vue tableaux. Avec la sortie de SQL Server 2017, Microsoft a mis à jour la vue pour inclure les colonnes de bits is_node et is_edge. Si la table est une table de nœuds, la valeur de la colonne is_node est définie sur 1 et la valeur de la colonne is_edge est définie sur 0. Si une table de bord, les valeurs sont inversées. L’exemple suivant utilise la vue pour confirmer que la table FishSpecies a été correctement définie:

1
2

SÉLECTIONNEZ is_node, is_edge DEPUIS sys.tableaux
OÙ name=’Espèces de poissons’;

L’instruction SELECT renvoie les résultats affichés dans la figure suivante, qui indiquent que FishSpecies a été créé en tant que table de nœuds.

Microsoft a également mis à jour le système.vue colonnes pour inclure les colonnes graph_type et graph_type_desc. Vous pouvez utiliser la vue et les nouvelles colonnes pour en savoir plus sur la table FishSpecies:

1
2
3

SÉLECTIONNEZ name, graph_type, graph_type_desc
DANS sys.colonnes
OÙ object_id = OBJECT_ID(‘Espèces de poissons’);

La figure suivante montre les colonnes créées pour le tableau des espèces de poissons.

Lorsque vous créez une table de nœuds, le moteur de base de données ajoute les colonnes graph_id_< hex_string > etnodnode_id_< hex_string > et crée un index unique non groupé sur la colonnenodnode_id. Le moteur de base de données utilise la première colonne pour les opérations internes et rend la deuxième colonne disponible pour un accès externe. La colonnenodnode_id stocke un identifiant unique pour chaque entité, que vous pouvez afficher lors de l’interrogation des données. C’est la seule colonne des deux dont vous devez vous préoccuper. En fait, si vous interrogiez directement la table, vous ne verriez que la colonnenodnode_id, pas la colonne graph_id.

Les colonnes graph_type et graph_type_desc renvoyées par le système.la vue colonnes est spécifique aux colonnes générées automatiquement dans une table graphique. Les colonnes indiquent les types de colonnes générées par le moteur de base de données. Le type est indiqué par une valeur numérique prédéfinie et sa description connexe. Microsoft ne fournit pas beaucoup de détails sur ces codes et descriptions, mais vous pouvez trouver quelques détails dans l’architecture Microsoft document SQL Graph. Encore une fois, votre principale préoccupation concerne la colonnenodnode_id et les données qu’elle contient.

Après avoir créé votre table, vous pouvez commencer à ajouter des données. L’exécution d’une instruction INSERT sur une table de nœuds fonctionne comme n’importe quelle autre table. Vous spécifiez les colonnes cibles et leurs valeurs, comme indiqué dans l’exemple suivant:

1
2
3
4
5
6
7
8
9
10
11

INSERT INTO FishSpecies (CommonName, ScientificName) VALUES
(‘Atlantic halibut’, ‘Hippoglossus hippoglossus’),
(‘Chinook salmon’, ‘Oncorhynchus tshawytscha’),
(‘European seabass’, ‘Morone (Decentrarchus) labrax’),
(‘Gizzard shad’, ‘Dorosoma cepedianum’),
(‘Japanese striped knife jaw’, Oplegnathus faciatus’),
(‘ Grand brochet’, ‘Esox lucius’),
(‘ Hareng du Pacifique’, ‘Clupea pallasi’),
(‘ Truite arc-en-ciel’, ‘Oncorhynchus mykiss’),
(‘ Sole (Douvres)’, ‘Solea solea’),
(‘ Basse blanche’, ‘Morone chrysops’);

Bien sûr, vous pouvez ajouter n’importe quelle espèce de poisson que vous aimez particulièrement. Mes choix ici étaient complètement arbitraires. Mais si vous vous en tenez à mes données, puis interrogez le tableau FishSpecies, vos résultats devraient ressembler à ceux de la figure suivante.

Comme mentionné ci-dessus, la colonne graph_id n’apparaît pas dans les résultats, mais la colonnenodnode_id le fait, avec des valeurs générées automatiquement. Le moteur de base de données crée chaque valeur sous la forme d’une chaîne JSON qui fournit le type (nœud ou bord), le schéma, la table et une valeur BIGINT unique à chaque ligne. Comme prévu, le moteur de base de données renvoie également les valeurs dans les colonnes définies par l’utilisateur, tout comme une table relationnelle typique.

L’étape suivante consiste à créer et à remplir la table de nœuds FishLover, en utilisant le code T-SQL suivant:

1
2
3
4
5
6
7
8
9
10
11
12

DROP TABLE IF EXISTS FishLover;
GO
CREATE TABLE FishLover(
CLÉ PRIMAIRE D’IDENTITÉ INT FishLoverID,
Nom d’utilisateur NVARCHAR(50) NOT NULL,
) EN TANT QUE NŒUD;
INSÉRER DANS FishLover (Nom d’utilisateur) DES VALEURS
(‘powerangler’),
(‘ jessie98’),
(‘ accroché’),
(‘ plongeur’),
(‘ sous-marinecasey’);

Le tableau ne comprend que deux colonnes définies par l’utilisateur – FishLoverID et UserName — mais vous pouvez définir autant de colonnes que nécessaire. Par exemple, vous pouvez inclure les noms et prénoms, les coordonnées et d’autres détails, en fonction de la nature de l’application. Une fois la table créée, vous pouvez ensuite exécuter une requête pour vérifier les données. Vos résultats devraient ressembler à ceux indiqués dans la figure suivante.

Vous pouvez ensuite suivre les mêmes étapes pour créer et remplir la table FishPost, en transmettant le texte du message que vous souhaitez:

1
2
3
4
5
6
7
8
9
10
11
12
13

TABLEAU DE CHUTE S’IL EXISTE FishPost;
GO
CRÉER UNE TABLE FishPost(
CLÉ PRIMAIRE D’IDENTITÉ PostID INT,
Title NVARCHAR(50) NOT NULL,
MessageText NVARCHAR(800) NOT NULL
) EN TANT QUE NŒUD;
INSÉRER DANS FishPost (Title, MessageText) LES VALEURS
(‘Celui qui s’est échappé’, ‘Notre équipe est disponible, veuillez nous contacter. Aeneas avantage besoins réservés.’),
(‘ Une étude sur les poissons ‘, ‘penatibus venenatis, nascetur ridiculus mus.’),
(‘ Crochet, ligne et plomb ‘, ‘Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu.’),
(‘ Tant de poissons, si peu de temps « , « Nullam dictum felis eu pede mollis pretium. Entier tincidunt.’),
(‘ Mon poisson préféré « , « Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim.’);

La figure suivante montre les résultats que vous verriez si vous colliez avec les données Lorem Ipsum.

C’est tout ce qu’il y a à créer et à remplir vos tables de nœuds. À l’exception de la clause NODE AS dans l’instruction CREATE TABLE, la plupart du reste fonctionne comme d’habitude.

Définition de tables de bords de graphes

La création d’une table de bords est similaire à la création d’une table de nœuds, sauf que vous devez spécifier la clause AS EDGE plutôt que la clause AS NODE. Par exemple, pour créer la table Posts, vous devez utiliser l’instruction CREATE TABLE suivante:

1
2
3
4
5

DÉPOSER LA TABLE SI DES Messages EXISTENT;
ALLER
CRÉER DES messages DE TABLE (
BIT FLAG IMPORTANT NON NUL PAR DÉFAUT 0
) EN TANT QUE BORD;

La définition de la table est similaire à une table de nœuds, sauf qu’elle n’inclut pas de colonne de clé primaire (et, bien sûr, elle prend la clause AS EDGE). Dans ce cas, une clé primaire n’est pas nécessaire, mais si à un moment donné vous déterminez que vous avez besoin d’une clé primaire, vous pouvez certainement en ajouter une. (Vous verrez bientôt pourquoi les clés primaires sont utiles pour les tables de nœuds.)

Notez que la définition de la table inclut également la colonne ImportantFlag. Je l’ai inclus principalement pour démontrer que vous pouvez ajouter des colonnes définies par l’utilisateur à votre table de périphérie, tout comme avec les tables de nœuds. Cela dit, il n’est pas rare de créer une table de périphérie sans colonnes définies par l’utilisateur, contrairement à une table de nœuds, qui doit inclure au moins une colonne définie par l’utilisateur.

Après avoir créé la table de périphérie, vous pouvez vérifier qu’elle a été correctement définie en interrogeant le système.vue tableaux, comme vous l’avez vu plus tôt:

1
2

SÉLECTIONNEZ is_node, is_edge DEPUIS sys.tables
OÙ nom = ‘Messages’;

Si vous avez tout fait correctement, vos résultats devraient ressembler à ceux de la figure suivante.

Vous pouvez également interroger le système.vue tables pour vérifier les détails des colonnes, comme vous l’avez fait auparavant:

1
2
3

SÉLECTIONNEZ name, graph_type, graph_type_desc
DANS sys.colonnes
OÙ object_id = OBJECT_ID(‘Messages’);

La figure suivante montre les résultats retournés sur mon système.

Comme vous pouvez le voir, le moteur de base de données ajoute huit colonnes à une table de périphérie, plutôt que les deux que vous avez vues avec les tables de nœuds. Encore une fois, reportez-vous au document SQL Graph Architecture pour les descriptions de chaque type de colonne. La majorité de ces colonnes sont utilisées par le moteur de base de données pour des opérations internes. Vous devez vous préoccuper principalement des trois colonnes suivantes:

  • La colonneededge_id_< hex_string> identifie de manière unique chaque relation.
  • La colonnefromfrom_id_ < hex_string > stocke la valeurnodnode_id associée à l’entité dans la table d’origine de la relation.
  • La colonnetoto_id_ < hex_string > stocke la valeurnodnode_id associée à l’entité dans la table où la relation se termine.

Comme avec la colonnenodnode_id dans une table de nœuds, le moteur de base de données génère automatiquement des valeurs pour la colonneededge_id. Cependant, vous devez spécifiquement ajouter des valeurs aux colonnesfromfrom_id ettoto_id pour définir une relation. Pour démontrer comment cela fonctionne, nous commencerons par un seul enregistrement:

1
2
3

INSÉRER DANS LES messages (fromfrom_id,toto_id) DES VALEURS (
(SÉLECTIONNEZnodnode_id DE FishLover OÙ FishLoverID = 1),
( SÉLECTIONNEZnodnode_id À PARTIR DE FishPost OÙ PostID = 3));

L’instruction INSERT définit une relation dans la table Posts entre une entité FishLover dont la valeur FishLoverID est 1 et une entité FishPost dont la valeur PostID est 3. Notez que vous pouvez utiliser les aliasnodnode_id,fromfrom_id ettoto_id pour référencer les colonnes cibles, sans avoir à trouver les chaînes hexadécimales.

Pour ajouter des données à la colonnefromfrom_id, vous devez spécifier la valeurnodnode_id associée à l’entité FishLover. Une façon d’obtenir cette valeur consiste à inclure une sous-requête qui cible l’entité, en utilisant sa valeur de clé primaire. Vous pouvez adopter la même approche pour la colonnefromfrom_id.

Insérer les données de cette manière montre pourquoi il est utile d’ajouter des clés primaires aux tables de nœuds, mais pas nécessaire pour les tables de périphérie. Les clés primaires sur les tables de nœuds facilitent grandement la fourniture de la valeurnodnode_id à l’instruction INSERT.

Si vous interrogez maintenant le tableau des messages, vos résultats devraient ressembler à ceux indiqués dans la figure suivante.

La table doit contenir la nouvelle relation, avec ImportantFlag défini sur 0, la valeur par défaut. Vous pouvez maintenant ajouter quelques lignes supplémentaires, en utilisant les instructions INSERT suivantes:

1
2
3
4
5
6
7
8
9
10
11
12

INSÉRER DANS LES messages (fromfrom_id,toto_id) DES VALEURS (
(SÉLECTIONNEZnodnode_id DE FishLover OÙ FishLoverID = 3),
( SÉLECTIONNEZnodnode_id À PARTIR DU poste DE pêche OÙ PostID = 2));
INSÉRER DANS LES messages (fromfrom_id,toto_id) DES VALEURS (
(SÉLECTIONNEZnodnode_id DE FishLover OÙ FishLoverID = 2),
( SÉLECTIONNEZnodnode_id DANS FishPost OÙ PostID = 5));
INSÉRER DANS LES messages (fromfrom_id,toto_id, ImportantFlag) DES VALEURS (
(SÉLECTIONNEZnodnode_id DE FishLover OÙ FishLoverID = 5),
( SÉLECTIONNEZnodnode_id DANS FishPost OÙ PostID = 4), 1);
INSÉRER DANS LES messages (fromfrom_id,toto_id, ImportantFlag) DES VALEURS (
(SÉLECTIONNEZnodnode_id DE FishLover OÙ FishLoverID = 4),
( SÉLECTIONNEZnodnode_id DANS FishPost OÙ PostID = 1), 1);

Notez que les deux dernières instructions INSERT fournissent également une valeur pour la colonne ImportantFlag. Lorsque vous interrogez la table des publications, vos résultats doivent désormais inclure les cinq lignes.

L’étape suivante consiste à créer et à remplir la table Likes, en utilisant le code T-SQL suivant:

1
2
3
4
5
6
7
8
9
10
11
12

SUPPRIMER LA TABLE SI ELLE EXISTE J’AIME;
ALLER
CRÉER UNE TABLE J’AIME COMME BORD;
INSÉRER DANS J’aime (fromfrom_id,toto_id) DES VALEURS (
(SÉLECTIONNEZnodnode_id DE FishLover OÙ FishLoverID = 3),
( SÉLECTIONNEZnodnode_id DE FishSpecies OÙ FishID=8));
INSÉRER DANS J’aime (fromfrom_id,toto_id) DES VALEURS (
(SÉLECTIONNEZnodnode_id DE FishLover OÙ FishLoverID = 5),
( SÉLECTIONNEZnodnode_id DANS FishPost OÙ PostID = 4));
INSÉREZ DANS J’aime (fromfrom_id,toto_id) DES VALEURS (
(SÉLECTIONNEZnodnode_id DE FishLover OÙ FishLoverID = 1),
( SÉLECTIONNEZnodnode_id DE FishLover OÙ FishLoverID = 4));

Vous pouvez, bien sûr, définir les relations que vous souhaitez. Le point important à noter ici est que vous n’êtes limité à aucun ensemble de nœuds. Par exemple, la première instruction INSERT crée une relation entre FishLover et FishSpecies, la deuxième instruction crée une relation entre FishLover et FishPost, et la troisième instruction crée une relation entre FishLover et FishLover. Cela nous donne les résultats de la requête indiqués dans la figure suivante.

Vous pouvez adopter la même approche lors de la création et du remplissage de la table LinksTo:

1
2
3
4
5
6
7
8
9
10
11
12

SUPPRIMER LA TABLE SI ELLE EXISTE LinksTo;
ALLER
CRÉER LA TABLE LinksTo EN TANT QUE BORD;
INSÉRER DANS LinksTo(fromfrom_id,toto_id) DES VALEURS (
(SÉLECTIONNEZnodnode_id DE FishPost OÙ PostID = 2),
( SÉLECTIONNEZnodnode_id DE FishSpecies OÙ FishID= 6));
INSÉRER DANS LinksTo(fromfrom_id,toto_id) DES VALEURS (
(SÉLECTIONNEZnodnode_id DE FishPost OÙ PostID = 4),
( SÉLECTIONNEZnodnode_id DE FishLover OÙ FishLoverID = 1));
INSÉRER DANS LinksTo(fromfrom_id,toto_id) DES VALEURS (
(SÉLECTIONNEZnodnode_id DE FishPost OÙ PostID = 3),
( SÉLECTIONNEZnodnode_id DANS FishPost OÙ PostID = 5));

La figure suivante montre à quoi devraient ressembler les données après avoir été ajoutées à la table, en supposant que vous ayez suivi l’exemple.

Avec une base de données graphique, vous pouvez ajouter un large éventail de relations entre les nœuds d’origine et de terminaison. Vous pouvez également intégrer facilement des modifications au modèle graphique. Par exemple, vous pouvez décider d’ajouter une table de nœuds FishRecipes pour stocker les recettes de poisson que les utilisateurs publient sur le forum, auquel cas, vous pouvez tirer parti des tables de messages, de Likes et de liens existantes.

Aller de l’avant Avec les bases de données Graph

Étant donné que Microsoft inclut les fonctionnalités de base de données graph dans le moteur de base de données SQL Server, vous pouvez facilement les essayer sans avoir à installer ou à reconfigurer de composants. Mieux encore, vous pouvez utiliser les mêmes outils et procédures que vous utilisez depuis le début pour créer et remplir des tables de nœuds et de bords. Dans les articles à suivre, nous expliquerons comment interroger et modifier les données de graphe et examinerons de plus près le travail avec des données hiérarchiques, alors assurez-vous de rester à l’écoute.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.