一文了解各大圖資料庫查詢語言 | 操作入門篇

2021-02-13 Nebula Graph Community
文章的開頭我們先來看下什麼是圖資料庫,根據維基百科的定義:圖資料庫是使用圖結構進行語義查詢的資料庫,它使用節點、邊和屬性來表示和存儲數據。雖然和關係型資料庫存儲的結構不同(關係型資料庫為表結構,圖資料庫為圖結構),但不計各自的性能問題,關係型資料庫可以通過遞歸查詢或者組合其他 SQL 語句(Join)完成圖查詢語言查詢節點關係操作。得益於 1987 年 SQL 成為國際標準化組織(ISO)標準,關係型資料庫行業得到了很好的發展。同 60、70 年代的關係型資料庫類似,圖資料庫這個領域的查詢語言目前也沒有統一標準,雖然 19 年 9 月經過國際 SQL 標準委員會投票表決,決定將圖查詢語言(Graph Query Language)納為一種新的資料庫查詢語言,但 GQL 的制定仍需要一段時間。

介於市面上沒有統一的圖查詢語言標準,在本文中我們選取市面上主流的幾款圖查詢語言來分析一波用法,由於篇幅原因本文旨在簡單介紹圖查詢語言和常規用法,更詳細的內容將在進階篇中講述。

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 跳關係。

返回指定兩點路徑

說了一通語法之後,是時候展示真正的技術了——來個具體一點的例子。實操示例使用了 Janus Graph 的示例圖 The Graphs of Gods。該圖結構如下圖所示,描述了羅馬萬神話中諸神關係。

最後是 Nebula 的 GitHub 地址,歡迎大家試用,有什麼問題可以向我們提 issue。GitHub 地址:https://github.com/vesoft-inc/nebula 或戳「閱讀原文」直接跳轉;加入 Nebula Graph 交流群,請聯繫 Nebula Graph 官方小助手微信號:NebulaGraphbot

由於篇幅,更複雜的語法將在本系列的後續文章中繼續。歡迎在論壇留言,論壇地址:https://discuss.nebula-graph.io/

