隨着社交、電商、金融、零售、物聯網等行業的快速發展,現實社會織起了了一張龐大而複雜的關係網,傳統數據庫很難處理關係運算。大數據行業須要處理的數據之間的關係隨數據量呈幾何級數增加,亟需一種支持海量複雜數據關係運算的數據庫,
圖數據庫
應運而生。算法
世界上不少著名的公司都在使用圖數據庫。好比:sql
既然圖數據庫應用這麼普遍,愈來愈多的企業和開發者開始使用它,那它究竟什麼過人之處呢,下面咱們來揭開它的神祕面紗。數據庫
學過數據結構這麼課程的同窗腦海中應該或多或少有圖
的概念。後端
圖由兩個元素組成:節點
和關係
。網絡
每一個節點表明一個實體(人,地,事物,類別或其餘數據),每一個關係表明兩個節點的關聯方式。這種通用結構能夠對各類場景進行建模 - 從道路系統到設備網絡,到人口的病史或由關係定義的任何其餘事物。數據結構
圖數據庫(Graph database)
並不是指存儲圖片的數據庫,而是以圖
這種數據結構存儲和查詢數據。架構
圖形數據庫
是一種在線數據庫管理系統,具備處理圖形數據模型的建立,讀取,更新和刪除(CRUD)操做。nosql
與其餘數據庫不一樣,關係
在圖數據庫中佔首要地位。這意味着應用程序沒必要使用外鍵或帶外處理(如MapReduce)來推斷數據鏈接。分佈式
與關係數據庫或其餘NoSQL數據庫相比,圖數據庫的數據模型也更加簡單,更具表現力。工具
圖形數據庫是爲與事務(OLTP)系統一塊兒使用而構建的,而且在設計時考慮了事務完整性和操做可用性。
根據存儲和處理模型不一樣,市面上圖數據庫也有一些區分。
好比:
Neo4J
就是屬於原生圖數據庫,它使用的後端存儲是專門爲Neo4J這種圖數據庫定製和優化的,理論上說能更有利於發揮圖數據庫的性能。
而JanusGraph
不是原生圖數據庫,而將數據存儲在其餘系統上,好比Hbase。
一些圖數據庫使用原生圖存儲
,這類存儲是通過優化的,而且是專門爲了存儲和管理圖而設計的。並非全部圖數據庫都是使用原生圖存儲,也有一些圖數據庫將圖數據序列化,而後保存到關係型數據庫或者面向對象數據庫,或其餘通用數據存儲中。
原生圖處理(也稱爲無索引鄰接
)是處理圖數據的最有效方法,由於鏈接的節點在數據庫中物理地指向彼此。非本機圖處理使用其餘方法來處理CRUD操做。
NoSQL數據庫大體能夠分爲四類:
分類 | 數據模型 | 優點 | 劣勢 | 舉例 |
---|---|---|---|---|
鍵值數據庫 | 哈希表 | 查找速度快 | 數據無結構化,一般只被看成字符串或者二進制數據 | Redis |
列存儲數據庫 | 列式數據存儲 | 查找速度快;支持分佈橫向擴展;數據壓縮率高 | 功能相對受限 | HBase |
文檔型數據庫 | 鍵值對擴展 | 數據結構要求不嚴格;表結構可變;不須要預先定義表結構 | 查詢性能不高,缺少統一的查詢語法 | MongoDB |
圖數據庫 | 節點和關係組成的圖 | 利用圖結構相關算法(最短路徑、節點度關係查找等) | 可能須要對整個圖作計算,不利於圖數據分佈存儲 | Neo4j、JanusGraph |
關係型數據庫其實是不擅長處理關係的。不少場景下,你的業務需求徹底超出了當前的數據庫架構。
舉個栗子:假設某關係型數據庫中有這麼幾張用戶、訂單、商品表:
當咱們要查詢:「用戶購買了那些商品?」 或者 「該商品有哪些客戶購買過?」 須要開發人員JOIN幾張表,效率很是低下。
而「購買該產品的客戶還購買了哪些商品?」相似的查詢幾乎不可能實現。
關係查詢性能對比
在數據關係中心,圖形數據庫在查詢速度方面很是高效,即便對於深度和複雜的查詢也是如此。在《Neo4j in Action》這本書中,做者在關係型數據庫
和圖數據庫(Neo4j)之間進行了實驗。
他們的實驗試圖在一個社交網絡裏找到最大深度爲5的朋友的朋友。他們的數據集包括100萬人,每人約有50個朋友。實驗結果以下:
深度 | MySQL執行時間(s) | Neo4J執行時間(s) | 返回記錄數 |
---|---|---|---|
2 | 0.016 | 0.01 | ~2500 |
3 | 30.267 | 0.168 | ~110 000 |
4 | 1543.505 | 1.359 | ~600 000 |
5 | 未完成 | 2.132 | ~800 000 |
在深度爲2時(即朋友的朋友),兩種數據庫性能相差不是很明顯;深度爲3時(即朋友的朋友的朋友),很明顯,關係型數據庫的響應時間30s,已經變得不可接受了;深度到4時,關係數據庫須要近半個小時才能返回結果,使其沒法應用於在線系統;深度到5時,關係型數據庫已經沒法完成查詢。而對於圖數據庫Neo4J,深度從3到5,其響應時間均在3秒之內。
能夠看出,對於圖數據庫來講,數據量越大,越複雜的關聯查詢,約有利於體現其優點。從深度爲4/5的查詢結果咱們能夠看出,圖數據庫返回了整個社交網絡一半以上的人數。
根據DB-Engines最新發布的圖數據庫排名,Neo4J仍然大幅領先排在第一位:
Neo4J是由Java實現的開源圖數據庫。自2003年開始開發,直到2007年正式發佈初版,並託管於GitHub上。
Neo4J支持ACID,集羣、備份和故障轉移。目前Neo4J最新版本爲3.5,分爲社區版和企業版,社區版只支持單機部署,功能受限。企業版支持主從複製和讀寫分離,包含可視化管理工具。
JanusGraph是一個Linux基金會下的開源分佈式圖數據庫 。JanusGraph提供Apache2.0軟件許可證。該項目由IBM、Google、Hortonworks支持。JanusGraph是由TitanDB 圖數據庫修改而來,TitanDB從2012年開始開發。目前最新版本爲0.3.1。
JanusGraph支持多種儲存後端(包括Apache Cassandra、Apache HBase、Bigtable、Berkeley DB)。JanusGraph的可擴展性取決於與JanusGraph一塊兒使用的基礎技術。例如,經過使用Apache Cassandra做爲存儲後端,能夠將JanusGraph簡單地擴展到多個數據中心。
JanusGraph經過與大數據平臺(Apache Spark,Apache Giraph,Apache Hadoop)集成,支持全局圖數據的分析、報告和ETL。
JanusGraph經過外部索引存儲(Elasticsearch,Solr,Lucene)支持地理、數字範圍和全文搜索。
Cypher是Neo4j的圖形查詢語言,容許用戶存儲和檢索圖形數據庫中的數據。
舉例,咱們要查找Joe的因此二度好友:
查詢語句以下:
MATCH (person:Person)-[:KNOWS]-(friend:Person)-[:KNOWS]- (foaf:Person) WHERE person.name = "Joe" AND NOT (person)-[:KNOWS]-(foaf) RETURN foaf
Joe認識Sally,Sally認識Anna。 Bob被排除在結果以外,由於除了經過Sally成爲二級朋友以外,他仍是一級朋友。
圖數據庫應對的是當今一個宏觀的商業世界的大趨勢:憑藉高度關聯、複雜的動態數據,得到洞察力和競爭優點。國內愈來愈多的公司開始進入圖數據庫領域,研發本身的圖數據庫系統。對於任何達到必定規模或價值的數據,圖數據庫都是呈現和查詢這些關係數據的最好方式。而理解和分析這些圖的能力將成爲企業將來最核心的競爭力。