Neo4j資料庫

天府雲創發表於2019-04-10

第一章:介紹

Neo4j簡介

Neo4j是一個高效能的,NOSQL圖形資料庫,它將結構化資料儲存在網路上而不是表中。它是一個嵌入式的、基於磁碟的、具備完全的事務特性的Java持久化引擎,但是它將結構化資料儲存在網路(從數學角度叫做圖)上而不是表中。Neo4j也可以被看作是一個高效能的圖引擎,該引擎具有成熟資料庫的所有特性。程式設計師工作在一個物件導向的、靈活的網路結構下而不是嚴格、靜態的表中——但是他們可以享受到具備完全的事務特性、企業級的資料庫的所有好處。

Neo4j是由Java和Scala寫成的一個NoSql資料庫,專門用於網路圖的儲存。

Neo4j因其嵌入式、高效能、輕量級等優勢,越來越受到關注.

Neo4j Graph Platform – The Leader in Graph Databases: https://neo4j.com/

Neo4j理解

你可以把Neo看作是一個高效能的圖引擎,該引擎具有成熟和健壯的資料庫的所有特性。程式設計師工作在一個物件導向的、靈活的網路結構下而不是嚴格、靜態的表中——但是他們可以享受到具備完全的事務特性、企業級的資料庫的所有好處。 [1] 

Neo是一個網路——面向網路資料庫——也就是說,它是一個嵌入式的、基於磁碟的、具備完全的事務特性的Java持久化引擎,但是它將結構化資料儲存在網路上而不是表中。網路(從數學角度叫做圖)是一個靈活的資料結構,可以應用更加敏捷和快速的開發模式。

Neo4j特點

1.物件關係的不匹配使得把物件導向的“圓的物件”擠到面向關係的“方的表”中是那麼的困難和費勁,而這一切是可以避免的。

2.關係模型靜態、剛性、不靈活的本質使得改變schemas以滿足不斷變化的業務需求是非常困難的。由於同樣的原因,當開發小組想應用敏捷軟體開發時,資料庫經常拖後腿。

3.關係模型很不適合表達半結構化的資料——而業界的分析家和研究者都認為半結構化資料是資訊管理中的下一個重頭戲。

4.網路是一種非常高效的資料儲存結構。人腦是一個巨大的網路,全球資訊網也同樣構造成網狀,這些都不是巧合。關係模型可以表達面向網路的資料,但是在遍歷網路並抽取資訊的能力上關係模型是非常弱的。

雖然Neo是一個比較新的開源專案,但它已經在具有1億多個節點、關係和屬性的產品中得到了應用,並且能滿足企業的健壯性和效能的需求:

完全支援JTA和JTS、2PC分散式ACID事務、可配置的隔離級別和大規模、可測試的事務恢復。這些不僅僅是口頭上的承諾:Neo已經應用在高請求的24/7環境下超過3年了。它是成熟、健壯的,完全達到了部署的門檻。

圖:是指資料原理裡的樹集合成的網路。

Neo4j是一個嵌入式,基於磁碟的,支援完整事務的Java持久化引擎,它在圖(網路)中而不是表中儲存資料。Neo4j提供了大規模可擴充套件性,在一臺機器上可以處理數十億節點/關係/屬性的圖,可以擴充套件到多臺機器並行執行。相對於關聯式資料庫來說,圖資料庫善於處理大量複雜、互連線、低結構化的資料,這些資料變化迅速,需要頻繁的查詢——在關聯式資料庫中,這些查詢會導致大量的表連線,因此會產生效能上的問題。Neo4j重點解決了擁有大量連線的傳統RDBMS在查詢時出現的效能衰退問題。通過圍繞圖進行資料建模,Neo4j會以相同的速度遍歷節點與邊,其遍歷速度與構成圖的資料量沒有任何關係。此外,Neo4j還提供了非常快的圖演算法、推薦系統和OLAP風格的分析,而這一切在目前的RDBMS系統中都是無法實現的。

由於使用了“面向網路的資料庫”,人們對Neo充滿了好奇。在該模型中,以“節點空間”來表達領域資料——相對於傳統的模型表、行和列來說,節點空間是很多節點、關係和屬性(鍵值對)構成的網路。關係是第一級物件,可以由屬性來註解,而屬性則表明了節點互動的上下文。網路模型完美的匹配了本質上就是繼承關係的問題域,例如語義Web應用。Neo的建立者發現繼承和結構化資料並不適合傳統的關聯式資料庫模型。

