SQL Graph アーキテクチャ

適用対象:yesSQL Server 2017 (14. x) 以降 Yes Azure SQL Database Yes Azure SQL Managed Instance

SQL Graph を構築する方法について説明します。 基本を理解することで、他の SQL Graph の記事を理解しやすくなります。

Graph データベースの SQL

ユーザーは、データベースごとに1つのグラフを作成できます。 グラフは、ノードテーブルとエッジテーブルのコレクションです。 ノードテーブルまたはエッジテーブルは、データベース内の任意のスキーマで作成できますが、すべて1つの論理グラフに属します。 ノードテーブルは、類似した種類のノードのコレクションです。 たとえば、ユーザーノードテーブルには、グラフに属するすべての Person ノードが格納されます。 同様に、エッジテーブルは同様のエッジのコレクションです。 たとえば、友人のエッジテーブルには、人物を別の人に接続するすべてのエッジが含まれています。 ノードとエッジはテーブルに格納されるため、通常のテーブルでサポートされている操作のほとんどは、ノードテーブルまたはエッジテーブルでサポートされています。

Diagram showing the SQL Graph database architecture.  

図 1: SQL Graph データベースのアーキテクチャ

ノードテーブル

ノードテーブルは、グラフスキーマ内のエンティティを表します。 ユーザー定義の列と共にノードテーブルが作成されるたびに、暗黙的 $node_id な列が作成されます。この列は、データベース内の特定のノードを一意に識別します。 の $node_id 値は自動的に生成され、そのノードテーブルと内部的に生成された bigint 値の object_id 組み合わせとなります。 ただし、列が選択されて $node_id いる場合は、JSON 文字列形式の計算値が表示されます。 また、 $node_id は擬似列で、16進数の文字列を含む内部名にマップされます。 テーブルから選択 $node_id すると、列名がとして $node_id_<hex_string> 表示されます。

Note

クエリで擬似列を使用するのは、内部 $node_id 列に対してクエリを実行する唯一のサポートされている推奨方法です。 クエリでは、 $node_id_<hex_string> 列を直接使用しないでください。 さらに、擬似列に示される計算された JSON 表現は、実装の詳細です。 その JSON 表現の形式に直接依存することは避けてください。 この JSON 表現に対処する必要がある場合は、NODE_ID_FROM_PARTS () およびその他の関連する システム関数の使用を検討してください。 グラフ擬似列 ($node _id、$from _id、$to _id) を述語で直接使用することはお勧めしません。 たとえば、のような n.$node_id = e.$from_id 述語は避ける必要があります。 このような比較は、JSON 表現への変換によって非効率的になる傾向があります。 代わりに、できるだけ MATCH 関数に依存します。

ユーザーは、ノードテーブルの作成時に列に $node_id 一意の制約またはインデックスを作成することをお勧めしますが、作成されていない場合は、既定の一意の非クラスター化インデックスが自動的に作成されます。 ただし、グラフ擬似列のインデックスは、基になる内部列に対して作成されます。 つまり、列に $node_id 作成されたインデックスは、内部 graph_id_<hex_string> 列に表示されます。

エッジテーブル

エッジテーブルは、グラフ内のリレーションシップを表します。 エッジは常に転送され、2つのノードに接続します。 エッジテーブルを使用すると、ユーザーはグラフ内の多対多リレーションシップをモデル化できます。 エッジテーブルには、ユーザー定義属性が含まれている場合と、存在しない場合があります。 エッジテーブルが作成されるたびに、ユーザー定義の属性と共に、エッジテーブルに3つの暗黙的な列が作成されます。

列名 説明
$edge_id データベース内の特定のエッジを一意に識別します。 これは生成された列で、値はエッジテーブルの object_id と内部で生成された bigint 値の組み合わせです。 ただし、列が選択されて $edge_id いる場合は、JSON 文字列形式の計算値が表示されます。 $edge_id は、16進数の文字列を含む内部名にマップされる擬似列です。 テーブルから選択 $edge_id すると、列名がとして $edge_id_\<hex_string> 表示されます。 クエリで擬似列名を使用する場合は、内部 $edge_id 列に対してクエリを実行し、16進文字列で内部名を使用することを避けることをお勧めします。
$from_id $node_idエッジの発生元のノードのを格納します。
$to_id $node_idエッジが終了するノードのを格納します。

特定のエッジが接続できるノードは、列および $to_id 列に $from_id 挿入されたデータによって管理されます。 最初のリリースでは、エッジテーブルに制約を定義して、2種類のノードの接続を制限することはできません。 つまり、エッジは、その種類に関係なく、グラフ内の任意の2つのノードを接続できます。

