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 データベースのアーキテクチャを示しています。
ノード テーブル
ノード テーブルは、グラフ スキーマ内のエンティティを表します。 ノード テーブルがユーザー定義列と共に作成されるたびに、データベース内の特定のノードを一意に識別する暗黙的な $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
列を更新できません。 エッジによって参照されるノードを更新するには、ユーザーは新しいノードを指す新しいエッジを挿入し、前のエッジを削除する必要があります。 - グラフ オブジェクトに対するデータベース間クエリはサポートされていません。
関連項目
次のステップ
- SQL Graph の使用を開始するには、「SQL Graph データベース - サンプル」を参照してください。