ISO 專家解讀 | 什么是 GQL 國際標準圖查詢語言
新的屬性圖數據庫語言標準,ISO/IEC 39075 信息技術 — 數據庫語言 — GQL,近日已經發布。但GQL 是什么,這個數據庫語言標準中包含了什么內容?
GQL 這一新數據庫語言標準由國際標準委員會 ISO/IEC JTC1 SC32 WG3 數據庫語言團隊開發。忽略上面的 ISO/IEC JTC1 標準層次結構的縮寫,SC32 WG3 是一個國際委員會,同時負責開發和強化 SQL 數據庫語言。SC32 WG3 的參與者(個別專家)由世界各國的標準流程指派。
當標準委員會開始討論一個新的屬性圖數據庫語言標準時,SC32 WG3 選擇了 “GQL” 這個名字。可能大家覺得 GQL 是 Graph Query Language(圖查詢語言)的縮寫,但是這個名字主要是為了體現 GQL 與 SQL 數據庫語言是并列的。
SQL 國際標準的首個版本(ISO/IEC 9075 - 數據庫語言 — SQL)發布于 1987 年。從那時起,SQL 標準經過了多次修訂,并融入了多種新技術。2019 年,一個新項目獲批,主要是制定專注屬性圖數據庫的平行標準,即數據庫語言 GQL。這對標準機構和行業的重要程度不言而喻,因為這是 ISO 在近 35 年內首次發布的、新的數據庫查詢語言。
近幾年,屬性圖數據庫在大數據、NoSQL 技術領域變得越發重要。屬性圖數據的一大特點是,在數據中會創建關系,用戶可直接編寫聲明式查詢而無需指定關系。與將數據結構化為表的關系型模型不同,屬性圖模型在數據庫內將數據結構化為圖。這讓基于模式的分析成為可能,并且可用極小的成本添加新類型數據。現實生活中,關于圖的應用從數字孿生(Digital Twin)到反洗錢(Anti-Money Laundering),再到藥物發現(Drug Discovery)、供應鏈分析(Supply Chain),以及為生成式人工智能(GenAI)提供的知識圖譜支持,等等。這種新模型與語言的結合前景,以及在數據庫領域內的顯著且持續增長的用量,很大程度上是 SQL 的新 ISO 兄弟語言 GQL 的基礎。
屬性圖數據庫存儲和檢索點(頂點)和邊(關系)。而 GQL 標準規定的聲明式語言受啟發于現有屬性圖數據庫產品和 SQL 標準。
GQL 標準是一個完整的數據庫語言,支持創建、讀取、更新和修改屬性圖數據。而這里的屬性圖數據可以是 Schema Free 的,也可以通過完整的屬性圖模式(Graph Type)進行約束。
GQL 標準約定了多種多樣的數據類型,來支持字符和字節字符串、定點數、浮點數以及嵌套數據。GQL 查詢中所用的圖模式匹配(GPM,Graph Pattern Matching)語言非常強大,允許用戶編寫相對簡單的查詢來進行復雜的數據分析。
作為一種數據庫語言,GQL 不只是一種圖查詢語言。與 SQL 一樣,它設定了一個從持久化且可擴展的目錄初始化的運行時環境。目錄列出了存儲的數據對象,這些對象通過經過身份驗證的會話,并利用事務性工作單元來進行訪問。它支持插入、更新、刪除和讀取屬性圖,這些屬性圖是由目錄中的條目創建和引用的。這些圖的內容可以是無約束的,也可以由管理員定義的數據模型(圖類型)進行約定。這些圖類型是 GQL 中“GQL-schema”的一部分,即目錄中用于存放元數據和數據定義的專用容器。此外,通過定義數據的所有權歸經過身份驗證的用戶所有,GQL-schema 也支持了一個基本的安全模型。
GQL 吸收了眾多現有商業圖查詢語言的特性,包括由 Neo4j Inc. 開發的 openCypher、Tigergraph Inc. 的 GSQL、Oracle Inc. 的 PGQL,以及 LDBC 的研究語言 G-Core。此外,它還與 SQL/PGQ 共享一個從 Cypher 派生的圖模式匹配子語言(非正式稱為 GPML4),該語言是 SQL 的只讀擴展,允許將通過專用視圖訪問的表格數據當作屬性圖處理。GPML 通過將模式圖與數據圖進行匹配,返回數據圖的子圖的表格表示形式。
屬性圖的應用場景
屬性圖被私人和公共金融機構廣泛使用,用來識別潛在的犯罪行為,如:洗錢。這種使用場景既出于需要,有時也是法律要求。例如,一系列的資金轉移——從 A 到 B,再從 B 到 C,最后從 C 回到 A——可能暗示洗錢活動的存在。同樣地,在評估投資組合風險、借貸雙方的償債能力、反欺詐、提供客戶 360 度全方位視圖以及其他多種場景中,屬性圖也發揮著重要作用。
屬性圖同樣用于模擬公共事業基礎設施,如:水資源分配、電力分配和電信網絡。在這些場景中,典型的查詢包括:評估在配電網絡特定節點增加新負載或分布式發電設施(例如:風能或太陽能)可能帶來的影響和收益,以及進行網絡設計、維護、故障診斷和安全管理。
屬性圖的其他應用場景還包括(但不限于)社交網絡、物料清單、訪問控制、產品推薦、引用網絡、路由策略、影響力檢測、蛋白質交互網絡、影響評估,以及生成式 AI。
GQL 示例
以下示例主要介紹了如何使用 GQL 部分功能:
- 查詢和圖模式匹配
- 添加、修改以及刪除數據
- 事務處理
- Schema Free 圖和 Fixed Schema 圖
- 查詢和圖模式匹配
GQL 查詢采用了一種功能豐富的圖模式匹配(GPM)語言。以下示例演示了如何查找與名為“Avery”的點存在一跳關系的所有點:
MATCH (a {firstname: 'Avery'})-[b]->(c)RETURN a, b, c
這里這里 MATCH 語句定義了變量 a、b 和 c,并能在查詢的后續部分引用,本例中是在
RETURN語句中。而用戶編寫查詢語句時,不用預先了解“Avery”與其他點之間的具體關系。
事實上,GQL 標準并未規定返回數據的顯示方式。下面是一種可能的展示方式,以可視化圖的形式:
圖可視化工具能夠展示出查詢到的數據之間的關系,并在需要時展開顯示更多細節。
而數據的另一種展示方式是文本。
MATCH (a {firstname: 'Avery'})-[b]->(c)RETURN a.firstname, b, c.name+------------------------------------------------------------+| a.firstname | b | c.name |+------------------------------------------------------------+| "Avery" | [:LivesIn {since: 1980-07-15}] | "Granville" || "Avery" | [:HasPet] | "Unique" |+------------------------------------------------------------+
GQL GPM 支持更復雜的查詢,例如:量化路徑模式。例如:
/* 簡單的查詢 */MATCH ((a)-[r]->(b)){1,5}RETURN a, r, b
此示例將查找一個點 a 認識(r)另外一個點 b 的路徑,而這個路徑長度最多為 5,即一個五跳查詢。當然,GQL 支持你演變出更復雜的量化路徑模式。
- 增刪改圖數據
上面示例中的 GQL 數據是使用 INSERT 語句創建的。例如:
/* 插入 1 個點 */INSERT (:Pet {name: 'Unique', pettype: 'Dog'})
在這個示例中,“Pet”是一個標簽,而“name”和“pettype”是標簽的屬性。標簽是可以存在或不存在的標識符。屬性則是名稱和值的組合。無論是點(頂點)還是邊(關系),都可以擁有標簽和屬性。
在 GQL 表達中,點被圓括號()包圍,邊則被方括號[]包圍。
同樣的,GQL 的插入語句也能用上復雜的圖模式。下面的語句將插入兩個點,以及它們之間的一條邊。
/* 插入 2 個點及 1 條邊 */INSERT (:Person {firstname: 'Avery' ,lastname: 'Stare' ,joined: date("2022-08-23")}) -[:LivesIn {since: date("2022-07-15")}]-> (:City {name: 'Granville' ,state: 'OH' ,country: 'USA'})
MATCH語句的結果后面也可以接著INSERT語法:
/* 新建一條連接 Avery 和寵物狗 Unique 的邊 */MATCH (a {firstname: 'Avery'}) ,(d {name: 'Unique'})INSERT (a)-[:HasPet]->(d)
在這個示例中,a 和 d 是別名。MATCH 語句定義了它們,并持續有效直到整條 GQL 語句的結束。MATCH 的結果是兩個點表達式返回的點的笛卡爾積。由于每個點表達式僅返回一個點,因此INSERT操作將只插入一條邊。
修改 GQL 數據的方法包括:識別要更新的點或邊,再設置或刪除它們的屬性。例如:
MATCH (d:Pet) where d.name="Unique"SET d.weight_kg=26
MATCH (e {lastname: 'Stare'})REMOVE e.joined
GQL 數據的刪除是通過識別點,斷開(DETACH )其關系,再刪除點來實現的。例如:
/* 刪除 Avery 和相關的點 */MATCH (a {firstname: 'Avery'})-[b]->(c)DETACH DELETE a, c
- 事務
GQL 支持可序列化的事務,且支持額外的自定義事務模式。事務可以通過顯式或隱式的START TRANSACTION語句啟動,并通過COMMIT或ROLLBACK語句結束。GQL 還支持自動事務的啟動和提交。
- Schema Free 與 Fixed Schema 圖
GQL 支持 Schema Free 圖,這種圖對輸入數據沒有任何限制;同時也支持 Fixed Schema 圖,這種圖可以通過定義圖類型來創建,圖類型明確定義了可以存在于該圖中的點和關系的類型。
Schema Free 圖接受插入任意數據。這方便快速啟動數據系統,但數據的控制問題則留給了應用開發者,或者是用戶。
GQL 標準還支持創建圖類型。圖類型是一種數據模板,通過明確規定在基于特定圖類型創建的 Fixed Schema 圖中能夠包含的點類型和邊類型,從而限制圖庫的內容。一個 Fixed Schema 圖只能包含圖類型中規定的點類型和邊類型。
管理員可以在 GQL 模式下,通過目錄層次結構,基于圖類型創建圖。也可以基于單一圖類型創建多個圖。
以下圖類型定義了 2 種點類型和 2 種邊類型:
/* 示例改編自 Alastair Green 2024-03-26 */CREATE GRAPH TYPE /MyFolder/control/fraud_TYPE // DDL (customer:Customer => {id::STRING, name::STRING}), (account:Account => {no::STRING, acct_type::STRING }), (customer)-[:HOLDS]->(account), (account)-[:TRANSFER {amount::INTEGER}]->(account)
使用圖類型創建圖時,圖的內容將被限制為圖類型中所描述的點類型和邊類型。
CREATE GRAPH /MyFolder/control/fraud /* 圖名為 “fraud” */ TYPED /MyFolder/control/fraud_TYPE /* 圖類型是 fraud_TYPE */
當數據修改完成時,修改內容必須符合圖類型指定的限制。如果數據不符合圖類型定義,則該語句會導致異常,并且將進行事務回滾。
USE GRAPH fraudINSERT // DML (d:Customer {id: 'AB23', name: 'Doe'}), (r:Customer {id: 'CH45', name: 'Reiss'}), (a1:Account {no: '25673890', type: 'C'}), (a2:Account {no: '05663981', type: 'C'}), (d)-[:HOLDS]->(a1), (r)-[:HOLDS]->(a2), (a1)-[:TRANSFER {amount: 5000}]->(a2)USE GRAPH fraudMATCH // DQL (c1:Customer)-[:HOLDS]->(a1:Account) -[t:TRANSFER]-> (a2:Account)<-[:HOLDS]-(c2:Customer)RETURN c1.name, a1.no, t.amount, c2.name, a2.no/*'Doe', '25673890', 5000, 'Reiss', '05663981' 1 row returned*/
點和邊與表格相比如何?
在 SQL 數據庫中,數據以記錄的形式存儲在表格中,每個表格都有固定的結構。表格之間的關系可以通過約束來強制實施,但編寫查詢的人(或程序)需要理解表格之間的關系。
在屬性圖數據庫中,抽象級別被提高,允許將一組表格視為一個單元(稱為“數據乘積 Data Product”)。
帶有特定標簽(或多個標簽)的點,在功能上類似于一個表格。然而,MATCH 查詢可以根據點的指定特征來訪問點,而不受標簽的限制。
邊被用來描述節點之間的關系。編寫查詢的人(或程序)可以查詢這些關系,而不需要預先知道這些關系的具體情況。
總結
本文簡要介紹了 GQL 數據庫語言的功能。完整的 GQL 語言還支持額外的功能,這些超出了本文檔的范圍。GQL 數據庫語言的設計考慮了未來的發展,將來準備在目錄中加入更多形式的數據,并已經為返回非表格結果(例如圖)做好了準備。
作為國內圖數據庫領域的先驅,杭州悅數一直致力于推進圖行業前沿技術的進步發展。我們的多位圖數據庫研發專家是ISO/IEC JTC 1/SC 32/WG 3 工作組成員,參與 GQL 標準的制定以及后續版本的更新。后續,我們的專家將更詳細地介紹 GQL 以及它對于圖行業、對于企業用戶的意義和能力,敬請關注。