Neo4j的特點

  • SQL就像簡單的查詢語言Neo4j CQL
  • 它遵循屬性圖資料模型
  • 它通過使用Apache Lucence支援索引
  • 它支援UNIQUE約束
  • 它它包含一個用於執行CQL命令的UI:Neo4j資料瀏覽器
  • 它支援完整的ACID(原子性,一致性,隔離性和永續性)規則
  • 它採用原生圖形庫與本地GPE(圖形處理引擎)
  • 它支援查詢的資料匯出到JSON和XLS格式
  • 它提供了REST API,可以被任何程式語言(如Java,Spring,Scala等)訪問
  • 它提供了可以通過任何UI MVC框架(如Node JS)訪問的Java指令碼
  • 它支援兩種Java API:Cypher API和Native Java API來開發Java應用程式
  • 更快的資料庫操作。當然,有一個前提條件,那就是資料量較大,在MySql中儲存的話需要許多表,並且表之間聯絡較多(即有不少的操作需要join表)。
  • 資料更直觀,相應的SQL語句也更好寫(Neo4j使用Cypher語言,與傳統SQL有很大不同)。
  • 更靈活。不管有什麼新的資料需要儲存,都是一律的節點和邊,只需要考慮節點屬性和邊屬性。而MySql中即意味著新的表,還要考慮和其他表的關係。
  • 資料庫操作的速度並不會隨著資料庫的增大有明顯的降低。這得益於Neo4j特殊的資料儲存結構和專門優化的圖演算法。

接著,試著從更深一些的層次看圖形資料庫。我將從Neo4j的資料儲存和資料讀寫兩方面來說明為什麼選它。

  1. 資料儲存
    Neo4j對於圖的儲存自然是經過特別優化的。不像傳統資料庫的一條記錄一條資料的儲存方式,Neo4j的儲存方式是:節點的類別,屬性,邊的類別,屬性等都是分開儲存的,這將大大有助於提高圖形資料庫的效能。

  2. 資料讀寫
    在Neo4j中,儲存節點時使用了"index-free adjacency",即每個節點都有指向其鄰居節點的指標,可以讓我們在O(1)O(1)的時間內找到鄰居節點。另外,按照官方的說法,在Neo4j中邊是最重要的,是"first-class entities",所以單獨儲存,這有利於在圖遍歷的時候提高速度,也可以很方便地以任何方向進行遍歷。

Neo4j的優點

  • 它很容易表示連線的資料
  • 檢索/遍歷/導航更多的連線資料是非常容易和快速的
  • 它非常容易地表示半結構化資料
  • Neo4j CQL查詢語言命令是人性化的可讀格式,非常容易學習
  • 它使用簡單而強大的資料模型
  • 它不需要複雜的連線來檢索連線的/相關的資料,因為它很容易檢索它的相鄰節點或關係細節沒有連線或索引

適用場景

鑑於其明顯的優缺點,Neo4j適合儲存”修改較少,查詢較多,沒有超大節點“的圖資料。

案例分析:最近在抓取一些社交網站的資料,抓下來的資料用MySql儲存。問我為什麼用MySql,那自然是入門簡單,並且我當時只熟悉MySql。可是,隨著資料量越來越大,有一個問題始終困擾著我,那就是社交關係的儲存

就以新浪微博舉例,一個大V少則十幾萬,多則幾千萬的粉絲,這些關注關係要怎麼存呢?在MySql中,一條關注關係(大V id,大V的一個粉絲 id)存為一條資料,那麼當使用者數量上來的時候,關注關係輕鬆破億,破十億,甚至上百億,並且為了保證每條資料的唯一性,還需要設定聯合索引,MySql就有些力不從心了。那麼有人要說了:分表呀。嗯,沒錯,分表的確可以在插入端和讀取端提升一些速度。比如我們可以根據id雜湊到100張表中。查詢一個使用者有哪些粉絲是快了,但是查詢一個使用者關注了哪些人時仍然需要遍歷全表。好,這時候我們還可以以(id,其關注的一個使用者的id)再構造100張表,於是兩種查詢都快了。然而,後面那100張表是冗餘資料,看著就不爽...並且生成一張子圖也不方便(需要多次寫SQL查表)。

於是,在搜尋更好的方案時無意間發現了圖形資料庫,查閱一番資料後感覺確實是個不錯的選擇,畢竟業界的一些大佬,如twitter,Adobe等也在用。

另外,針對Neo4j的缺點,有一款使用混合索引的資料庫Arangodb也許是一個不錯的考慮物件。根據其官網的說明,Arangodb不僅具有一般圖形資料庫的優點,而且在各種操作的速度上領先於Neo4j。可見:原理上說明為什麼Arangodb更快Arangodb與其他幾款資料庫的效能對比

