SQL グラフ アーキテクチャSQL Graph Architecture

適用対象: ○SQL Server ○Azure SQL Database XAzure SQL Data Warehouse XParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

SQL グラフを構築する方法について説明します。Learn how SQL Graph is architected. 基本事項を知ることは容易にできるように SQL グラフの他の記事を理解します。Knowing the basics will make it easier to understand other SQL Graph articles.

SQL グラフ データベースSQL Graph Database

ユーザーは、データベースごとに 1 つのグラフを作成できます。Users can create one graph per database. グラフは、ノードとエッジ テーブルのコレクションです。A graph is a collection of node and edge tables. データベース内の任意のスキーマでノードまたはエッジ テーブルを作成できますが、すべて 1 つの論理グラフに属する。Node or edge tables can be created under any schema in the database, but they all belong to one logical graph. ノード テーブルには、ノードの類似する型のコレクションです。A node table is collection of similar type of nodes. たとえば、Person ノード テーブルは、グラフに属しているすべての人のノードを保持します。For example, a Person node table holds all the Person nodes belonging to a graph. 同様に、エッジ テーブルは、エッジの類似する型のコレクションです。Similarly, an edge table is a collection of similar type of edges. たとえば、Friend エッジ テーブルは、別のユーザーにユーザーを接続するすべての端を保持します。For example, a Friends edge table holds all the edges that connect a Person to another Person. テーブルには、ノードとエッジが格納されているために、通常のテーブルでサポートされる操作のほとんどは、ノードまたはエッジ テーブルでサポートされます。Since nodes and edges are stored in tables, most of the operations supported on regular tables are supported on node or edge tables.

sql のアーキテクチャ グラフsql-graph-architecture  

図 1: SQL グラフ データベース アーキテクチャFigure 1: SQL Graph database architecture

ノード テーブルNode Table

ノード テーブルでは、グラフのスキーマのエンティティを表します。A node table represents an entity in a graph schema. ノード テーブルが作成されるたびに、ユーザー定義の列と共に暗黙$node_id列を作成すると、データベース内の特定のノードを一意に識別します。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. 内の値$node_idの組み合わせは、自動的に生成されるobject_idのノード テーブルと内部的に生成された bigint 値。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. ただし、ときに、$node_id列を選択すると、JSON 文字列の形式での計算値が表示されます。However, when the $node_id column is selected, a computed value in the form of a JSON string is displayed. また、$node_idは、16 進数の文字列と内部名にマップされる擬似列です。Also, $node_id is a pseudo column, that maps to an internal name with hex string in it. 選択すると$node_idとして、テーブルから列名が表示されます$node_id_<hex_string>します。When you select $node_id from the table, the column name will appear as $node_id_<hex_string>. 内部クエリを実行する推奨される方法は、クエリで擬似列名を使用して$node_id列と 16 進文字列と内部名を使用を避ける必要があります。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.

ユーザーが一意の制約を作成またはインデックスことをお勧め、$node_idのいずれかでない場合は、ノード テーブルの作成時に列を作成、既定値が一意、非クラスター化インデックスが自動的に作成します。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, non-clustered index is automatically created. ただし、グラフ擬似列のすべてのインデックスは、基になる内部列に作成されます。However, any index on a graph pseudo column is created on the underlying internal columns. 作成されたインデックスは、$node_id列を内部に表示されますgraph_id_<hex_string>列。That is, an index created on the $node_id column, will appear on the internal graph_id_<hex_string> column.

エッジ テーブルEdge Table

エッジ テーブルでは、グラフ内のリレーションシップを表します。An edge table represents a relationship in a graph. エッジは常に送られ、2 つのノードを接続します。Edges are always directed and connect two nodes. エッジ テーブルでは、グラフ内の多対多リレーションシップをモデル化することができます。An edge table enables users to model many-to-many relationships in the graph. エッジ テーブルもかまいませんが、ユーザー定義の属性がない可能性があります。An edge table may or may not have any user-defined attributes in it. ユーザー定義の属性の場合、と共に、エッジ テーブルが作成されるたびに、暗黙的な 3 つの列がエッジ テーブルで作成されます。Every time an edge table is created, along with the user-defined attributes, three implicit columns are created in the edge table:

列名Column name 説明Description
$edge_id データベース内の指定されたエッジを一意に識別します。Uniquely identifies a given edge in the database. 生成された列であるし、値は、object_id、エッジ テーブルと内部的に生成された bigint 値の組み合わせ。It is a generated column and the value is a combination of object_id of the edge table and a internally generated bigint value. ただし、ときに、$edge_id列を選択すると、JSON 文字列の形式での計算値が表示されます。However, when the $edge_id column is selected, a computed value in the form of a JSON string is displayed. $edge_id 16 進数の文字列と内部名にマップされる擬似列です。$edge_id is a pseudo-column, that maps to an internal name with hex string in it. 選択すると$edge_idとして、テーブルから列名が表示されます$edge_id_\<hex_string>します。When you select $edge_id from the table, the column name will appear as $edge_id_\<hex_string>. 内部クエリを実行する推奨される方法は、クエリで擬似列名を使用して$edge_id列と 16 進文字列と内部名を使用を避ける必要があります。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 ストア、$node_idエッジの発生元からのノードの。Stores the $node_id of the node, from where the edge originates.
$to_id ストア、$node_idノード、エッジが終了するのです。Stores the $node_id of the node, at which the edge terminates.

接続できる特定のエッジ ノードに挿入されたデータが適用されます、$from_id$to_id列。The nodes that a given edge can connect is governed by the data inserted in the $from_id and $to_id columns. 最初のリリースでは、ノードの 2 つの種類の接続を制限することに、エッジ テーブルの制約を定義することはできません。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. つまり、エッジは、その型に関係なく、グラフに 2 つのノードを接続できます。That is, an edge can connect any two nodes in the graph, regardless of their types.

ような$node_id列、お勧めのユーザーでの一意のインデックスまたは制約を作成、$edge_idのいずれかでない場合は、エッジ テーブルの作成時に列を作成、既定値に一意、非クラスター化インデックスが自動的に作成この列です。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, non-clustered index is automatically created on this column. ただし、グラフ擬似列のすべてのインデックスは、基になる内部列に作成されます。However, any index on a graph pseudo column is created on the underlying internal columns. 作成されたインデックスは、$edge_id列を内部に表示されますgraph_id_<hex_string>列。That is, an index created on the $edge_id column, will appear on the internal graph_id_<hex_string> column. お勧め、ユーザーのインデックスを作成する OLTP シナリオ ($from_id$to_id) のエッジの方向に高速参照の列。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.

図 2 では、データベース内のノードとエッジ テーブルを格納する方法を示します。Figure 2 shows how node and edge tables are stored in the database.

テーブル-人の友人person-friends-tables  

図 2: ノードとエッジ テーブルの表現Figure 2: Node and edge table representation

メタデータMetadata

これらのメタデータ ビューを使用して、ノードまたはエッジ テーブルの属性を参照してください。Use these metadata views to see attributes of a node or edge table.

sys.tablessys.tables

次の新、bit 型、sys 列が追加されます。テーブル。The following new, bit type, columns will be added to SYS.TABLES. 場合is_nodeテーブルがノード テーブルであることを示します 1 に設定されている場合にis_edgeテーブルがエッジ テーブルであるかを示す 1 に設定されます。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.

列名Column Name データ型Data Type 説明Description
is_nodeis_node bitbit 1 = これは、ノード テーブル1 = this is a node table
is_edgeis_edge bitbit 1 = これは、エッジ テーブル1 = this is an edge table

sys.columnssys.columns

sys.columnsビューには、追加の列が含まれています。graph_typegraph_type_desc、ノードとエッジ テーブル内の列の種類を表します。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.

