Architecture du graphique SQLSQL Graph Architecture

S’APPLIQUE À : ouiSQL Server ouiAzure SQL Database nonAzure SQL Data Warehouse nonParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Découvrez comment SQL Graph est conçu.Learn how SQL Graph is architected. Le fait de connaître les principes de base facilitera la compréhension des autres Articles de SQL Graph.Knowing the basics will make it easier to understand other SQL Graph articles.

Base de données SQL GraphSQL Graph Database

Les utilisateurs peuvent créer un graphique par base de données.Users can create one graph per database. Un graphique est une collection de tables de nœuds et d’arêtes.A graph is a collection of node and edge tables. Les tables de nœuds ou d’arêtes peuvent être créées sous n’importe quel schéma de la base de données, mais elles appartiennent toutes à un graphique logique.Node or edge tables can be created under any schema in the database, but they all belong to one logical graph. Une table de nœuds est une collection de nœuds de type similaire.A node table is collection of similar type of nodes. Par exemple, une table de nœuds Person contient tous les nœuds person appartenant à un graphique.For example, a Person node table holds all the Person nodes belonging to a graph. De même, une table Edge est une collection de bords similaires.Similarly, an edge table is a collection of similar type of edges. Par exemple, une table d’amis contient tous les bords qui connectent une personne à une autre personne.For example, a Friends edge table holds all the edges that connect a Person to another Person. Étant donné que les nœuds et les bords sont stockés dans des tables, la plupart des opérations prises en charge sur les tables standard sont prises en charge sur les tables de nœuds ou d’arêtes.Since nodes and edges are stored in tables, most of the operations supported on regular tables are supported on node or edge tables.

architecture SQL-Graphsql-graph-architecture  

Figure 1 : Architecture de la base de données SQL GraphFigure 1: SQL Graph database architecture

Table de nœudsNode Table

Une table de nœuds représente une entité dans un schéma de graphique.A node table represents an entity in a graph schema. Chaque fois qu’une table de nœuds est créée, avec les colonnes définies par l’utilisateur $node_id , une colonne implicite est créée, ce qui identifie de façon unique un nœud donné dans la base de données.Every time a node table is created, along with the user-defined columns, an implicit $node_id column is created, which uniquely identifies a given node in the database. Les valeurs dans $node_id sont générées automatiquement et sont une combinaison object_id de cette table de nœuds et d’une valeur bigint générée en interne.The values in $node_id are automatically generated and are a combination of object_id of that node table and an internally generated bigint value. Toutefois, lorsque la $node_id colonne est sélectionnée, une valeur calculée sous la forme d’une chaîne JSON s’affiche.However, when the $node_id column is selected, a computed value in the form of a JSON string is displayed. En outre $node_id , est une pseudo-colonne qui est mappée à un nom interne avec une chaîne hexadécimale.Also, $node_id is a pseudo column, that maps to an internal name with hex string in it. Lorsque vous sélectionnez $node_id dans la table, le nom de la colonne s' $node_id_<hex_string>affiche sous la forme.When you select $node_id from the table, the column name will appear as $node_id_<hex_string>. L’utilisation de noms de pseudo-colonnes dans les requêtes est la méthode recommandée pour $node_id interroger la colonne interne et l’utilisation d’un nom interne avec une chaîne hexadécimale doit être évitée.Using pseudo-column names in queries is the recommended way of querying the internal $node_id column and using internal name with hex string should be avoided.

Il est recommandé que les utilisateurs créent une contrainte ou un index unique $node_id sur la colonne au moment de la création de la table de nœuds. Toutefois, si aucun index n’est créé, un index non-cluster unique par défaut est créé automatiquement.It is recommended that users create a unique constraint or index on the $node_id column at the time of creation of node table, but if one is not created, a default unique, nonclustered index is automatically created. Toutefois, tout index sur une pseudo-colonne de graphique est créé sur les colonnes internes sous-jacentes.However, any index on a graph pseudo column is created on the underlying internal columns. Autrement dit, un index créé sur la $node_id colonne apparaît sur la colonne interne. graph_id_<hex_string>That is, an index created on the $node_id column, will appear on the internal graph_id_<hex_string> column.

