一、圖數據庫neo4j和spark下面的graphx有什么區別
neo4j是native graph database,也就是有自己的數據庫存儲。它的長處在于支持交互式查詢,屬于oltp系統,很多人說不支持分片存儲使其無法應付海量數據,本人覺得恰恰相反,可以說neo4j的存儲方式是教科書式的以空間換時間,每臺服務器配備ssd磁盤陣列雖然貴,但是可以大幅減少分片存儲的帶寬占用和通信時間開銷,保證oltp的效率。
neo4j很容易上手,特有的cypher查詢語言以畫草圖的方式查詢和建模數據,很直觀。適當構建查詢計劃的情況下,neo4j的查詢效率很高,能夠迅速從整網中找出符合特定模式的子網,供隨后分析之用。
此外,neo4j實現了tinkerpop接口,tinkerpop是剛剛畢業的一個阿帕奇項目,有望建立圖數據庫的一套標準用戶接口。同樣實現tinkerpop的還有titan,orient等主流圖數據庫。
再來看graphX。
graphX是spark的系統組件,存儲是基于spark rdd的,有節點和邊兩種rdd。熟悉spark的朋友對rdd該不會陌生,spark通過緩存rdd的操作節省了大量計算和io開支,因此spark特別適合對海量數據進行運算,此理同樣適用于graphX。因此,graphX自設計之初就是奔著圖計算的目標去的,屬于olap系統,而非oltp系統。
graphX有豐富的函數庫,能完成很多經典圖算法,如pagerank、三角計數、社群發現、最短路徑計算等等。此外,圖存儲和計算的方式不禁讓人想到神經網絡算法,如果將隱層用節點rdd表示,隱層之間的邊用邊rdd表示,運用graphX的計算優勢搭建起一套多層神經網絡的想法很美妙,這應該就是MLlab相應算法模塊的工作原理。
因此跟graphx相關的概念集中在圖計算,而非圖存儲和查詢領域。所以經常瀏覽db-engines的朋友們不難發現,圖數據庫列表里就沒有graphx這一項。在比較圖存儲和圖查詢性能時,比較集合多是neo4j、orientdb、titan、arangodb等圖數據庫系統。而比較圖計算時,比較集合多是graphlab、giraph、graphX。
簡言之,圖數據庫系統和圖計算系統不是一回事:前者是為了存儲完整數據,并根據需求從中查詢數據子集供分析展示之用;后者的任務是拿到一個圖結構的數據集,從中計算一些有用的東西。
如果你有隨時增長的海量數據,希望以圖的方式存儲這些數據,從而能在需要時順利挖出一個子圖來,那就要借助于圖數據庫,此時如果你有充足的資金,neo4j是不二之選,否則就要從db-engines里面第二名以后的一眾數據庫里挑選。進一步,如果你的需求不只停留在查詢,還要依據查詢結果計算出一些圖的特征來,那么建議你將圖數據庫系統同圖計算系統聯合使用。
延伸閱讀:
二、圖數據庫優點有什么
使用圖(或者網)的方式來表達現實世界的關系很直接、自然,易于建模。比如某人喜歡看某電影,就可以建立一條邊連接這個人和這部電影,這條邊就叫做“喜歡”邊,同時這個人還可以有其它邊,比如“朋友”邊、“同學”邊等,同樣這個電影也可以有其它邊,比如“導演”邊、“主演”邊等,這樣就構建了自然的關系網。圖數據庫可以很高效的插入大量數據。圖數據庫面向的應用領域數據量可能都比較大,比如知識圖譜、社交關系、風控關系等,總數據量級別一般在億或十億以上,有的甚至達到百億邊。mysql不做分表分庫的情況下插入百萬數據基本就慢到不行,圖數據庫基本能勝任億級以上的數據,比如neo4j、titan(janus)、hugegraph等圖數據庫,持續插入十億級的數據基本還能保持在一個較高的速度。圖數據庫可以很高效的查詢關聯數據。傳統關系型數據庫不擅長做關聯查詢,特別是多層關聯(比如查我的好友的好友有哪些人),因為一般來說都需要做表連接,表連接是一個很昂貴的操作,涉及到大量的IO操作及內存消耗。圖數據庫對關聯查詢一般都進行針對性的優化,比如存儲模型上、數據結構、查詢算法等,防止局部數據的查詢引發全部數據的讀取。