列名Column Name データ型Data Type 説明Description
graph_typegraph_type ssNoversionint 内部の列値のセットを使用します。Internal column with a set of values. 値は 1 ~ 8 のグラフ列から他のユーザーの場合は NULL です。The values are between 1-8 for graph columns and NULL for others.
graph_type_descgraph_type_desc nvarchar(60)nvarchar(60) 一連の値を持つ内部列internal column with a set of values

次の表に、有効な値graph_typeThe following table lists the valid values for graph_type column

列の値Column Value 説明Description
11 GRAPH_IDGRAPH_ID
22 GRAPH_ID_COMPUTEDGRAPH_ID_COMPUTED
33 GRAPH_FROM_IDGRAPH_FROM_ID
44 GRAPH_FROM_OBJ_IDGRAPH_FROM_OBJ_ID
55 GRAPH_FROM_ID_COMPUTEDGRAPH_FROM_ID_COMPUTED
66 GRAPH_TO_IDGRAPH_TO_ID
77 GRAPH_TO_OBJ_IDGRAPH_TO_OBJ_ID
88 GRAPH_TO_ID_COMPUTEDGRAPH_TO_ID_COMPUTED

sys.columns ノードまたはエッジ テーブルで作成した暗黙の型の列に関する情報を格納もされます。sys.columns also stores information about implicit columns created in node or edge tables. Sys.columns から以下の情報を取得できる、ただし、ユーザーは、ノードまたはエッジ テーブルからのこれらの列を選択できません。Following information can be retrieved from sys.columns, however, users cannot select these columns from a node or edge table.

ノード テーブルで暗黙的な列Implicit columns in a node table

列名Column Name データ型Data Type is_hiddenis_hidden 解説Comment
graph_id_<hex_string>graph_id_<hex_string> bigintBIGINT 11 内部graph_idinternal graph_id column
$node_id_<hex_string>$node_id_<hex_string> NVARCHARNVARCHAR 00 外部ノードnode_idExternal node node_id column

エッジ テーブルで暗黙的な列Implicit columns in an edge table

列名Column Name データ型Data Type is_hiddenis_hidden 解説Comment
graph_id_<hex_string>graph_id_<hex_string> bigintBIGINT 11 内部graph_idinternal graph_id column
$edge_id_<hex_string>$edge_id_<hex_string> NVARCHARNVARCHAR 00 外部edge_idexternal edge_id column
from_obj_id_<hex_string>from_obj_id_<hex_string> INTINT 11 ノードから内部 object_idinternal from node object_id
from_id_<hex_string>from_id_<hex_string> bigintBIGINT 11 ノードから内部 graph_idInternal from node graph_id
$from_id_<hex_string>$from_id_<hex_string> NVARCHARNVARCHAR 00 ノードから外部 node_idexternal from node node_id
to_obj_id_<hex_string>to_obj_id_<hex_string> INTINT 11 ノードの内部 object_idinternal to node object_id
to_id_<hex_string>to_id_<hex_string> bigintBIGINT 11 ノードの内部 graph_idInternal to node graph_id
$to_id_<hex_string>$to_id_<hex_string> NVARCHARNVARCHAR 00 外部のノード node_idexternal to node node_id

システム関数System Functions

次の組み込み関数が追加されます。The following built-in functions are added. これらは、生成された列から情報を抽出するユーザーができます。These will help users extract information from the generated columns. これらのメソッドでは、ユーザーからの入力は検証されませんが、注意してください。Note that, these methods will not validate the input from the user. ユーザーが、無効なを指定した場合sys.node_idメソッドは適切な部分を抽出し、それを返します。If the user specifies an invalid sys.node_id the method will extract the appropriate part and return it. たとえば、OBJECT_ID_FROM_NODE_ID になります、$node_idとして入力し、object_id を返す、このノードが属するテーブルの。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.

組み込みBuilt-in 説明Description
OBJECT_ID_FROM_NODE_IDOBJECT_ID_FROM_NODE_ID Object_id を抽出します。 node_idExtract the object_id from a node_id
GRAPH_ID_FROM_NODE_IDGRAPH_ID_FROM_NODE_ID Graph_id を抽出します。 node_idExtract the graph_id from a node_id
NODE_ID_FROM_PARTSNODE_ID_FROM_PARTS Node_id を構築、object_idgraph_idConstruct a node_id from an object_id and a graph_id
OBJECT_ID_FROM_EDGE_IDOBJECT_ID_FROM_EDGE_ID 抽出object_idから edge_idExtract object_id from edge_id
GRAPH_ID_FROM_EDGE_IDGRAPH_ID_FROM_EDGE_ID Id を抽出します。 edge_idExtract identity from edge_id
EDGE_ID_FROM_PARTSEDGE_ID_FROM_PARTS 構築edge_idからobject_idと idConstruct edge_id from object_id and identity

Transact-SQL リファレンスTransact-SQL reference

学習、 Transact-SQLTransact-SQL SQL Server と Azure SQL Database で導入された拡張機能を有効にするグラフ オブジェクトに対するクエリの作成とします。Learn the Transact-SQLTransact-SQL extensions introduced in SQL Server and Azure SQL Database, that enable creating and querying graph objects. クエリ言語の拡張機能では、クエリのヘルプし、ASCII アート構文を使用してグラフを走査します。The query language extensions help query and traverse the graph using ASCII art syntax.

データ定義言語 (DDL) ステートメントData Definition Language (DDL) statements

タスクTask 関連記事Related Article メモNotes
CREATE TABLECREATE TABLE CREATE TABLE (Transact-SQL)CREATE TABLE (Transact-SQL) CREATE TABLE AS ノードまたは AS エッジ テーブルの作成をサポートするために拡張されています。CREATE TABLE is now extended to support creating a table AS NODE or AS EDGE. エッジ テーブルは可能性がありますか、任意のユーザー定義の属性がない可能性がありますに注意してください。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) ノードとエッジ テーブルには、リレーショナル テーブルを使用して、同じ方法を変更できる、ALTER TABLEします。Node and edge tables can be altered the same way a relational table is, using the ALTER TABLE. ユーザーでは、追加したり、ユーザー定義の列、インデックスまたは制約を変更することができます。Users can add or modify user-defined columns, indexes or constraints. ただし、内部グラフ列を変更するには、ような$node_idまたは$edge_idエラーになります。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) ユーザーは、擬似列およびノードとエッジ テーブル内のユーザー定義の列にインデックスを作成できます。Users can create indexes on pseudo-columns and user-defined columns in node and edge tables. 非クラスター化列ストア インデックスを含むすべてのインデックスの種類がサポートされます。All index types are supported, including clustered and non-clustered columnstore indexes.
エッジの制約を作成します。CREATE EDGE CONSTRAINTS エッジ制約(TRANSACT-SQL)EDGE CONSTRAINTS (Transact-SQL) ユーザーが特定のセマンティクスを適用するエッジ テーブルでのエッジの制約を作成およびもデータの整合性を維持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) 同様のリレーショナル テーブルを使用して、ノードとエッジ テーブルを削除することができます、DROP TABLEします。Node and edge tables can be dropped the same way a relational table is, using the DROP TABLE. ただし、このリリースではありません制約を十分に削除されたノードにエッジがポイントありませんし、ノードまたはノード テーブルの削除時に、エッジの連鎖削除がサポートされていません。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. ノード テーブルが削除された場合は、ユーザー、グラフの整合性を維持するために手動でそのノード テーブル内のノードに接続されている、エッジと削除することをお勧めします。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.

データ操作言語 (DML) ステートメントData Manipulation Language (DML) statements