列と同様に $node_id 、エッジテーブルを作成するときに、ユーザーが列に $edge_id 一意のインデックスまたは制約を作成することをお勧めしますが、作成されていない場合は、既定の一意の非クラスター化インデックスがこの列に自動的に作成されます。 ただし、グラフ擬似列のインデックスは、基になる内部列に対して作成されます。 つまり、列に $edge_id 作成されたインデックスは、内部 graph_id_<hex_string> 列に表示されます。 また、OLTP シナリオでは、ユーザーが ( $from_id , $to_id ) 列にインデックスを作成し、エッジの方向をより高速に参照できるようにすることもお勧めします。

図2は、ノードテーブルとエッジテーブルがデータベースにどのように格納されるかを示しています。

Diagram showing the Node and edge table representation.  

図 2: ノードとエッジテーブルの表示

Metadata

ノードまたはエッジテーブルの属性を表示するには、これらのメタデータビューを使用します。

sys.tables

次の新しい bit 型の列が SYS に追加されます。テーブル. が1に設定されている場合 is_node は、テーブルがノードテーブルであることを示し、が1に設定されている場合 is_edge は、テーブルがエッジテーブルであることを示します。

列名 データ型 説明
is_node bit 1 = これはノードテーブルです
is_edge bit 1 = エッジテーブル

sys.columns

sys.columnsビューには、ノードとエッジテーブルの列の型を示す追加の列 graph_typegraph_type_desc が含まれています。

列名 データ型 説明
graph_type INT 値のセットを含む内部列。 値は、グラフの列の場合は1-8、それ以外の場合は NULL になります。
graph_type_desc nvarchar(60) 値のセットを含む内部列

次の表に、列の graph_type 有効な値を示します。

列の値 説明
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 には、ノードテーブルまたはエッジ テーブルに作成された暗黙的な列に関する情報も格納されます。 sys.columns から次の情報を取得することもできますが、ユーザーはノードまたはエッジ テーブルからこれらの列を選択することはできません。

ノード テーブルの暗黙的な列は次のとおりです。

列名 データ型 is_hidden コメント
<graph_id_hex_string> bigint 1 internal graph_id
$node_id_<hex_string> NVARCHAR 0 外部ノード node_id

エッジ テーブルの暗黙的な列は次のとおりです。

列名 データ型 is_hidden コメント
<graph_id_hex_string> bigint 1 internal graph_id
$edge_id_<hex_string> NVARCHAR 0 external edge_id column
<from_obj_id_hex_string> INT 1 internal from node object_id
<from_id_hex_string> bigint 1 ノードからの内部 graph_id
$from_id_<hex_string> NVARCHAR 0 ノードからの外部 node_id
<to_obj_id_hex_string> INT 1 内部からノードへ object_id
<to_id_hex_string> bigint 1 内部からノードへ graph_id
$to_id_<hex_string> NVARCHAR 0 ノードの外部 node_id

システム関数

次の組み込み関数が追加されます。 これらは、ユーザーが生成された列から情報を抽出するのに役立ちます。 これらのメソッドでは、ユーザーからの入力は検証されないので注意してください。 ユーザーが無効を指定した場合、 sys.node_id メソッドは適切な部分を抽出して返します。 たとえば、OBJECT_ID_FROM_NODE_ID $node_id を入力として受け取り、テーブルのobject_idを返す場合、このノードは属します。

組み込み 説明
OBJECT_ID_FROM_NODE_ID からobject_idを抽出します。 node_id
GRAPH_ID_FROM_NODE_ID からgraph_idを抽出します。 node_id
NODE_ID_FROM_PARTS と からnode_idを object_id 構築する graph_id
OBJECT_ID_FROM_EDGE_ID から抽出 object_id する edge_id
GRAPH_ID_FROM_EDGE_ID から ID を抽出する edge_id
EDGE_ID_FROM_PARTS と ID edge_id から構築 object_id する

Transact-SQL リファレンス

SQL Server および Azure SQL Database で導入された Transact-SQL Azure SQL Database 拡張機能について学習します。この拡張機能を使用すると、グラフ オブジェクトの作成とクエリを実行できます。 クエリ言語拡張機能は、ASCII アート構文を使用してグラフのクエリと走査を行うのに役立ちます。

データ定義言語 (DDL) ステートメント

