图数据库 — neo4j (一)
圖數據庫 — neo4j (一)
隨著社交、電商、金融、零售、物聯網等行業的快速發展,現實社會織起了了一張龐大而復雜的關系網,傳統數據庫很難處理關系運算。大數據行業需要處理的數據之間的關系隨數據量呈幾何級數增長,急需一種支持海量復雜數據關系運算的數據庫,圖數據庫應運而生。
世界上很多著名的公司都在使用圖數據庫。比如:
社交領域:Facebook, Twitter用它來管理社交關系,實現好友推薦。
零售領域:eBay,沃爾瑪使用它實現商品實時推薦,給買家更好的購物體驗。
金融領域:摩根大通,花旗和瑞銀等銀行在用圖數據庫做風控處理。
汽車制造領域:沃爾沃,戴姆勒和豐田等頂級汽車制造商依靠圖數據庫推動創新制造解決方案。
電信領域:Verizon, Orange等電信公司依靠圖數據庫來管理網絡,控制訪問并支持客戶360。
酒店領域:萬豪和雅高酒店等頂級酒店公司依使用圖數據庫來管理復雜且快速變化的庫存。
1、什么是圖數據庫?
圖數據庫(Graph database)并非指存儲圖片的數據庫,而是以圖這種數據結構存儲和查詢數據。
圖數據庫是一種在線數據庫管理系統,具有處理圖形數據模型的創建,讀取,更新和刪除(CRUD)操作。
與其他數據庫不同,關系在圖數據庫中占首要地位。這意味著應用程序不必使用外鍵或帶外處理(如MapReduce)來推斷數據連接。
與關系數據庫或其他NoSQL數據庫相比,圖數據庫的數據模型也更加簡單,更具表現力。
圖形數據庫是為與事務(OLTP)系統一起使用而構建的,并且在設計時考慮了事務完整性和操作可用性。
2、基于圖結構的存儲
將實體看做節點,關系看做帶有標簽的邊,那么知識圖譜的數據很自然地滿足圖模型結構。
圖數據庫基于有向圖,其理論基礎是圖論。節點、邊和屬性是圖數據庫的核心概念。
節點:節點用于表示實體、事件等對象,可以類比于關系數據庫中的記錄或數據表中的行數據。例如人物、地點、電影等都可以作為圖中的節點。
邊(關系):邊是指圖中連接節點的有向線條,用于表示不同節點之間的關系。例如人物節點之間的夫妻關系、同事關系等都可以作為圖中的邊。
屬性:屬性用于描述節點或者邊的特性。例如人物的姓名、夫妻關系的起止時間等都是屬性。
3、常見的圖數據存儲系統
Neo4j: Neo4j是一個開源的圖數據庫系統,它將結構化的數據存儲在圖上而不是表中。Neo4j基于Java實現,是一個具備完全事務特性的高性能數據庫,具有成熟數據庫的所有特性。Neo4j是一個本地數據庫,不需要啟動數據庫服務器,應用程序不用通過網絡訪問數據庫服務,訪問速度快。https://neo4j.com/
OrientDB:是一個開源的文檔-圖混合數據庫,兼具圖數據庫對數據強大的表示及組織能力和文檔數據庫的靈活性及很好的可擴展性。該數據庫同樣是本地的,支持許多數據庫的高級特性,如事務、快速索引、SQL查詢等。http://orientdb.com/
HyperGraphDB:同樣是開源的存儲系統,并依托于BerkeleyDB數據庫,最大的特點是超圖,從數學角度講,有向圖的一條邊只能指向一個節點,而超圖則可以指向多個節點,HyperGraphDB還允許一條邊指向其它邊,因此有更強大的表示能力。http://www.hypergraphdb.org/
InfiniteGraph:一個基于Java語言開發的分布式圖數據庫系統。http://www.objectivity.com/ products/infinitegraph/
4、對比
4.1 與NoSQL數據庫對比
NoSQL數據庫大致可以分為四類:
鍵值(key/value)數據庫
列存儲數據庫
文檔型數據庫
圖數據庫
| 分類 | 數據模型 | 優勢 | 劣勢 | 舉例 |
|---|---|---|---|---|
| 鍵值數據庫 | 哈希表 | 查找速度快 | 數據無結構化,通常只被當作字符串或者二進制數據 | Redis |
| 列存儲數據庫 | 列式數據存儲 | 查找速度快;支持分布橫向擴展;數據壓縮率高 | 功能相對受限 | HBase |
| 文檔型數據庫 | 鍵值對擴展 | 數據結構要求不嚴格;表結構可變;不需要預先定義表結構 | 查詢性能不高,缺乏統一的查詢語法 | MongoDB |
| 圖數據庫 | 節點和關系組成的圖 | 利用圖結構相關算法(最短路徑、節點度關系查找等) | 可能需要對整個圖做計算,不利于圖數據分布存儲 | Neo4j、JanusGraph |
4.2 與關系型數據庫對比
關系型數據庫實際上是不擅長處理關系的。很多場景下,業務需求完全超出了當前的數據庫架構。
舉個栗子:假設某關系型數據庫中有這么幾張用戶、訂單、商品表:
當我們要查詢:“用戶購買了那些商品?” 或者 “該商品有哪些客戶購買過?” 需要開發人員JOIN幾張表,效率非常低下。
而“購買該產品的客戶還購買了哪些商品?”類似的查詢幾乎不可能實現。
4.2.1 關系查詢性能對比
在數據關系中心,圖形數據庫在查詢速度方面非常高效,即使對于深度和復雜的查詢也是如此。在《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的查詢結果我們可以看出,圖數據庫返回了整個社交網絡一半以上的人數。
5、Neo4J
根據DB-Engines(https://db-engines.com/en/ranking/graph+dbms)最新發布的圖數據庫排名,Neo4J仍然大幅領先排在第一位:
Neo4j是:
一個開源
無Schema
沒有SQL
圖形數據庫
圖形數據庫也稱為圖形數據庫管理系統或GDBMS。
Neo4j的官方網站:http://www.neo4j.org
Neo4J是由Java實現的開源圖數據庫。自2003年開始開發,直到2007年正式發布第一版,并托管于GitHub上。
Neo4J支持ACID,集群、備份和故障轉移。目前Neo4J最新版本為4.1,分為社區版和企業版,社區版只支持單機部署,功能受限。企業版支持主從復制和讀寫分離,包含可視化管理工具。
5.1 標記屬性圖模型
(1)節點
節點是主要的數據元素
節點通過關系連接到其他節點
節點可以具有一個或多個屬性(即,存儲為鍵/值對的屬性)
節點有一個或多個標簽,用于描述其在圖表中的作用
示例:人員節點與Car節點
(2)關系
關系連接兩個節點
關系是方向性的
節點可以有多個甚至遞歸的關系
關系可以有一個或多個屬性(即存儲為鍵/值對的屬性)
(3)屬性
屬性是命名值,其中名稱(或鍵)是字符串
屬性可以被索引和約束
可以從多個屬性創建復合索引
(4)標簽
標簽用于將節點分組
一個節點可以具有多個標簽
對標簽進行索引以加速在圖中查找節點
本機標簽索引針對速度進行了優化
6、Cypher圖查詢語言
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成為二級朋友之外,他還是一級朋友。
7、小結
圖數據庫應對的是當今一個宏觀的商業世界的大趨勢:憑借高度關聯、復雜的動態數據,獲得洞察力和競爭優勢。國內越來越多的公司開始進入圖數據庫領域,研發自己的圖數據庫系統。對于任何達到一定規模或價值的數據,圖數據庫都是呈現和查詢這些關系數據的最好方式。而理解和分析這些圖的能力將成為企業未來最核心的競爭力。
總結
以上是生活随笔為你收集整理的图数据库 — neo4j (一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 雅迪电动车24安锂电池,跑了两年后还能跑
- 下一篇: [转载]JS中如何定义全局变量