タスクTask 関連記事Related Article メモNotes
INSERTINSERT INSERT (Transact-SQL)INSERT (Transact-SQL) ノード テーブルに挿入すると、リレーショナル テーブルに挿入するよりも同じです。Inserting into a node table is no different than inserting into a relational table. 値は、$node_id列が自動的に生成されます。The values for $node_id column is automatically generated. 値を挿入しようとしています。$node_idまたは$edge_id列はエラーになります。Trying to insert a value in $node_id or $edge_id column will result in an error. ユーザーが値を指定する必要があります$from_id$to_idエッジ テーブルを挿入するときに列。Users must provide values for $from_id and $to_id columns while inserting into an edge table. $from_id $to_idは、$node_id接続する特定のエッジ ノードの値。$from_id and $to_id are the $node_id values of the nodes that a given edge connects.
DelDELETE DELETE (Transact-SQL)DELETE (Transact-SQL) リレーショナル テーブルから削除されると、同じ方法でノードまたはエッジ テーブルからデータを削除できます。Data from node or edge tables can be deleted in same way as it is deleted from relational tables. ただし、このリリースではありません制約を十分に削除されたノードにエッジがポイントありませんし、ノードの削除時に、エッジの連鎖削除がサポートされていません。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. ノードが削除されると、そのノードに接続するすべてのエッジも削除されたこと、グラフの整合性を維持するをお勧めします。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) ユーザー定義の列の値は、UPDATE ステートメントを使用して更新できます。Values in user-defined columns can be updated using the UPDATE statement. 内部グラフ列を更新$node_id$edge_id$from_id$to_idは許可されていません。Updating the internal graph columns, $node_id, $edge_id, $from_id and $to_id is not allowed.
MERGEMERGE MERGE (Transact-SQL)MERGE (Transact-SQL) MERGE ステートメントは、ノードまたはエッジ テーブルでサポートされます。MERGE statement is supported on a node or edge table.

クエリ ステートメントQuery Statements

タスクTask 関連記事Related Article メモNotes
SELECTSELECT SELECT (Transact-SQL)SELECT (Transact-SQL) ノードとエッジ テーブルとして内部的に格納されます、ノードとエッジ テーブルでの SQL Server または Azure SQL Database のテーブルでサポートされている操作のほとんどをサポートするためNodes 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 一致(TRANSACT-SQL)MATCH (Transact-SQL) 一致の組み込みは、パターン マッチングとグラフをトラバースをサポートするために導入されました。MATCH built-in is introduced to support pattern matching and traversal through the graph.

制限事項と既知の問題Limitations and known issues

このリリースでは、ノードとエッジ テーブルにいくつかの制限があります。There are certain limitations on node and edge tables in this release:

  • ローカルまたはグローバル一時テーブルには、ノードまたはエッジ テーブルをすることはできません。Local or global temporary tables cannot be node or edge tables.
  • ノードまたはエッジ テーブルとしては、テーブルの種類とテーブル変数を宣言することはできません。Table types and table variables cannot be declared as a node or edge table.
  • ノードとエッジ テーブルは、システム バージョン管理されたテンポラル テーブルとして作成することはできません。Node and edge tables cannot be created as system-versioned temporal tables.
  • ノードとエッジ テーブルには、メモリ最適化テーブルをすることはできません。Node and edge tables cannot be memory optimized tables.
  • ユーザーが更新できない、$from_id$to_idUPDATE ステートメントを使用してエッジの列。Users cannot update the $from_id and $to_id columns of an edge using UPDATE statement. エッジを接続するノードを更新するには、ユーザーは、新しいノードを指す新しいエッジを挿入し、前の 1 つを削除する必要があります。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.
  • データベースをまたがるグラフ オブジェクトのクエリにはサポートされていません。Cross database queries on graph objects are not supported.

次の手順Next Steps

新しい構文を使用して開始するを参照してくださいSQL グラフ データベースのサンプル。To get started with the new syntax, see SQL Graph Database - Sample