介於市面上沒有統一的圖查詢語言標準,在本文中我們選取市面上主流的幾款圖查詢語言來分析一波用法,由於篇幅原因本文旨在簡單介紹圖查詢語言和常規用法,更詳細的內容將在進階篇中講述。
Gremlin 是 Apache ThinkerPop 框架下的圖遍歷語言。Gremlin 可以是聲明性的也可以是命令性的。雖然 Gremlin 是基於 Groovy 的,但具有許多語言變體,允許開發人員以 Java、JavaScript、Python、Scala、Clojure 和 Groovy 等許多現代程式語言原生編寫 Gremlin 查詢。
支持圖資料庫:Janus Graph、InfiniteGraph、Cosmos DB、DataStax Enterprise(5.0+) 、Amazon Neptune
Cypher 是一個描述性的圖形查詢語言,允許不必編寫圖形結構的遍歷代碼對圖形存儲有表現力和效率的查詢,和 SQL 很相似,Cypher 語言的關鍵字不區分大小寫,但是屬性值,標籤,關係類型和變量是區分大小寫的。
支持圖資料庫:Neo4j、RedisGraph
nGQL 是一種類 SQL 的聲明型的文本查詢語言,nGQL 同樣是關鍵詞大小寫不敏感的查詢語言,目前支持模式匹配、聚合運算、圖計算,可無嵌入組合語句。
支持圖資料庫:Nebula Graph
比較這 3 個圖查詢語言之前,我們先來看看他們各自的術語,如果你翻閱他們的文檔會經常見到下面這些「關鍵字」,在這裡我們不講用法,只看這些圖資料庫常用概念在這 3 個圖資料庫文檔中的叫法。
我們可以看到大體上對點和邊的叫法類似,只不過 Cypher 中直接使用了 Relationship 關係一詞代表邊。其他的術語基本都非常直觀。
了解過 Gremlin、Cypher、nGQL 中常見的術語之後,我們來看看使用這 3 個圖查詢語言過程中會需要了解的常規語法。
圖結構由點和邊組成,一條邊連接兩個點。在 Gremlin 和 nGQL 中稱之為 Vertex,Cypher 則稱之為 Node。如何在圖資料庫中新建一個點呢?可以參考下面的語法
點類型
點允許有對應的類型,在 Gremlin 和 Cypher 叫 label ,在 nGQL 中為 tag 。點類型可對應有多種屬性(Property),例如 Person 可以有 name、age 等屬性。
創建點類型
點類型相關的語法示例如下:
這裡說明下,無論在 Gremlin 和 nGQL 中存在類似 IF NOT EXISTS 用法,即:如果不存在則創建,存在則直接返回。
查看點類型
創建好點之後如何查看點類型呢,可以參考以下方式。
點的 CRUD上面簡單介紹了點、點類型,下面進入資料庫基本 DML——CRUD,在上文介紹點時順便介紹了點的創建和插入,這裡說下如何插入特定類型的點,和點的獲取、刪除和更新。
插入特定類型點
和插入點的操作類似,只不過需要指定某種點類型。語法參考:
查看點
刪除點
術語篇中提過 nGQL 中刪除操作對應單詞有 Delete 和 Drop ,在 nGQL 中 Delete 一般用於點邊,Drop 用於 Schema 刪除,這點和 SQL 的設計思路是一樣的。
更新點用資料庫的小夥伴都知道數據的常態是數據變更,來瞅瞅這 3 個圖查詢是使用什麼語法來更新點數據的吧
可以看到 Cypher 和 nGQL 都使用 SET 關鍵詞來設置點對應的類型值,只不過 nGQL 中多了 UPDATE 關鍵詞來標識操作,Gremlin 的操作和上文提到的查看點類似,只不過增加了變更 property 值操作。在 Gremlin 和 nGQL 稱呼邊為 Edge,而 Cypher 稱之為 Relationship。下面進入到邊相關的語法內容
邊類型
和點一樣,邊也可以有對應的類型
邊的 CRUD
說完邊類型應該進入到邊的常規操作部分了
插入指定邊類型的邊可以看到和點的使用語法類似,只不過在 Cypher 和 nGQL 中分別使用 -[]-> 和 -> 來表示關係,而 Gremlin 則用 to() 關鍵詞來標識指向關係,在使用這 3 種圖查詢語言的圖資料庫中的邊均為有向邊,下圖左邊為有向邊,右邊為無向邊。
刪除邊
查看指定邊
除了常規的點、邊 CRUD 外,我們可以簡單看看這 3 種圖查詢語言的組合查詢。
指定點查指定邊沿指定點反向查詢指定邊在反向查詢中,Gremlin 使用了 in 來表示反向關係,而 Cypher 則更直觀的將指向箭頭反向變成 <- 來表示反向關係,nGQL 則用關鍵詞 REVERSELY 來標識反向關係。
無向遍歷如果在圖中,邊的方向不重要(正向、反向都可以),那 Gremlin 使用 both() ,Cypher 使用 -[]- ,nGQL使用關鍵詞 BIDIRECT 。
沿指定點查詢指定邊 N 跳
Gremlin 和 nGQL 分別用 times 和 step 來表示 N 跳關係,而 Cypher 用 relationship*1..N 來表示 N 跳關係。
返回指定兩點路徑
最後是 Nebula 的 GitHub 地址,歡迎大家試用,有什麼問題可以向我們提 issue。GitHub 地址:https://github.com/vesoft-inc/nebula 或戳「閱讀原文」直接跳轉;加入 Nebula Graph 交流群,請聯繫 Nebula Graph 官方小助手微信號:NebulaGraphbot
由於篇幅,更複雜的語法將在本系列的後續文章中繼續。歡迎在論壇留言,論壇地址:https://discuss.nebula-graph.io/