###### tags: `Neo4j`
# Neo4j 簡介
是一種圖形資料庫(graph database,GDB),使用圖結構進行語意查詢的資料庫。<br>
他開源,支持 *ACID* ,並有Web的管理工具、Rest API介面,讓使用者好上手。<br>
也具有企業部署的高可用性叢集
是近幾年開始流行的圖形資料庫。<br>
目前Twitter、Linkin、Walmart、eBay、Cisco、HP、Google等知名企業也已開始使用Neo4j。
Neo4j是最早一批圖形資料庫之一,官方網站的教學詳細、介面優良易上手。<br>
訪間的教學工具書眾多,網路上也不乏有人分享及介紹,官方也有自己的社群。<br>
近年來能在其他GDB中脫穎而出,也不是沒有原因的。
>ACID,是指資料庫管理系統(DBMS)在寫入或更新資料的過程中,為保證事務(transaction)是正確可靠的,所必須具備的四個特性:
> * 原子性(atomicity,或稱不可分割性)
> * 一致性(consistency)
>* 隔離性(isolation,又稱獨立性)
>* 持久性(durability)。
<br>

## 圖形資料庫
一般我們所熟知的資料庫分為關聯式資料庫(SQL)、非關聯性資料庫(NoSQL)
圖形資料庫 是由**節點**和**關係**所組成,也是一種非關聯性資料庫(NoSQL)
數據模型是圖形節構,透過樹狀結構、網狀結構的方式,將各節點之間的關係儲存,
特別適合用來儲存複雜的資料關係。
GDB資料基本元素:
* Node
>節點,表示實體記錄,像關聯式資料庫的一個紀錄,包含多個屬性、零到多個標籤。
* Label
>標籤,可將節點分組到集合中,形成一個域(set)。例如所有使用者的節點都標記 :User。
* Property
>屬性是由鍵值對組成的,屬性名稱類似變數名稱。可以是基本資料型態或是基底資料型態組成的陣列。<br>
>沒有NULL的概念,如果不需要可以把整個鍵值對移除。
* Relationship
>用來連接兩個節點,也稱為圖形理論的邊(Edge),可以包含多個屬性,但只能有一個類型 (type)<br>
>關係必須有開始節點和節數節點,兩頭都不能為空。<br>
>圖的檢查(Traversal)操作中可指定關聯的方向或為無方向,所以在建立時,不必為兩個節點設定方向性<br>
>一個節點可以存在指向自己的關係。<br>
* Path
>節點和關系組成的路徑,路徑也有長度的概念,也就是關係的筆數<br>
>長度為0的路徑,等同單一節點。
>
紅框內路徑為1
資料存儲方式
兩個路徑為0的節點
資料存儲方式是:節點的類別、屬性,和邊的類別、屬性等都是分開存儲的。<br>
不像傳統資料庫的一條記錄一條數據的存儲方式,因而**可以簡單快速檢索難以在關係系統中建模的複雜階層。**
這就是為什麼Neo4j能提高圖形資料庫的性能。
## 為何選用Neo4j
Neo4j具備高靈活性、高可用性及可擴展性,為目前世界上最先進的 Graph 資料庫。
### 資料庫比較
**和關聯資料庫相比**:
* 沒有Scheme的問題。<br>
* 對於巨量資料、跨多個資料庫查詢及安全性有強大的優勢。<br>
在大數據時代,試想幾億筆的資料,每一筆Record除了建立資料外,還要確保唯一性。<br>
這時可能會建立索引、聯合索引、一堆關聯性,或者建立很多分表。
光查詢可能就要歷遍全表,而導致等待時間拉長。
**和其他非關聯資料庫(NoSQL)相比**:
* 圖形結構優化
>分析算法的實現主要由 Graph Algorithm 負責。<br>
>目前這個演算法有路径分析、中心度分析和社群分析三類演算算法函数,
>還有相似度記算、鍵接預測、預先處理數據等模組。
* 查詢語言Cypher(CQL)的特性使得數據更直觀和高效能。
Neo4j 沒有 TABLE,不需要煩惱 JOIN,而本身叢集角色設定,可以做到**讀寫分離**。
### 驅動開發
官方支援以下四種驅動開發
1. .NET
> NUGET: Install-Package Neo4j.Driver.Simple -Version 4.3.1
3. JAVA
4. JavaScript
>NPM: npm install neo4j-driver
6. Python
以上皆支援SSL/TLS連線加密。預設只允許對連線加密,具連線池。
## 叢集技術
### 因果叢集技術
因果叢集架構圖
#### 核心伺服器(CORE)
基於Raft協定開發(一種分散式演算法),能確保資料在最後使用者應用程式傳送交易前是安全的。
如果核心伺服器叢集故障而無法處理寫入,會轉為唯獨狀態,確保資料一致性和安全性。
#### 唯讀備份(Read Replica)
主要職責是擴充圖的工作負載(Cypher查詢、預存程序)。
透過交易記錄檔以非同步的方式從核心伺服器複製資料,並週期性的以毫秒為單位輪詢核心伺服器。
Neo4j因果叢集主要提供兩個特點:
1. 安全性
>核心伺服器(Core)為交易處理提供容錯平台,僅有一部分Core正常執行時,整個系統仍是可用的
2. 可擴充性
>唯讀備份(Read Replica)提供圖查詢大規模高可用擴充的平台。
### 高可用叢集 (HA Architecture)
高可用叢集架構圖
高可用叢集由一個Master,多個Slave組成,所有Instance都在本機資料庫檔案有完整備份。
圖中實線表示每個資料庫與其他成員可複製和管理;虛線表示主叢通訊,使資料保持最新。
Master主要負責寫入,再同步到Slave。
但當Slave發生寫入時,資料會先與Master同步,此時Master和Slave會被鎖定,當交易傳送時,先傳主機,成功後才會傳送到Slave。因此會有延宕發生。
彈性和容錯:採用主從複製結構,當硬體或斷網時,會在Slave選舉主機,並向其他從集匯報身分(這時不能寫入,但會在幾秒內完成),之後仍然可繼續提供服務。
讀密集資料時可有水平擴充的能力
## HTTP API
RESTful API,表頭需增加X-stream:true
驗證授權: Authorization: Base *[Base64編碼:UserName:Password]*
伺服器對交易傳送時間有60秒限制
## 應用案例
Neo4j成功的典型案例主要包含最佳化客戶個性化體驗、及時推薦和主資料管理......等
### 詐騙檢測
圖形資料庫因為可以展現節點之間的關聯性,可以發現傳統儲存發式難以檢測的隱形模式。這種*反隱型*上的突破,可以用離散方式來組成詐騙/犯罪環,用來檢視有組織的詐騙。<br>
例如:詐騙者一人假扮多個身分、主犯和從犯製造多場交通事故。
### 電子郵件監測
可以蒐集大量的垃圾電子郵件和垃圾郵件關鍵字來識別是否是垃圾郵件。
### 工商企業
大型企業可以快速找出子母公司、孫公司關係圖、法人/董事的工商資訊。
```javascript=
MATCH p= ()-[:'控股']->(:公司 {名字:'人生無限有限公司'}) with p
MATCH q= (:公司 {名字:'人生無限有限公司'})-[:'控股']->()-[:'控股']->()
RETURE p,q
```
### 學術研究圖譜
作者、合作者、機構、文獻關鍵字等可以組織成圖譜,用最短路徑或緊密度(Degree)尋找最合適的資料。
```javascript=
//作者發表的文章數量
MATCH (p:研究人員)-[a:作者]->()
RETURN p.Name, Count (a) as 文章數量
```
### 社群網站
可用圖形展現人脈關係
```javascript=
//朋友圈關係圖
MATCH n=(:朋友圈 {name:"Ashley"})-[*..6]-()
RETURN n
//直接認識的朋友
MATCH n=(:朋友圈 {name:'Ashley'})-[:認識]->()
RETURN n
//Ashley的朋友和朋友的朋友
MATCH n=(Ashley:朋友圈 {name:'Ashley'})->[*..2]->()
RETURN n
```
## 心得
我想起了被離散數學支配的恐懼 :unamused:
## Reference
[官網doc](https://neo4j.com/docs/getting-started/current/graphdb-concepts/#graphdb-example-graph)
[官網blog](https://neo4j.com/blog/graphs-to-production-at-scale/)
[Neo4j 官網下載連結](https://neo4j.com/download-center/#enterprise)
[Neo4j 大事典:圖形資料庫&大數據時代](https://www.books.com.tw/products/0010813100?sloc=main)