Table EdgeEdge Table

Une table Edge représente une relation dans un graphique.An edge table represents a relationship in a graph. Les bords sont toujours dirigés et connectent deux nœuds.Edges are always directed and connect two nodes. Une table Edge permet aux utilisateurs de modéliser des relations plusieurs-à-plusieurs dans le graphique.An edge table enables users to model many-to-many relationships in the graph. Une table Edge peut ou ne peut pas contenir d’attributs définis par l’utilisateur.An edge table may or may not have any user-defined attributes in it. Chaque fois qu’une table Edge est créée, avec les attributs définis par l’utilisateur, trois colonnes implicites sont créées dans la table Edge:Every time an edge table is created, along with the user-defined attributes, three implicit columns are created in the edge table:

Nom de la colonneColumn name DescriptionDescription
$edge_id Identifie de façon unique une arête donnée dans la base de données.Uniquely identifies a given edge in the database. 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 bigint générée en interne.It is a generated column and the value is a combination of object_id of the edge table and a internally generated bigint value. Toutefois, lorsque la $edge_id colonne est sélectionnée, une valeur calculée sous la forme d’une chaîne JSON s’affiche.However, when the $edge_id column is selected, a computed value in the form of a JSON string is displayed. $edge_idest une pseudo-colonne qui est mappée à un nom interne avec une chaîne hexadécimale.$edge_id is a pseudo-column, that maps to an internal name with hex string in it. Lorsque vous sélectionnez $edge_id dans la table, le nom de la colonne s' $edge_id_\<hex_string>affiche sous la forme.When you select $edge_id from the table, the column name will appear as $edge_id_\<hex_string>. L’utilisation de noms de pseudo-colonnes dans les requêtes est la méthode recommandée pour $edge_id interroger la colonne interne et l’utilisation d’un nom interne avec une chaîne hexadécimale doit être évitée.Using pseudo-column names in queries is the recommended way of querying the internal $edge_id column and using internal name with hex string should be avoided.
$from_id Stocke $node_id le du nœud à partir duquel le bord provient.Stores the $node_id of the node, from where the edge originates.
$to_id Stocke $node_id le du nœud, à partir duquel le bord s’arrête.Stores the $node_id of the node, at which the edge terminates.

Les nœuds qu’un bord donné peut connecter sont régis par les données insérées $to_id dans les $from_id colonnes et.The nodes that a given edge can connect is governed by the data inserted in the $from_id and $to_id columns. 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.In the first release, it is not possible to define constraints on the edge table, to restrict it from connecting any two type of nodes. Autrement dit, un bord peut connecter deux nœuds quelconques dans le graphique, quels que soient leurs types.That is, an edge can connect any two nodes in the graph, regardless of their types.

Comme pour la $node_id colonne, il est recommandé que les utilisateurs créent un index ou une contrainte unique $edge_id sur la colonne au moment de la création de la table du bord, mais si aucun index non cluster par défaut n’est créé, un index non-cluster unique est automatiquement créé sur Cette colonne.Similar to the $node_id column, it is recommended that users create a unique index or constraint on the $edge_id column at the time of creation of the edge table, but if one is not created, a default unique, nonclustered index is automatically created on this column. Toutefois, tout index sur une pseudo-colonne de graphique est créé sur les colonnes internes sous-jacentes.However, any index on a graph pseudo column is created on the underlying internal columns. Autrement dit, un index créé sur la $edge_id colonne apparaît sur la colonne interne. graph_id_<hex_string>That is, an index created on the $edge_id column, will appear on the internal graph_id_<hex_string> column. Il est également recommandé, pour les scénarios OLTP, que les utilisateurs créent un index$from_idsur $to_idles colonnes (,), afin d’accélérer les recherches dans le sens de la périphérie.It is also recommended, for OLTP scenarios, that users create an index on ($from_id, $to_id) columns, for faster lookups in the direction of the edge.

