SQL Graph のアーキテクチャ

適用対象:はいSQL Server 2017 (14.x)以降 はいAzure SQL データベースはいAzure SQL Managed Instance

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

SQL Graph データベース

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

SQL Graph データベース アーキテクチャを示す図。

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

ノード テーブル

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

注意

クエリで擬似列を使用する方法は、内部列に対してクエリを実行する唯一のサポートおよび推奨される方法 $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> されます。

Edge テーブル

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

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

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

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

図 2 は、ノード テーブルとエッジ テーブルをデータベースに格納する方法を示しています。

ノードテーブルとエッジ テーブル表現を示す図。

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

Metadata

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

sys.tables

次の新しいビット型の列が SYS に追加されます。テーブル。 が 1 に設定されている場合は、テーブルがノード テーブルであり、 が 1 に設定されている場合は、テーブルがエッジ テーブルを示 is_node 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. 列から取得できますが、ユーザーはノードまたはエッジテーブルからこれらの列を選択できません。

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

列名 データ型 is_hidden コメント
graph_id_<hex_string> bigint 1 内部 graph_id
$node id (_c)<hex_string> NVARCHAR 0 外部ノード node_id

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

列名 データ型 is_hidden コメント
graph_id_<hex_string> bigint 1 内部 graph_id
$edge id (_c)<hex_string> NVARCHAR 0 外部 edge_id
from_obj_id_<hex_string> INT 1 ノードからの内部 object_id
from_id_<hex_string> bigint 1 ノードからの内部 graph_id
$from id (_c)<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 (_c)<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_idedge_id
GRAPH_ID_FROM_EDGE_ID Id の抽出元 edge_id
EDGE_ID_FROM_PARTS edge_idおよび id からのコンストラクト object_id

Transact-SQL リファレンス

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

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

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

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

タスク 関連記事 Notes
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 組み込みは、グラフを介したパターン マッチングとトラバーサルをサポートするために導入されています。

制限事項と既知の問題

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

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

次の手順

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