相關焦點

  • Python操作Mysql資料庫進階篇——查詢操作詳解(一)
    前面我們已經介紹了在Python3.x中如何連接一個Mysql資料庫,以及怎麼樣對這個資料庫創建一個表,增刪改查表裡的數據。想必大家對Mysql資料庫和簡單的sql語句有了一定的了解,其實sql語句博大精深,裡面的知識點非常的多,估計介紹一個星期也難以介紹全面。今天我們就來通過Mysql這種普遍使用的關係型資料庫來深入了解一下sql語句中比較高級的查詢部分。
  • MongoDB入門篇 · 資料庫管理系統和NoSQL
    在了解MongoDB之前需要先了解下資料庫管理系統。1.1 什麼是數據?數據(英語:data),是指未經過處理的原始記錄。兩者存在許多顯著的不同點,其中最重要的是NoSQL不使用SQL作為查詢語言。其數據存儲可以不需要固定的表格模式,也經常會避免使用SQL的JOIN操作,一般有水平可擴展性的特徵。NoSQL一詞最早出現於1998年,是Carlo Strozzi開發的一個輕量、開源、不提供SQL功能的關係資料庫。
  • 我的實戰經驗分享:深入淺出Python資料庫操作
    本篇適合剛入門Python、已經學習了一些基礎,想要關聯學習資料庫相關操作的朋友們~先前聽到一些朋友的反饋說,Python語言本身是很輕鬆地入門了
  • Django查詢資料庫操作詳解(一)
    在 web 開發過程中,Django 與後臺資料庫的交互是必不可少的一項,也是實現業務邏輯所需數據的重要方式,所以 Django 的表查詢操作就顯的尤為重要
  • Python零基礎入門教程,如何操作資料庫?
    資料庫操作基本過程資料庫連接對象Connection# 連接sqlite資料庫conn = sqlite3# 建立資料庫連接 conn = sqlite3.connect('test.db') # 創建遊標對象 cursor = conn.cursor() # 執行sql插入操作
  • 產品經理必須要看的資料庫閱讀、操作基礎知識
    懂前端、客戶端開發知識、資料庫開發知識是一個避免採坑的實用技能。 我認為產品經理要掌握的資料庫基礎知識分為2類 學會看資料庫,第二個操作資料庫。 資料庫的查看 從數據產品經理到普通後臺的架構基礎產品經理,都離不開資料庫知識。 如下是1個資料庫的表單操作,你可以看懂SQL語句是為了幹什麼做數據操作的嗎? 不會資料庫的產品經理像看一本無字天書一樣,不知道內容是什麼。
  • MySQL資料庫常用操作語言總結
    SQL語言共分為四大類:數據查詢語言DQL,數據操縱語言DML,數據定義語言DDL,數據控制語言DCL。
  • 資料庫語言 SQL 零基礎入門指引
    而很多人一看這名字(XX語言),還有這個莫名其妙的縮寫(SQL),不禁讓人望而卻步。當然,這其中也曾經包括我自己。那麼什麼叫「曾經望而卻步」?就是我自己學了才發現:資料庫語言太TM好使、方便、功能強大!非常後悔學晚了,重點是這種語言學習起來還非常簡單。
  • 第02篇:SQL資料庫的四種基本操作「增刪改查」
    操作資料庫使用的是SQL語言,其全稱:結構化查詢語言(Structured Query Language)。這是一門標準的計算機語言,用來訪問和操作資料庫系統。SQL語言結構簡潔,功能強大,簡單易學,得到了非常廣泛的應用,成為資料庫操作的必備語言。後來微軟對SQL語言做了擴展,即:T-SQL,擴展的SQL語言,包含變量、函數、流程控制、注釋等內容,豐富了SQL語言的應用。有關T-SQL的應用,本系列教程會在後面的章節中詳細講解。
  • 一文讀懂數據倉庫、數據集市、資料庫的區別與關聯
    這類資料庫作為公司的單獨數據存儲,負責利用歷史數據對公司各主題域進行統計分析; 那麼為什麼要"分家"?在一起不合適嗎?能不能構建一個同樣適用於操作和分析的統一資料庫? 答案是NO。一個顯然的原因是它們會"打架"......如果操作型任務和分析型任務搶資源怎麼辦呢?再者,它們有太多不同,以致於早已"貌合神離"。
  • R語言從入門到精通:Day1
    今天是我們的系統教程《R語言從入門到精通》的第一講,前面的背景講解中《從今天開始,每天學點R語言~》,已經深入探討過R語言的重要性以及學習R語言的必要性
  • 時序資料庫入門系列: 時序數據的查詢
    上篇文章時序資料庫入門系列:什麼是時序資料庫介紹了時序資料庫的定義和發展趨勢,這次接著分享下時序資料庫的查詢相關的概念。
  • 資料庫之SQL查詢語句
    SQL(Structured Query Language) :結構化查詢語言 SQL是在關係資料庫上執行數據操作
  • Python基礎教程——秒懂django操作資料庫
    現在,先上結論:如果我們只是很簡單的操作一下資料庫,我們推薦使用mysqlclient這個第三方庫如果對資料庫的操作要做一些處理,資料庫又會變動,或者業務需求比較複雜,那就推薦使用django簡易操作代碼實在太簡單,如下所示:
  • SQL語言基礎:資料庫語言概念介紹
    1、概念介紹SQL(Structured Query Lanauage)結構化查詢語言是關係資料庫中最普遍使用的語言。主要包括查詢、數據操縱、數據定義、數據控制功能,是一種通用的、功能強大的關係資料庫的標準語言。
  • Python接口自動化之pymysql資料庫操作
    在自動化過程中,我們需要查詢資料庫,校驗結果是否正確,比如充值完成之後,需要查詢資料庫,查看充值是否成功。pymysql介紹及安裝01 pymysql介紹MySQL應該說是如今使用最為普遍的資料庫了,沒有之一,而Python作為最為流行的語言之一,自然少不了與MySQL打交道,其中PyMySQL就是使用最多的工具庫。
  • 又一國產資料庫誕生!騰訊發布 TGDB,實時查詢比 Neo4j 快 20-150 倍!
    近日,又一國產資料庫誕生!這次是騰訊家推出的分布式圖資料庫產品——騰訊雲數圖 TGDB(Tencent Graph Database)。據稱,這款資料庫能夠實現萬億級關聯關係數據實時查詢,高效處理異構數據,支持實時圖計算。從理論上說,該圖資料庫的集群節點規模可以達到萬臺以上,在不同的公開數據集下查詢速度比世界市場佔有率最高的 Neo4j 快 20-150 倍!
  • JAVA-新手入門:JAVA資料庫基本操作指南
    java 資料庫基本操作  1、java資料庫操作基本流程  2、幾個常用的重要技巧:  ·可滾動、更新的記錄集  ·批量更新  ·事務處理java資料庫操作基本流程:取得資料庫連接 - 執行sql語句 - 處理執行結果 - 釋放資料庫連接基礎視頻有挺多的你是看你的學習欲望!!!!
  • Python 操作MySQL資料庫
    Python 使用操作MySQL第一步:
  • 一文搞定「關係型資料庫」與「非關係型資料庫」
    >非關係型資料庫(NoSQL)所謂非關係型資料庫,其實是相對於關係型資料庫而言的,我們都知道關係型資料庫通常都是處理一些結構化的數據,這些數據通常都是有某些對應關係; 而非關係型資料庫(NoSQL)通常用於存儲那些類型不固定的,也沒有什麼規律的數據。