La figure 2 montre comment les tables de nœuds et de périphérie sont stockées dans la base de données.Figure 2 shows how node and edge tables are stored in the database.

Person-Friends-tablesperson-friends-tables  

Figure 2 : Représentation de la table des nœuds et des bordsFigure 2: Node and edge table representation

MétadonnéesMetadata

Utilisez ces vues de métadonnées pour afficher les attributs d’une table de nœuds ou d’arêtes.Use these metadata views to see attributes of a node or edge table.

sys.tablessys.tables

Les nouvelles colonnes suivantes, de type bit, seront ajoutées à SYS. Elles.The following new, bit type, columns will be added to SYS.TABLES. Si is_node a la valeur 1, cela indique que la table est une table de nœuds is_edge et si a la valeur 1, ce qui indique que la table est une table d’arêtes.If is_node is set to 1, that indicates that the table is a node table and if is_edge is set to 1, that indicates that the table is an edge table.

Nom de la colonneColumn Name Type de donnéesData Type DescriptionDescription
is_nodeis_node bitbit 1 = il s’agit d’une table de nœuds1 = this is a node table
is_edgeis_edge bitbit 1 = il s’agit d’une table Edge1 = this is an edge table

sys.columnssys.columns

La sys.columns vue contient des colonnes graph_type supplémentaires graph_type_descet, qui indiquent le type de la colonne dans les tables de nœuds et de périphérie.The sys.columns view contains additional columns graph_type and graph_type_desc, that indicate the type of the column in node and edge tables.

Nom de la colonneColumn Name Type de donnéesData Type DescriptionDescription
graph_typegraph_type intint Colonne interne avec un ensemble de valeurs.Internal column with a set of values. Les valeurs sont comprises entre 1-8 pour les colonnes de graphique et NULL pour d’autres.The values are between 1-8 for graph columns and NULL for others.
graph_type_descgraph_type_desc nvarchar(60)nvarchar(60) colonne interne avec un ensemble de valeursinternal column with a set of values

Le tableau suivant répertorie les valeurs valides pour graph_type la colonneThe following table lists the valid values for graph_type column

Valeur de la colonneColumn Value DescriptionDescription
11 GRAPH_IDGRAPH_ID
22 GRAPH_ID_COMPUTEDGRAPH_ID_COMPUTED
33 GRAPH_FROM_IDGRAPH_FROM_ID
44 GRAPH_FROM_OBJ_IDGRAPH_FROM_OBJ_ID
5.5 GRAPH_FROM_ID_COMPUTEDGRAPH_FROM_ID_COMPUTED
6.6 GRAPH_TO_IDGRAPH_TO_ID
77 GRAPH_TO_OBJ_IDGRAPH_TO_OBJ_ID
88 GRAPH_TO_ID_COMPUTEDGRAPH_TO_ID_COMPUTED

sys.columnsstocke également des informations sur les colonnes implicites créées dans des tables de nœuds ou d’arêtes.sys.columns also stores information about implicit columns created in node or edge tables. Les informations suivantes peuvent être récupérées à partir de sys. Columns, mais les utilisateurs ne peuvent pas sélectionner ces colonnes dans une table de nœuds ou d’arêtes.Following information can be retrieved from sys.columns, however, users cannot select these columns from a node or edge table.

Colonnes implicites dans une table de nœudsImplicit columns in a node table

Nom de la colonneColumn Name Type de donnéesData Type is_hiddenis_hidden CommentaireComment
graph_id_<hex_string>graph_id_<hex_string> BIGINTBIGINT 11 colonne graph_id interneinternal graph_id column
$node_id_<hex_string>$node_id_<hex_string> NVARCHARNVARCHAR 00 Colonne de node_id nœud externeExternal node node_id column

Colonnes implicites dans une table EdgeImplicit columns in an edge table