關於為什麼選圖形資料庫就說到這。如今可供選擇的圖形資料庫也不少,為什麼就選擇了Neo4j呢?我簡要歸結為以下幾點:

  • 作為較早的一批圖形資料庫之一,文件和各種技術部落格較多。
  • 最開始曾嘗試過flockdb(據說操作簡單+輕量級),但是敗於安裝過程...,依賴太多。
  • 網上經常有人將orientdb,arangodb與neo4j做對比,我當然也考慮過orientdb和arangodb。從易用性來說都差不多。速度上的話看過一些評測,arangodb應該是相對最快的,因為其使用了混合索引。但是從穩定性來說,neo4j是最好的。

第二章:安裝

1.環境

Centos 7.4

neo4j-community-3.4.1.tar.gz

2.下載

下載地址 https://neo4j.com/download/other-releases/

下載

wget https://neo4j.com/artifact.php?name=neo4j-community-3.4.1-unix.tar.gz

解壓

tar -zxvf neo4j-community-3.4.1.tar.gz

3.開啟遠端訪問

一、對於3.0以前的版本

在安裝目錄的 $NEO4J_HOME/conf/neo4j.conf 檔案內,找到下面一行,將註釋#號去掉就可以了 #dbms.connector.https.address=localhost:7473 改為 dbms.connector.https.address=0.0.0.0:7473 這樣,遠端其他電腦可以用本機的IP或者域名後面跟上7474 埠就能開啟web介面了 如: https://:7473

當然,你的作業系統的防火牆也要確保開放了7474埠才行,防火牆怎樣開放請自行鍼對自己的作業系統查詢文件

二、對於3.1及以後的版本

在安裝目錄的 $NEO4J_HOME/conf/neo4j.conf 檔案內,找到下面一行,將註釋#號去掉就可以了 dbms.connectors.default_listen_address=0.0.0.0

4.測試

在bin目錄下,執行命令:./neo4j start啟動,其他命令 { console | start | stop | restart | status } 

訪問http://IP地址:7474/, 出現下圖即代表安裝成功,頂部的$輸入框用來執行下面的CQL語句。

 

第三章:CQL

1.CQL簡介

CQL代表Cypher查詢語言。 像Oracle資料庫具有查詢語言SQL,Neo4j具有CQL作為查詢語言。

Neo4j CQL -

  • 它是Neo4j圖形資料庫的查詢語言。
  • 它是一種宣告性模式匹配語言
  • 它遵循SQL語法。
  • 它的語法是非常簡單且人性化、可讀的格式。

如Oracle SQL -

  • Neo4j CQL 已命令來執行資料庫操作。
  • Neo4j CQL 支援多個子句像在哪裡,順序等,以非常簡單的方式編寫非常複雜的查詢。
  • NNeo4j CQL 支援一些功能,如字串,Aggregation.In 加入他們,它還支援一些關係功能。

2.Neo4j CQL命令/條款

常用的Neo4j CQL命令/條款如下:

S.No.

CQL命令/條

用法

1。

CREATE 建立

建立節點,關係和屬性

2。

MATCH 匹配

檢索有關節點,關係和屬性資料

3。

RETURN 返回

返回查詢結果

4。

WHERE 哪裡

提供條件過濾檢索資料

5。

DELETE 刪除

刪除節點和關係

6。

REMOVE 移除

刪除節點和關係的屬性

7。

ORDER BY以…排序

排序檢索資料

8。

SET 組

新增或更新標籤

3.Neo4j CQL 函式

以下是常用的Neo4j CQL函式:

S.No.

定製列表功能

用法

1。

String 字串

它們用於使用String字面量。

2。

Aggregation 聚合

它們用於對CQL查詢結果執行一些聚合操作。

3。

Relationship 關係

他們用於獲取關係的細節,如startnode,endnode等。

我們將在後面的章節中詳細討論所有Neo4j CQL命令,子句和函式語法,用法和示例。

4.Neo4j CQL資料型別

這些資料型別與Java語言類似。 它們用於定義節點或關係的屬性

Neo4j CQL支援以下資料型別:

S.No.

CQL資料型別

用法

1.

boolean

用於表示布林文字:true,false。

2.

byte

用於表示8位整數。

3.

short

用於表示16位整數。

4.

int

用於表示32位整數。

5.

long

用於表示64位整數。

6.

float

I用於表示32位浮點數。

7.

double

用於表示64位浮點數。

8.

char

用於表示16位字元。

9.

String

用於表示字串。

【參考學習教程】

1、neo4j教程_w3cschool https://www.w3cschool.cn/neo4j/

2、關於命令超全面的Neo4j使用指南 -  https://cloud.tencent.com/developer/article/1336299

相關文章