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