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 Graph の設計方法について説明します。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. たとえば、友人のエッジテーブルには、人物を別の人に接続するすべてのエッジが含まれています。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 Graph データベースのアーキテクチャ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, nonclustered 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_idStores the $node_id of the node, from where the edge originates.
$to_id エッジが終了するノードのを格納します。$node_idStores 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, nonclustered 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_typeテーブルgraph_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_type有効な値の一覧を示します。The 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. 列から取得できますが、ユーザーはノードまたはエッジテーブルからこれらの列を選択できません。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 object_idとから node_id を構築します。graph_idConstruct a node_id from an object_id and a graph_id
OBJECT_ID_FROM_EDGE_IDOBJECT_ID_FROM_EDGE_ID 抽出object_idedge_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 id object_idからのコンストラクトConstruct edge_id from object_id and identity

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

SQL Server と Azure SQL Database で導入された拡張機能について説明します。これにより、グラフオブジェクトの作成とクエリが可能になります。Transact-SQLTransact-SQLLearn 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は、ノードまたはエッジとしてのテーブルの作成をサポートするように拡張されました。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 nonclustered columnstore indexes.
CREATE EDGE CONSTRAINTSCREATE 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 MATCH& (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.
  • ユーザーは、update $from_idステートメント$to_idを使用して、エッジの列および列を更新することはできません。Users cannot update the $from_id and $to_id columns of an edge using UPDATE statement. エッジが接続するノードを更新するには、新しいノードをポイントする新しいエッジを挿入し、前のノードを削除する必要があります。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