SQL 圖形架構
適用於: SQL Server 2017 (14.x) 和更新版本Azure SQL DatabaseAzure SQL 受控執行個體
瞭解 SQL Graph 的架構。 瞭解基本概念可讓您更輕鬆地瞭解其他 SQL Graph 文章。
SQL Graph 資料庫
使用者可以為每個資料庫建立一個圖表。 圖表是節點和邊緣資料表的集合。 節點或邊緣資料表可以在資料庫中的任何架構下建立,但它們全都屬於一個邏輯圖表。 節點資料表是類似節點類型的集合。 例如, Person
節點資料表會保存屬於圖形的所有 Person
節點。 同樣地,邊緣資料表是類似邊緣類型的集合。 例如, Friends
邊緣資料表會保存連接到 Person
另一個 Person
邊緣的所有邊緣。 由於節點和邊緣會儲存在資料表中,因此節點或邊緣資料表支援一般資料表上支援的大部分作業。
下圖顯示 SQL Graph 資料庫架構。
節點資料表
節點資料表代表圖表架構中的實體。 每次建立節點資料表以及使用者定義的資料行時,都會建立隱含 $node_id
資料行,以唯一識別資料庫中的指定節點。 中的 $node_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>
資料行上。
邊緣資料表
邊緣資料表代表圖形中的關聯性。 邊緣一律會導向並連接兩個節點。 邊緣資料表可讓使用者在圖表中建立多對多關聯性的模型。 使用者定義資料行 (「attributes」) 在邊緣資料表中是選擇性的。 每次建立邊緣資料表以及使用者定義的資料行時,邊緣資料表中都會建立三個隱含資料行:
資料行名稱 | 描述 |
---|---|
$edge_id |
唯一識別資料庫中的指定邊緣。 它是產生的資料行,而值是邊緣資料表object_id與內部產生的 Bigint 值的組合。 不過,選取資料 $edge_id 行時,會顯示 JSON 字串形式的計算值。 $edge_id 是虛擬資料行,對應至具有唯一尾碼的內部名稱。 當您從資料表中選取 $edge_id 時,資料行名稱會顯示為 $edge_id_<unique suffix> 。 建議在查詢中使用虛擬資料行名稱來查詢內部 $edge_id 資料行,並應避免使用內部名稱搭配十六進位字串。 |
$from_id |
儲存 $node_id 節點的 ,其來源是邊緣的來源。 |
$to_id |
儲存 $node_id 邊緣終止之節點的 。 |
指定邊緣可以連接的節點是由 插入 和 $from_id
$to_id
資料行的資料所控制。 在第一個版本中,您無法在邊緣資料表上定義條件約束,以限制它無法連接任何兩種類型的節點。 也就是說,邊緣可以連接圖形中的任何兩個節點,無論其類型為何。
與資料 $node_id
行類似,建議您在建立邊緣資料表時,使用者在資料行上 $edge_id
建立唯一索引或條件約束,但如果未建立,則會自動在此資料行上建立預設唯一的非叢集索引。 不過,圖形虛擬資料行上的任何索引會在基礎內部資料行上建立。 也就是說,在資料行上建立的 $edge_id
索引會出現在內部 graph_id_<unique suffix>
資料行上。 針對 OLTP 案例,使用者也會建議在 ( $from_id
, $to_id
) 資料行上建立索引,以加快邊緣方向的查閱速度。
下圖顯示節點和邊緣資料表如何儲存在資料庫中。
中繼資料
使用這些中繼資料檢視來查看節點或邊緣資料表的屬性。
sys.tables
sys.tables 中的 下列 bit
資料行可用來識別圖表資料表。 如果 is_node
設定為 1,則資料表是節點資料表,如果 is_edge
設定為 1,則資料表是邊緣資料表。
資料行名稱 | 資料類型 | 描述 |
---|---|---|
is_node | bit | 針對節點資料表, is_node 會設定為 1。 |
is_edge | bit | 針對邊緣資料表, is_edge 會設定為 1。 |
sys.columns
graph_type
檢視中的 sys.columns
和 graph_type_desc
資料行有助於瞭解圖形節點和邊緣資料表中使用的不同資料行類型:
資料行名稱 | 資料類型 | 描述 |
---|---|---|
graph_type | int | 具有一組值的內部資料行。 圖表資料行和 NULL 其他人的值介於 1-8 之間。 |
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 | 內部圖表識別碼值。 |
$node_id_\<hex_string> |
NVARCHAR | 0 | 節點識別碼的外部字元表示。 |
邊緣資料表中的隱含資料行包括:
資料行名稱 | 資料類型 | is_hidden | 註解 |
---|---|---|---|
graph_id_\<hex_string> |
BIGINT | 1 | 內部圖表識別碼值。 |
$edge_id_\<hex_string> |
NVARCHAR | 0 | 邊緣識別碼的字元表示。 |
from_obj_id_\<hex_string> |
INT | 1 | 「from node」 的內部 object_id 值。 |
from_id_\<hex_string> |
BIGINT | 1 | 「從節點」的內部圖形識別碼值。 |
$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_id_\<hex_string> |
NVARCHAR | 0 | 「到節點」的外部字元表示。 |
系統函式
您可以使用下列內建函式來與圖表資料表中的虛擬資料行互動。 個別 T-SQL 函式參考中會提供每個函式的詳細參考。
內建 | 描述 |
---|---|
OBJECT_ID_FROM_NODE_ID | 從 node_id 擷取圖表資料表的物件識別碼。 |
GRAPH_ID_FROM_NODE_ID | 從 node_id 擷取圖形識別碼值。 |
NODE_ID_FROM_PARTS | 從圖形資料表的物件識別碼和圖形識別碼值建構node_id。 |
OBJECT_ID_FROM_EDGE_ID | 從 edge_id 擷取圖表資料表的物件識別碼。 |
GRAPH_ID_FROM_EDGE_ID | 擷取指定 edge_id 之 的圖形識別碼值。 |
EDGE_ID_FROM_PARTS | 從圖形資料表的物件識別碼和圖形識別碼值建構 edge_id 。 |
Transact-SQL 參考
瞭解 SQL Server 和 Azure SQL Database 中引進的 Transact-SQL 延伸模組,以建立和查詢繪圖物件。 查詢語言延伸模組可協助使用 ASCII 藝術語法來查詢和周遊圖表。
資料定義語言 (DDL) 語句
Task | 相關文章 | 備註 |
---|---|---|
建立資料表 | 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) | 使用者可以在節點和邊緣資料表中建立虛擬資料行和使用者定義資料行的索引。 支援所有索引類型,包括叢集和非叢集資料行存放區索引。 |
CREATE EDGE 條件約束 | EDGE 條件約束 (Transact-SQL) | 使用者現在可以在邊緣資料表上建立邊緣條件約束,以強制執行特定的語意,並維護資料完整性 |
DROP TABLE | DROP TABLE (Transact-SQL) | 您可以使用 來卸載關聯式資料表的相同方式卸 DROP TABLE 除節點和邊緣資料表。 目前沒有任何機制可防止刪除邊緣所參考的節點。 刪除節點時,不支援串聯刪除邊緣(或卸載整個節點資料表)。 在所有這類情況下,任何連線到已刪除節點的邊緣都必須手動刪除,才能維持圖形的一致性。 |
資料操作語言 (DML) 語句
Task | 相關文章 | 備註 |
---|---|---|
插入 | 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 節點或邊緣資料表支援 語句。 |
查詢語句
Task | 相關文章 | 備註 |
---|---|---|
SELECT | SELECT (Transact-SQL) | 因為節點和邊緣會儲存為數據表,因此節點和邊緣資料表也支援大部分的資料表作業。 |
MATCH | MATCH (Transact-SQL) | 引進 MATCH 內建支援模式比對和周遊圖表。 |
限制
節點和邊緣資料表有一些限制:
- 本機或全域臨時表不能是節點或邊緣資料表。
- 資料表類型和資料表變數無法宣告為節點或邊緣資料表。
- 節點和邊緣資料表無法建立為系統版本設定的時態表。
- 節點和邊緣資料表不能是記憶體優化資料表。
- 使用者無法使用 UPDATE 語句來更新邊緣的
$from_id
和$to_id
資料行。 若要更新邊緣所參考的節點,使用者必須插入指向新節點的新邊緣,並刪除先前的邊緣。 - 不支援繪圖物件上的跨資料庫查詢。
另請參閱
下一步
- 若要開始使用 SQL Graph,請參閱 SQL Graph 資料庫 - 範例