SQL 圖形架構
適用於:Microsoft Fabric 中的 SQL Server 2017(14.x) 和更新版本 Azure SQL 資料庫 Azure SQL 受控執行個體 SQL Database
瞭解 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 | 「到節點」的內部 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 資料庫 中引進的 Transact-SQL 延伸模組,以啟用建立和查詢圖形物件。 查詢語言延伸模組可協助使用 ASCII 藝術語法來查詢和周遊圖表。
資料定義語言 (DDL) 陳述式
Task | 相關文章 | 備註 |
---|---|---|
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) | 用戶可以在節點和邊緣數據表中建立虛擬數據行和使用者定義數據行的索引。 支援所有索引類型,包括叢集和非叢集數據行存放區索引。 |
CREATE EDGE 條件約束 | EDGE 條件約束 (Transact-SQL) | 用戶現在可以在邊緣數據表上建立邊緣條件約束,以強制執行特定的語意,並維護數據完整性 |
DROP TABLE | DROP TABLE (Transact-SQL) | 您可以使用 來卸除關係型數據表的相同方式卸 DROP TABLE 除節點和邊緣數據表。 目前沒有任何機制可防止刪除邊緣所參考的節點。 刪除節點時,不支援串聯刪除邊緣(或卸除整個節點數據表)。 在所有這類情況下,任何連線到已刪除節點的邊緣都必須手動刪除,才能維持圖形的一致性。 |
資料操作語言 (DML) 陳述式
Task | 相關文章 | 備註 |
---|---|---|
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 節點或邊緣數據表支援 語句。 |
查詢語句
Task | 相關文章 | 備註 |
---|---|---|
SELECT | SELECT (Transact-SQL) | 因為節點和邊緣會儲存為數據表,因此節點和邊緣數據表也支援大部分的數據表作業。 |
MATCH | MATCH (Transact-SQL) | 引進 MATCH 內建支援模式比對和周遊圖表。 |
限制
節點與邊緣資料表有一些限制:
- 本機或全局臨時表不能是節點或邊緣數據表。
- 數據表類型和數據表變數無法宣告為節點或邊緣數據表。
- 節點和邊緣數據表無法建立為系統版本設定的時態表。
- 節點和邊緣數據表不能是記憶體優化數據表。
- 用戶無法使用UPDATE語句來更新邊緣的
$from_id
和$to_id
資料行。 若要更新邊緣所參考的節點,用戶必須插入指向新節點的新邊緣,並刪除先前的邊緣。 - 不支援圖形物件上的跨資料庫查詢。
- 圖形虛擬資料列 (
node_id
、$from_id
$to_id
和edge_id
) 無法做為已排序叢集資料行存放區索引的排序資料行。 嘗試使用任何圖形虛擬數據行做為已排序叢集數據行存放區的排序數據行會導致Msg 102: Incorrect syntax
錯誤。 - 在 Fabric SQL 資料庫中,允許 SQL Graph,但 Node 和 Edge 數據表不會鏡像到 Fabric OneLake。
另請參閱
下一步
- 若要開始使用 SQL Graph,請參閱 SQL Graph 資料庫 - 範例