Neo4j數據庫

第一章:介紹

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章