Nom de la colonneColumn Name Type de donnéesData Type is_hiddenis_hidden CommentaireComment
graph_id_<hex_string>graph_id_<hex_string> BIGINTBIGINT 11 colonne graph_id interneinternal graph_id column
$edge_id_<hex_string>$edge_id_<hex_string> NVARCHARNVARCHAR 00 colonne edge_id externeexternal edge_id column
from_obj_id_<hex_string>from_obj_id_<hex_string> INTINT 11 interne à partir du nœudobject_idinternal from node object_id
from_id_<hex_string>from_id_<hex_string> BIGINTBIGINT 11 Interne à partir du nœudgraph_idInternal from node graph_id
$from_id_<hex_string>$from_id_<hex_string> NVARCHARNVARCHAR 00 externe à partir du nœudnode_idexternal from node node_id
to_obj_id_<hex_string>to_obj_id_<hex_string> INTINT 11 interne au nœudobject_idinternal to node object_id
to_id_<hex_string>to_id_<hex_string> BIGINTBIGINT 11 Interne au nœudgraph_idInternal to node graph_id
$to_id_<hex_string>$to_id_<hex_string> NVARCHARNVARCHAR 00 externe au nœudnode_idexternal to node node_id

Fonctions systèmeSystem Functions

Les fonctions intégrées suivantes sont ajoutées.The following built-in functions are added. Celles-ci permettent aux utilisateurs d’extraire des informations à partir des colonnes générées.These will help users extract information from the generated columns. Notez que ces méthodes ne valident pas l’entrée de l’utilisateur.Note that, these methods will not validate the input from the user. Si l’utilisateur spécifie un sys.node_id non valide, la méthode extrait le composant approprié et le retourne.If the user specifies an invalid sys.node_id the method will extract the appropriate part and return it. Par exemple, OBJECT_ID_FROM_NODE_ID prend $node_id comme entrée et retourne l’object_id de la table, ce nœud appartient à.For example, OBJECT_ID_FROM_NODE_ID will take a $node_id as input and will return the object_id of the table, this node belongs to.

IntégréBuilt-in DescriptionDescription
OBJECT_ID_FROM_NODE_IDOBJECT_ID_FROM_NODE_ID Extraire l’object_id d’unnode_idExtract the object_id from a node_id
GRAPH_ID_FROM_NODE_IDGRAPH_ID_FROM_NODE_ID Extraire le graph_id à partir d’unnode_idExtract the graph_id from a node_id
NODE_ID_FROM_PARTSNODE_ID_FROM_PARTS Construit un node_id à partir object_id d’un et d’ungraph_idConstruct a node_id from an object_id and a graph_id
OBJECT_ID_FROM_EDGE_IDOBJECT_ID_FROM_EDGE_ID Extraire object_id à partir deedge_idExtract object_id from edge_id
GRAPH_ID_FROM_EDGE_IDGRAPH_ID_FROM_EDGE_ID Extraire l’identité deedge_idExtract identity from edge_id
EDGE_ID_FROM_PARTSEDGE_ID_FROM_PARTS Construire edge_id à object_id partir de et IdentityConstruct edge_id from object_id and identity

Informations de référence sur Transact-SQLTransact-SQL reference

Découvrez les Transact-SQLTransact-SQL extensions introduites dans SQL Server et Azure SQL Database, qui permettent de créer et d’interroger des objets graphiques.Learn the Transact-SQLTransact-SQL extensions introduced in SQL Server and Azure SQL Database, that enable creating and querying graph objects. Les extensions de langage de requête aident à interroger et à parcourir le graphique à l’aide de la syntaxe ASCII art.The query language extensions help query and traverse the graph using ASCII art syntax.

Instructions DDL (Data Definition Language)Data Definition Language (DDL) statements

