高性能內存圖數據庫RedisGraph(一)


     作為一種簡單、通用的數據結構,圖可以表示數據對象之間的復雜關系。生物信息學、計算機網絡和社交媒體等領域中產生的大量數據,往往是相互連接、關系復雜且低結構化的,這類數據對傳統數據庫而言十分棘手,一個簡單的操作都經常涉及多張表的連接,導致性能低下。對於這類數據,將其表示為圖結構並存儲在專用的圖數據庫中是最佳的處理方案。RedisGraph是高性能內存數據庫Redis的圖模塊,它由Redis實驗室開發,用於向Redis添加圖形數據庫功能。RedisGraph創新地將圖數據表示為稀疏矩陣並利用GraphBLAS將圖形操作轉換為對矩陣的操作,同時還保留了Redis的單線程運行和完全基於內存的特點,這些特別之處為RedisGraph帶來了獨特的性能優勢。

      由於RedisGraph發布時間較晚,目前的資料不夠完善,使用者較少,社區也不夠活躍。我因畢設需要,對RedisGraph進行了積極的探索,並基於其在性能上的優勢以及其對多種圖算法的支持,在Linux環境下用C語言編程實現了三個實用接口的封裝。此外,我還實現了增刪圖數據等基本操作的封裝,並使用GTK+編寫了完整的圖形界面,對圖數據及查詢結果進行了可視化處理。我搜集了網上現有的幾乎所有關於RedisGraph的文檔、博客,最終完成了我的畢設。這期間,最痛苦的階段就是搜集資料,因為現在RedisGraph還是太新,太冷門了,中文資料幾乎是沒有的,有個問題我甚至是向RedisGraph的開發者提問才搞明白。但是RedisGraph的確是個十分出色的小型內存圖數據庫,在很多場景下都有着獨特的性能優勢。如果有人有需要的話,請在下方評論或者點個贊,我會在接下來把我已有的經驗記錄在這里,幫助他人的同時,也避免我這幾個月的努力付諸東流。

      首先,先介紹一下RedisGraph。RedisGraph是Redis實驗室開發的一個Redis模塊,用於將圖形數據庫功能添加到Redis數據庫中。RedisGraph使用鄰接矩陣的形式表示相互連接的數據,通過將數據表示為稀疏矩陣,並且利用GraphBLAS的功能,RedisGraph提供了一種快速且高效的存儲、管理和處理圖的方式。

      那么什么是GraphBLAS呢?GraphBLAS是一個用於稀疏矩陣操作的高度優化的庫,其開發者致力於將基於矩陣的圖算法的潛力帶給盡可能廣泛的受眾。從數學上講,GraphBLAS定義了一組基於矩陣的核心圖形操作,這些操作可用於在廣泛的編程背景中實現廣泛的圖形算法類。圖由頂點與邊的連接構成,使用鄰接矩陣或關聯矩陣表示十分廣泛的圖。鄰接矩陣通常更容易分析,而關聯矩陣通常更適合表示數據。幸運的是,這兩種矩陣都可以通過矩陣的乘法十分方便地連接起來。矩陣數學的一個關鍵特征是,非常少量的矩陣運算就可以操作非常廣泛的圖形。這種少量運算的可組合性是GraphBLAS的基礎。GraphBLAS利用矩陣和圖之間的對偶性,通過提供少量高度優化的操作,使大范圍的圖分析成為可能。這些數學運算已經被開發成一個C標准庫,並在SuiteSparse GraphBLAS庫中實現。

     基於GraphBLAS這一高性能線性代數庫,RedisGraph實現了增強的矩陣遍歷方法,利用稀疏鄰接矩陣的形式表示相關聯的數據,並利用GraphBLAS.org上的標准化引擎,實用線性代數和壓縮矩陣表示法來克服性能和規模方面的挑戰。RedisGraph簡化了對高度關聯的可變數據的遍歷,以應對復雜的問題並提供相關的見解。其利用高度關聯的圖數據中復雜的動態關系,在各種不同的用例中提供新的見解和情報,包括實時推薦引擎、個性化、欺詐識別、網絡安全、社交網絡、360度客戶視角等等。

     研究過圖數據庫的朋友應該都聽過Neo4j,玩過Neo4j的應該都知道Cypher。Cypher語言是由圖形數據庫Neo4j推出的查詢語言[29],相比於TigerGraph的GSQL查詢語言,Cypher對於SQL語言的用戶來說不是那么友好。但是由於Neo4j在圖數據庫中遙遙領先的流行度,以及Cypher本身並不復雜的語法,RedisGraph的開發者決定,不再在查詢語言上造輪子,而是直接選用Cypher作為RedisGraph所支持的查詢語言。RedisGraph提供了一個使用圖形查詢語言Cypher的應用程序接口,供開發者和用戶使用Cypher語言對RedisGraph中的圖數據進行操作。但為了提高適配性,將用戶提供的Cypher查詢語句轉換為對矩陣的操作,Redis Labs自行編寫了專用的解釋器。他們使用Lex作為標記器,使用Lemon生成C目標解析器。該解釋器可將來自Cypher的查詢轉換為a.o.圖遍歷的查詢執行計划,然后將a.o.圖遍歷轉換為利用GraphBLAS實現的在稀疏矩陣上進行的線性代數運算。也就是說,只需要幾步簡單的矩陣運算,就可以實現很復雜的圖查詢操作,速度提升了不止一個數量級。目前RedisGraph僅支持Cypher語言的一個子集,隨着開發的進行,支持的范圍在不斷擴大。你可以在Redis Labs維護的教程頁面中查看最新的支持情況,后續我也會專門開一篇來從頭介紹Cypher的常用語句(在RedisGraph已經支持的范圍內)。

     提到了Neo4j,下面我就介紹一下圖數據庫市場的情況。近些年,主流數據庫中OriendDB、Neo4j、ArangoDB等數據庫都得到廣泛使用。並且許多新型圖數據庫也陸續被開發與推出,例如TigerGraph、SeQuery、Graphflow、RedisGraph等。它們往往都采用了不同的解決方案,從而對不同的實際應用場景進行處理。

     Neo4j公司開發的Neo4j,是一個基於磁盤(而非內存)的、嵌入式的、具備完全事務特性的Java持久化引擎。Neo4j是目前“DB-Engines Ranking”榜上流行度排名第一的圖數據庫,它有開源社區免費版與商業版可供選擇。Neo4j使用Java進行開發,並且支持其他編程語言以Cypher查詢語言為媒介調用Neo4j進行操作。在通信協議方面,用戶可以使用通用的HTTP協議或是Neo4j公司自創的二進制Bolt協議發送對Neo4j的操作請求。

    JanusGraph圖數據庫是一款開源分布式圖數據庫,它受管於非盈利組織Linux基金會。JanusGraph圖數據庫的開發背后還有許多公司的支持,例如Google與IBM。因此在使用圖數據庫與其他項目進行協作時,JanusGraph的使用十分靈活。用戶可以自由選擇JanusGraph的底層支持引擎,且可以分屬於不同公司,如Cassandra、Apache基金會的Hbase、Oracle公司的BerkeleyDB、Google公司的雲端BigTable等等。

    TigerGraph相對較新,但它憑借高伸縮性的特點與高性能的優勢,迅速搶占了可觀的市場份額。使用TigerGraph,用戶可以根據自己對數據庫速度與容量的需求對圖數據庫進行縮放。TigerGraph支持導入大型數據集,且導入速度遠超Neo4j等主流圖數據庫。而且它對大型數據集的支持性也很好,使用TigerGraph的遍歷查詢速度可以達到單機每秒上億條。另外,TigerGraph使用的圖查詢語言GSQL也使得它更受歡迎。因為相較於Neo4j所自創的Cypher查詢語言,GSQL與關系型數據庫通用的查詢語言SQL更為類似。對於SQL用戶來說,GQL的學習成本更低、使用體驗更友好。

     RedisGraph圖數據庫是Redis Labs開發的Redis模塊,用於向高性能非關系型數據庫Redis添加圖形數據庫的功能。RedisGraph不僅保留了Redis數據庫所特有的完全單線程運行與完全基於內存的特點,而且還創新地把圖數據表示成稀疏矩陣並且利用GraphBLAS(一種用於對稀疏矩陣進行操作的高度優化庫)將圖操作轉換為對內部稀疏矩陣的操作。這樣的特點為RedisGraph帶來了極其明顯的性能優勢,但與此同時,對高性能的追求也給RedisGraph帶來了一些弊端。首先,由於RedisGraph完全基於內存,因此隨着數據集的增大,其對設備的配置要求較高,增大內存支持所帶來的成本提升也很大,因此RedisGraph不適合用於處理大規模數據集。其次,由於其采用了全新的方式存儲、處理圖數據,對於不同的查詢操作,都需要對底層進行設計,且RedisGraph是2018年才發布初代版本,因此RedisGraph目前支持的圖查詢操作的范圍有限。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM