次の方法で共有


SQL Graph のアーキテクチャ

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

SQL Graph のアーキテクチャについて説明します。 基本を理解すると、他の SQL Graph の記事を理解しやすくなります。

SQL Graph データベース

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

次の図は、SQL Graph データベースのアーキテクチャを示しています。

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

ノード テーブル

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

注意

クエリで擬似列を使用することは、内部 $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 つのノードを接続します。 エッジ テーブルを使用すると、ユーザーはグラフ内の多対多リレーションシップをモデル化できます。 エッジ テーブルでは、ユーザー定義列 ("attributes") は省略可能です。 エッジ テーブルが作成されるたびに、ユーザー定義列と共に、エッジ テーブルに 3 つの暗黙的な列が作成されます。

列名 説明
$edge_id データベース内の特定のエッジを一意に識別します。 これは生成された列であり、値はエッジ テーブルのobject_idと内部で生成された bigint 値の組み合わせです。 ただし、列を $edge_id 選択すると、JSON 文字列の形式で計算された値が表示されます。 $edge_id は、一意のサフィックスを持つ内部名にマップされる擬似列です。 テーブルからを選択 $edge_id すると、列名は として $edge_id_<unique suffix>表示されます。 クエリで擬似列名を使用することは、内部 $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_<unique suffix> 列に表示されます。 また、OLTP シナリオでは、エッジ方向の検索を高速化するために、ユーザーが ($from_id$to_id) 列にインデックスを作成することをお勧めします。

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

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

Metadata

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

sys.tables

sys.tables の次bitの列を使用して、グラフ テーブルを識別できます。 が 1 に設定されている場合 is_node 、テーブルはノード テーブルになり、 が 1 に設定されている場合 is_edge 、テーブルはエッジ テーブルになります。

列名 データ型 説明
is_node bit ノード テーブルの場合、 is_node は 1 に設定されます。
is_edge bit エッジ テーブルの場合、 is_edge は 1 に設定されます。

sys.columns

graph_typeビューの sys.columns 列と graph_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 内部グラフ ID 値。
$node_id_\<hex_string> NVARCHAR 0 ノード ID の外部の文字表現。

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

列名 データ型 is_hidden 解説
graph_id_\<hex_string> bigint 1 内部グラフ ID 値。
$edge_id_\<hex_string> NVARCHAR 0 エッジ ID の文字表現。
from_obj_id_\<hex_string> INT 1 "from node" の内部 object_id 値。
from_id_\<hex_string> bigint 1 "from ノード" の内部グラフ ID 値。
$from_id_\<hex_string> NVARCHAR 0 "from node" の文字表現。
to_obj_id_\<hex_string> INT 1 "to node" の内部 object_id
to_id_\<hex_string> bigint 1 "to node" の内部グラフ ID 値。
$to_id_\<hex_string> NVARCHAR 0 "to node" の外部文字表現。

システム関数

次の組み込み関数を使用して、グラフ テーブル内の擬似列を操作できます。 これらの各関数の詳細な参照は、それぞれの T-SQL 関数参照で提供されています。

組み込み 説明
OBJECT_ID_FROM_NODE_ID から node_idグラフ テーブルのオブジェクト ID を抽出します。
GRAPH_ID_FROM_NODE_ID からグラフ ID 値を抽出します node_id
NODE_ID_FROM_PARTS グラフ テーブルのオブジェクト ID とグラフ ID 値からnode_idを作成します。
OBJECT_ID_FROM_EDGE_ID から edge_idグラフ テーブルのオブジェクト ID を抽出します。
GRAPH_ID_FROM_EDGE_ID 特定 edge_idの のグラフ ID 値を抽出します。
EDGE_ID_FROM_PARTS グラフ テーブルとグラフ ID 値のオブジェクト ID から構築 edge_id します。

Transact-SQL リファレンス

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

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

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

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

タスク 関連記事 Notes
INSERT INSERT (Transact-SQL) ノード テーブルへの挿入は、リレーショナル テーブルへの挿入と同じ違いはありません。 列の $node_id 値が自動的に生成されます。 または $edge_id 列に値$node_idを挿入しようとすると、エラーが発生します。 ユーザーは、エッジ テーブルに挿入する際に、 列と $to_id 列の値$from_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) ノードとエッジはテーブルとして格納されるため、ほとんどのテーブル操作はノード テーブルとエッジ テーブルでもサポートされています。
MATCH MATCH (Transact-SQL) MATCH 組み込みは、グラフのパターン マッチングとトラバーサルをサポートするために導入されています。

制限事項

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

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

関連項目

次のステップ