TâcheTask Article connexeRelated Article NotesNotes
CREATE TABLECREATE TABLE CREATE TABLE (Transact-SQL)CREATE TABLE (Transact-SQL) CREATE TABLEest maintenant étendu pour prendre en charge la création d’une table en tant que nœud ou EDGE.CREATE TABLE is now extended to support creating a table AS NODE or AS EDGE. Notez qu’une table Edge peut ou non avoir des attributs définis par l’utilisateur.Note that an edge table may or may not have any user-defined attributes.
ALTER TABLEALTER TABLE ALTER TABLE (Transact-SQL)ALTER TABLE (Transact-SQL) Les tables de nœuds et de périphérie peuvent être modifiées de la même façon qu’une table ALTER TABLErelationnelle, à l’aide de.Node and edge tables can be altered the same way a relational table is, using the ALTER TABLE. Les utilisateurs peuvent ajouter ou modifier des colonnes, des index ou des contraintes définis par l’utilisateur.Users can add or modify user-defined columns, indexes or constraints. Toutefois, la modification de colonnes graphiques internes, $node_id comme $edge_idou, génère une erreur.However, altering internal graph columns, like $node_id or $edge_id, will result in an error.
CREATE INDEXCREATE INDEX CREATE INDEX (Transact-SQL)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.Users can create indexes on pseudo-columns and user-defined columns in node and edge tables. Tous les types d’index sont pris en charge, y compris les index ColumnStore cluster et non cluster.All index types are supported, including clustered and nonclustered columnstore indexes.
CRÉER DES CONTRAINTES DE PÉRIPHÉRIECREATE EDGE CONSTRAINTS EDGE CONSTRAINTS (Transact-SQL)EDGE CONSTRAINTS (Transact-SQL) Les utilisateurs peuvent désormais créer des contraintes Edge sur les tables Edge pour appliquer une sémantique spécifique et maintenir l’intégrité des données.Users can now create edge constraints on edge tables to enforce specific semantics and also maintain data integrity
DROP TABLEDROP TABLE DROP TABLE (Transact-SQL)DROP TABLE (Transact-SQL) Les tables de nœuds et de périphérie peuvent être supprimées de la même façon qu’une DROP TABLEtable relationnelle, à l’aide de.Node and edge tables can be dropped the same way a relational table is, using the DROP TABLE. Toutefois, dans cette version, il n’existe aucune contrainte pour garantir qu’aucun bord ne pointe vers un nœud supprimé et que la suppression en cascade des bords n’est pas prise en charge lors de la suppression d’une table de nœuds ou de nœuds.However, in this release, there are no constraints to ensure that no edges point to a deleted node and cascaded deletion of edges, upon deletion of a node or node table is not supported. Si une table de nœuds est supprimée, les utilisateurs déposent manuellement les bords connectés aux nœuds de cette table de nœuds afin de préserver l’intégrité du graphique.It is recommended that if a node table is dropped, users drop any edges connected to the nodes in that node table manually to maintain the integrity of the graph.

Instructions DML (Data Manipulation Language)Data Manipulation Language (DML) statements

TâcheTask Article connexeRelated Article NotesNotes
INSERTINSERT INSERT (Transact-SQL)INSERT (Transact-SQL) L’insertion dans une table de nœuds n’est pas différente de l’insertion dans une table relationnelle.Inserting into a node table is no different than inserting into a relational table. Les valeurs de $node_id la colonne sont générées automatiquement.The values for $node_id column is automatically generated. Toute tentative d’insertion d’une $node_id valeur $edge_id dans ou de colonne génère une erreur.Trying to insert a value in $node_id or $edge_id column will result in an error. Les utilisateurs doivent fournir des $from_id valeurs $to_id pour les colonnes et lors de l’insertion dans une table Edge.Users must provide values for $from_id and $to_id columns while inserting into an edge table. $from_idet $to_id sont les $node_id valeurs des nœuds auxquels se connecte un bord donné.$from_id and $to_id are the $node_id values of the nodes that a given edge connects.
SuppressionDELETE DELETE (Transact-SQL)DELETE (Transact-SQL) Les données des tables de nœuds ou d’arêtes peuvent être supprimées de la même façon qu’elles sont supprimées des tables relationnelles.Data from node or edge tables can be deleted in same way as it is deleted from relational tables. Toutefois, dans cette version, il n’existe aucune contrainte pour garantir qu’aucun bord ne pointe vers un nœud supprimé et que la suppression en cascade des bords n’est pas prise en charge lors de la suppression d’un nœud.However, in this release, there are no constraints to ensure that no edges point to a deleted node and cascaded deletion of edges, upon deletion of a node is not supported. Quand un nœud est supprimé, tous les bords de connexion à ce nœud sont également supprimés, afin de préserver l’intégrité du graphique.It is recommended that whenever a node is deleted, all the connecting edges to that node are also deleted, to maintain the integrity of the graph.
UPDATEUPDATE UPDATE (Transact-SQL)UPDATE (Transact-SQL) Les valeurs des colonnes définies par l’utilisateur peuvent être mises à jour à l’aide de l’instruction UPDATE.Values in user-defined columns can be updated using the UPDATE statement. La mise à jour des colonnes graphiques $node_idinternes $edge_id, $from_id , $to_id et n’est pas autorisée.Updating the internal graph columns, $node_id, $edge_id, $from_id and $to_id is not allowed.
MERGEMERGE MERGE (Transact-SQL)MERGE (Transact-SQL) MERGEl’instruction est prise en charge sur une table de nœuds ou d’arêtes.MERGE statement is supported on a node or edge table.

Instructions de requêteQuery Statements

TâcheTask Article connexeRelated Article NotesNotes
SELECTSELECT SELECT (Transact-SQL)SELECT (Transact-SQL) Les nœuds et les bords sont stockés en interne en tant que tables. par conséquent, la plupart des opérations prises en charge sur une table dans SQL Server ou Azure SQL Database sont prises en charge sur les tables de nœuds et de périphérieNodes and edges are stored as tables internally, hence most of the operations supported on a table in SQL Server or Azure SQL Database are supported on the node and edge tables
MATCHMATCH MATCH (Transact-SQL)MATCH (Transact-SQL) La fonction intégrée de correspondance est introduite pour prendre en charge les critères spéciaux et traverser le graphique.MATCH built-in is introduced to support pattern matching and traversal through the graph.

Limitations et problèmes connusLimitations and known issues

Il existe certaines limitations sur les tables de nœuds et d’arêtes dans cette version:There are certain limitations on node and edge tables in this release:

  • Les tables temporaires locales ou globales ne peuvent pas être des tables de nœuds ou de périphérie.Local or global temporary tables cannot be node or edge tables.
  • Les types de table et les variables de table ne peuvent pas être déclarés en tant que table de nœuds ou d’arêtes.Table types and table variables cannot be declared as a node or edge table.
  • Les tables de nœuds et de périphérie ne peuvent pas être créées en tant que tables temporelles avec version gérée par le système.Node and edge tables cannot be created as system-versioned temporal tables.
  • Les tables de nœuds et de périphérie ne peuvent pas être des tables optimisées en mémoire.Node and edge tables cannot be memory optimized tables.
  • Les utilisateurs ne peuvent $from_id pas $to_id mettre à jour les colonnes et d’un bord à l’aide de l’instruction Update.Users cannot update the $from_id and $to_id columns of an edge using UPDATE statement. Pour mettre à jour les nœuds qu’un bord connecte, les utilisateurs doivent insérer le nouveau bord pointant vers de nouveaux nœuds et supprimer le précédent.To update the nodes that an edge connects, users will have to insert the new edge pointing to new nodes and delete the previous one.
  • Les requêtes entre bases de données sur les objets Graph ne sont pas prises en charge.Cross database queries on graph objects are not supported.

Étapes suivantesNext Steps

Pour commencer à utiliser la nouvelle syntaxe, consultez base de données SQL Graph-exempleTo get started with the new syntax, see SQL Graph Database - Sample