1. 程式人生 > >一文了解各大圖資料庫查詢語言(Gremlin vs Cypher vs nGQL)| 操作入門篇

一文了解各大圖資料庫查詢語言(Gremlin vs Cypher vs nGQL)| 操作入門篇

文章的開頭我們先來看下什麼是圖資料庫,根據維基百科的定義:**圖資料庫是使用圖結構進行語義查詢的資料庫,它使用節點、邊和屬性來表示和儲存資料**。 雖然和關係型資料庫儲存的結構不同(關係型資料庫為表結構,圖資料庫為圖結構),但不計各自的效能問題,關係型資料庫可以通過遞迴查詢或者組合其他 SQL 語句(Join)完成圖查詢語言查詢節點關係操作。得益於 1987 年 SQL 成為國際標準化組織(ISO)標準,關係型資料庫行業得到了很好的發展。同 60、70 年代的關係型資料庫類似,圖資料庫這個領域的查詢語言目前也沒有統一標準,雖然 19 年 9 月經過國際 SQL 標準委員會投票表決,決定將圖查詢語言(Graph Query Language)納為一種新的資料庫查詢語言,但 GQL 的制定仍需要一段時間。 ![image](https://user-images.githubusercontent.com/38887077/75741236-f357d380-5d44-11ea-8c43-65283b49bbef.png) 介於市面上沒有統一的圖查詢語言標準,在本文中我們選取市面上主流的幾款圖查詢語言來分析一波用法,由於篇幅原因本文旨在簡單介紹圖查詢語言和常規用法,更詳細的內容將在進階篇中講述。 ## 圖查詢語言·介紹 ![image](https://user-images.githubusercontent.com/38887077/75741240-f5ba2d80-5d44-11ea-80f6-f44d39fff43a.png) ### 圖查詢語言 Gremlin [Gremlin](https://tinkerpop.apache.org/gremlin.html) 是 Apache ThinkerPop 框架下的圖遍歷語言。Gremlin 可以是**宣告性**的也可以是**命令性**的。雖然 Gremlin 是基於 Groovy 的,但具有許多語言變體,允許開發人員以 Java、JavaScript、Python、Scala、Clojure 和 Groovy 等許多現代程式語言**原生編寫 Gremlin 查詢**。 支援圖資料庫:Janus Graph、InfiniteGraph、Cosmos DB、DataStax Enterprise(5.0+) 、Amazon Neptune ### 圖查詢語言 Cypher Cypher 是一個描述性的圖形查詢語言,允許不必編寫圖形結構的遍歷程式碼對圖形儲存有表現力和效率的查詢,和 SQL 很相似,Cypher 語言的關鍵字不區分大小寫,但是屬性值,標籤,關係型別和變數是區分大小寫的。 支援圖資料庫: Neo4j、RedisGraph、AgensGraph ### 圖查詢語言 nGQL [nGQL](https://github.com/vesoft-inc/nebula/blob/master/docs/manual-CN/1.overview/1.concepts/2.nGQL-overview.md) 是一種類 SQL 的宣告型的文字查詢語言,nGQL 同樣是關鍵詞大小寫不敏感的查詢語言,目前支援模式匹配、聚合運算、圖計算,可無嵌入組合語句。 支援圖資料庫:Nebula Graph ## 圖查詢語言·術語篇 在比較這 3 個圖查詢語言之前,我們先來看看他們各自的術語,如果你翻閱他們的文件會經常見到下面這些“關鍵字”,在這裡我們不講用法,只看這些圖資料庫常用概念在這 3 個圖資料庫文件中的叫法。 | 術語 | Gremlin | Cypher | nGQL | | --- | --- | --- | --- | | 點 | Vertex | Node | Vertex | | 邊 | Edge | Relationship | Edge | | 點型別 | Label | Label | Tag | | 邊型別 | label | RelationshipType | edge type | | 點 ID | vid | id(n) | vid | | 邊 ID | eid | id(r) | 無 | | 插入 | add | create | insert | | 刪除 | drop | delete | delete / drop | | 更新屬性 | setProperty | set | update | 我們可以看到大體上對點和邊的叫法類似,只不過 Cypher 中直接使用了 Relationship 關係一詞代表邊。其他的術語基本都非常直觀。 ## 圖查詢語言·語法篇 瞭解過 Gremlin、Cypher、nGQL 中常見的術語之後,我們來看看使用這 3 個圖查詢語言過程中會需要了解的常規語法。 ### 圖 ```shell # Gremlin 建立圖 g = TinkerGraph.open().traversal() # nGQL 建立圖空間 CREATE SPACE gods ``` ### 點 圖結構由點和邊組成,一條邊連線兩個點。在 Gremlin 和 nGQL 中稱之為 Vertex,Cypher 則稱之為 Node。如何在圖資料庫中新建一個點呢?可以參考下面的語法 ```shell # Gremlin 建立/插入點 g.addV(vertexLabel).property() # Cypher 建立點 CREATE (:nodeLabel {property}) # nGQL 建立/插入點 INSERT VERTEX tagName (propNameList) VALUES vid:(tagKey propValue) ``` #### 點型別 點允許有對應的型別,在 Gremlin 和 Cypher 叫 `label` ,在 nGQL 中為 `tag` 。點型別可對應有多種屬性(Property),例如 _Person _可以有 _name_、_age _等屬性。 ![image](https://user-images.githubusercontent.com/38887077/75741241-f8b51e00-5d44-11ea-8a39-b02a88de44a3.png) ##### 建立點型別 點型別相關的語法示例如下: ```shell # Gremlin 建立點型別 g.addV(vertexLabel).property() # nGQL 建立點型別 CREATE tagName(PropNameList) ``` 這裡說明下,無論在 Gremlin 和 nGQL 中存在類似 `IF NOT EXISTS`  用法,即:如果不存在則建立,存在則直接返回。 ##### 檢視點型別 建立好點之後如何檢視點型別呢,可以參考以下方式。  ```shell # Gremlin 檢視(獲取)點型別 g.V().label().dedup(); # Cypher 檢視點型別方法 1 MATCH (n) RETURN DISTINCT labels(n) # Cypher 檢視點型別方法 2 CALL db.labels(); # nGQL 檢視點型別 SHOW TAGS ``` #### 點的 CRUD 上面簡單介紹了點、點型別,下面進入資料庫基本 DML——CRUD,在上文介紹點時順便介紹了點的建立和插入,這裡說下如何插入特定型別的點,和點的獲取、刪除和更新。 ##### 插入特定型別點 和插入點的操作類似,只不過需要指定某種點型別。語法參考: ```shell # Gremlin 插入特定型別點 g.addV(String vertexLabel).property() # Cypher 插入特定型別點 CREATE (node:label) # nGQL 插入特定型別點 INSERT