At a glance of Neo4j

Hi 大家好！ 前陣子到了新環境花了些時間適應，日常的學習是時候推進了。這篇文章會以 Neo4j 為例和大家分享什麼是 graph DB。

以下是這篇文章會談到的內容
NoSQL overview
Graph database
Neo4j

# NoSQL overview

在談什麼是 graph DB 之前，先帶大家總覽不同類型的 database，有別於一般常見的關聯式資料庫，NoSQL (Not Only SQL) 依據不同的型態又可細分為下方圖中的幾種類型。

# 什麼是 Graph ?

從歷史上最早可以追朔到數學家 Leonhard Euler 為了求證 Seven Bridges of Königsberg 問題後來發展成為了數學中的 graph theory。

圖片資料來源：Seven Bridges of Königsberg

# Graph 應用場景 ？

先來釐清什麼樣的場景與需求適合使用 graph ？ 這邊舉出兩種情境分享給讀者。

情境一：商品推薦系統的應用。在顧客的購物品項數據中分析出購物模式相似的族群，以下方圖示為例在商品推薦系統上可以推薦 Jennie 一些 Lisa 曾經買過的品項。

情境二：推薦路線系統的應用。在使用者的所在地與目的地中基於使用者選擇的偏好，舉例來說像是最佳路線, 轉乘次數最少等，推薦交通路線給使用者。

# Graph database

在 graph database 中一個實體可以被當作一個 node，我們可以定義 node 的屬性, 分類, 標籤與關聯，以下圖示為例。

# 如何在 graph database 中使用 query ？

這邊先帶大家認識 Cypher (query language)，下方是 wikipedia 中的介紹：

Cypher is a declarative graph query language that allows for expressive and efficient data querying in a property graph.

# 以下方 query 為例可以看到這邊寫了一個 query 去取得在 2005年之後發行的所有電影。
Match (m:Movie) where m.released > 2005 RETURN m

# Create unique node property constraints to ensure that property values are unique for all nodes with a specific label. Adding the unique constraint, implicitly adds an index on that property.
CREATE CONSTRAINT ON (n:Movie) ASSERT (n.title) IS UNIQUE

# Neo4j

下方是 官方文件 中的介紹：

Neo4j is an open-source, NoSQL, native graph database that provides an ACID-compliant transactional backend for your applications that has been publicly available since 2007

# 一般 sql 跟 neo4j 的差別在哪 ?

從下方 query 與 圖示可以看到在 neo4j 中我們不需要特別定義 foreign key 或是 join tables 而是透過 index 快速找到 node 之間的關聯。

圖片資料來源：Intro to Cypher for the SQL Developer

# 哪些資料不適合使用 neo4j 儲存？

圖檔和影片檔 neo4j 官方建議存在 aws s3，node 儲存 s3 的 url 就好。

# 總結

在準備 tech sharing 的過程中不斷的梳理如何表達得更清楚也是很棒的磨練呢！
在閱讀文章時如果有遇到什麼問題，或是有什麼建議，都歡迎留言告訴我，謝謝。😃

# 參考資料

Youtube | Introduction to Neo4j - a hands-on crash course

Podcast | Supper Club × Adam Cowley and Neo4j Database

Youtube | Seven Bridges of Königsberg

wikipedia | Seven Bridges of Königsberg

neo4j | Video and Photo Data Modeling

Youtube | Intro to Cypher for the SQL Developer