タスク 関連記事 メモ
CREATE TABLE CREATE TABLE (Transact-SQL) CREATE TABLE は、テーブル AS NODE または AS EDGE の作成をサポートするために拡張されました。 エッジ テーブルには、ユーザー定義属性がある場合とない場合があります。
ALTER TABLE ALTER TABLE (Transact-SQL) ノード テーブルとエッジ テーブルは、 を使用してリレーショナル テーブルと同じように変更できます ALTER TABLE。 ユーザーは、ユーザー定義の列、インデックス、または制約を追加または変更できます。 ただし、 や のような内部グラフ列を変更$node_id$edge_idすると、エラーが発生します。
CREATE INDEX CREATE INDEX (Transact-SQL) ユーザーは、ノード テーブルとエッジ テーブルの擬似列とユーザー定義列にインデックスを作成できます。 クラスター化列ストア インデックスと非クラスター化列ストア インデックスを含め、すべてのインデックスの種類がサポートされています。
エッジ制約を作成する EDGE CONSTRAINTS (Transact-SQL) ユーザーはエッジ テーブルにエッジ制約を作成して、特定のセマンティクスを適用し、データの整合性を維持できます
DROP TABLE DROP TABLE (Transact-SQL) ノード テーブルとエッジ テーブルは、 を使用してリレーショナル テーブルと同じように削除できます DROP TABLE。 ただし、このリリースでは、ノードまたはノード テーブルの削除時に、エッジが削除されたノードを指したり、エッジを連鎖的に削除したりしないという制約はありません。 ノード テーブルを削除した場合、ユーザーは、グラフの整合性を維持するために、そのノード テーブル内のノードに接続されているエッジを手動で削除する必要があります。

データ操作言語 (DML) ステートメント

タスク 関連記事 メモ
INSERT INSERT (Transact-SQL) ノード テーブルへの挿入は、リレーショナル テーブルに挿入するのと同じ違いはありません。 列の値は $node_id 自動的に生成されます。 または 列に値を挿入$node_id$edge_idしようとすると、エラーが発生します。 ユーザーは、エッジ テーブルへの挿入時 $from_id$to_id 列と 列の値を指定する必要があります。 $from_id$to_id は、特定 $node_id のエッジが接続するノードの値です。
DELETE DELETE (Transact-SQL) ノード テーブルまたはエッジ テーブルからのデータは、リレーショナル テーブルから削除されるのと同じ方法で削除できます。 ただし、このリリースでは、ノードの削除時に、削除されたノードを指し示すエッジとエッジの連鎖削除を確実に行う制約はありません。 ノードが削除されるたびに、グラフの整合性を維持するために、そのノードに接続しているすべてのエッジも削除されます。
UPDATE UPDATE (Transact-SQL) ユーザー定義列の値は、UPDATE ステートメントを使用して更新できます。 内部グラフ列 、、$node_idおよび の$edge_id$from_id更新$to_idは許可されません。
MERGE MERGE (Transact-SQL) MERGE ステートメントは、ノードテーブルまたはエッジ テーブルでサポートされています。

クエリ ステートメント

タスク 関連記事 Notes
SELECT SELECT (Transact-SQL) ノードとエッジは内部的にテーブルとして格納されます。そのため、SQL Server または Azure SQL Database のテーブルでサポートされている操作のほとんどが、ノード テーブルとエッジ テーブルでサポートされます
MATCH MATCH (Transact-SQL) MATCH 組み込みは、グラフを介したパターン マッチングとトラバーサルをサポートするために導入されています。

制限事項と既知の問題

このリリースでは、ノード テーブルとエッジ テーブルに特定の制限があります。

  • ローカル一時テーブルまたはグローバル一時テーブルをノード テーブルまたはエッジ テーブルにすることはできません。
  • テーブル型とテーブル変数をノードテーブルまたはエッジ テーブルとして宣言することはできません。
  • ノード テーブルとエッジ テーブルは、システム バージョン管理されたテンポラル テーブルとして作成できません。
  • ノード テーブルとエッジ テーブルをメモリ最適化テーブルにすることはできません。
  • ユーザーは、UPDATE ステートメントを $from_id 使用して $to_id エッジの 列と 列を更新できません。 エッジが接続するノードを更新するには、ユーザーは新しいノードを指す新しいエッジを挿入し、前のノードを削除する必要があります。
  • グラフ オブジェクトに対するデータベース間クエリはサポートされていません。

次の手順

新しい構文の使用を開始するには、「SQL Graph - サンプル」を参照してください。