Neo4j:圖資料庫的革命性力量

公众号-JavaEdge發表於2024-07-13

Neo4j 技術長 @prathle 撰寫了一篇出色的博文,總結最近圍繞 GraphRAG 的熱議、我們從一年來幫助使用者使用知識圖譜 + LLM 構建系統中學到的東西,以及我們認為該領域的發展方向。Neo4j一時間又大火起來,本文將帶你快速入門這神奇的資料庫。

前言

Neo4j是一款符合ACID標準的圖資料庫,能處理當今世界中極為複雜的關係資料。由Emil Ifram於2007年建立,使用Java編寫,並開創了屬性圖模型。

傳統的關聯式資料庫使用表格模型,但將規範化的表連線在一起並不是人類自然思考關係的方式。我們自然會想到實體之間的連線,比如Bob在Stack Overflow上提出了一個問題,然後Alice和Chad給它點了反對票,所以Bob放棄了他的程式設計夢想。

一個圖可以像你在白板上視覺化它一樣建模這些資料。節點代表實體,邊表示實體之間的關係,屬性是儲存在這些物件上的鍵值對。

在底層,Neo4j是真正的原生圖資料庫,將這個模型應用到儲存層。

查詢

用一種叫Cypher的宣告性語言編寫,類似SQL,只不過節點用括號括起來,透過箭頭連線到其他節點,關係用括號括起來。

要開始使用Neo4j,可以用Docker自託管,但最簡單的方法是註冊Aura,它提供免費的全託管雲資料庫。從這裡,我們可以用Cypher查詢來構建下一個Twitter。

使用CREATE後跟括號來建立一個新的實體或節點,這個節點有一個使用者標籤,用於將相似的節點分組。在大括號中,我們可以新增鍵值對來表示該節點上的資料。現在,一個使用者可能想要關注另一個使用者,這可以用括號內的關係來表示,然後注意箭頭指向另一個帶有使用者標籤的節點。建立關係資料就這麼簡單,不需要外來鍵或連線表,儘管我們可以向模式新增約束,比如這裡的約束確保每個使用者名稱都是唯一的。此外,我們可以在這個查詢中定義區域性變數,然後從語句中返回它們以獲取結果資料。特別棒的是,我們可以將其視覺化為互動式圖形,甚至是表格。

為繼續構建Twitter,我們可以將多個推文節點連線到一個使用者。我們還需要一個查詢來返回所有被關注使用者的所有推文,這可以很容易地用節點和關係表示出來,但我們也可以用WHERE子句過濾這個查詢,只返回最近釋出的推文。此外,我們可以匹配字串模式和正規表示式,或者基於圖形本身過濾複雜模式,比如只返回沒有被靜音的使用者的推文。因此,它不僅對開發人員直觀,而且還允許你的資料模式自然地顯現出來,這在資料分析和機器學習方面是一個巨大的優勢。

核心概念

屬性圖模型

Neo4j的屬性圖模型由以下三個主要元素組成:

  1. 節點(Nodes): 代表實體,如使用者、產品或位置。
  2. 關係(Relationships): 連線節點,表示節點間的關聯。
  3. 屬性(Properties): 儲存在節點和關係上的鍵值對,用於描述它們的特徵。

這種模型允許我們以一種非常接近人類思維方式的形式來建模資料,使得複雜的關係資料變得直觀和易於理解。

標籤和型別

  • 節點標籤: 用於對節點進行分類和分組。例如,:Person:Product
  • 關係型別: 描述兩個節點之間關係的性質。例如,:FOLLOWS:PURCHASED

Cypher查詢語言

Cypher是Neo4j的宣告式圖形查詢語言,設計靈感來自SQL,但針對圖資料結構進行了最佳化。

基本語法

MATCH (n:Person)-[:FOLLOWS]->(m:Person)
WHERE n.name = 'Alice'
RETURN m.name

這個查詢匹配所有Alice關注的人,並返回他們的名字。

建立和更新

CREATE (n:Person {name: 'Bob', age: 30})
SET n.job = 'Developer'

這個查詢建立一個新的Person節點,並設定其屬性。

複雜關係查詢

MATCH (a:Person)-[:POSTED]->(t:Tweet)<-[:LIKED]-(b:Person)
WHERE a.name = 'Charlie' AND t.timestamp > timestamp() - 86400000
RETURN b.name, COUNT(t) AS likes
ORDER BY likes DESC
LIMIT 5

這個查詢找出過去24小時內點贊Charlie推文最多的5個使用者。

效能最佳化

索引

為了提高查詢效能,Neo4j允許在節點屬性上建立索引:

CREATE INDEX ON :Person(email)

查詢計劃

使用EXPLAINPROFILE關鍵字來分析和最佳化複雜查詢的執行計劃。

高階特性

全文搜尋

Neo4j可以整合全文搜尋引擎,如Apache Lucene:

CALL db.index.fulltext.createNodeIndex("tweetContent", ["Tweet"], ["text"])

圖演算法

Neo4j圖資料科學庫提供了許多內建的圖演算法,如PageRank、社群檢測等:

CALL gds.pageRank.stream('myGraph')
YIELD nodeId, score

實際應用案例

適用場景

今天,Neo4j被用於推薦引擎(推薦系統: 基於使用者行為和專案特徵構建個性化推薦)

社交媒體平臺:

人工智慧的知識圖譜,構建和查詢複雜的知識網路,支援智慧問答系統:

欺詐檢測: 透過分析交易網路中的異常模式

技術整合

  • Spring Data Neo4j: 為Java開發者提供了簡單的Neo4j整合方案。
  • Neo4j-GraphQL: 允許開發者使用GraphQL語法來查詢Neo4j資料庫。

總結

Neo4j作為領先的圖資料庫,不僅提供強大的資料建模和查詢能力,還具有卓越的效能和可擴充套件性。隨資料關係日益複雜,Neo4j在各個領域的應用前景將更加廣闊。無論是構建下一代社交網路、最佳化供應鏈管理,還是推動AI和機器學習的發展,Neo4j都將扮演重要角色。

關注我,緊跟本系列專欄文章,咱們下篇再續!

作者簡介:魔都架構師,多家大廠後端一線研發經驗,在分散式系統設計、資料平臺架構和AI應用開發等領域都有豐富實踐經驗。

各大技術社群頭部專家博主。具有豐富的引領團隊經驗,深厚業務架構和解決方案的積累。

負責:

  • 中央/分銷預訂系統效能最佳化
  • 活動&券等營銷中臺建設
  • 交易平臺及資料中臺等架構和開發設計
  • 車聯網核心平臺-物聯網連線平臺、大資料平臺架構設計及最佳化
  • LLM Agent應用開發
  • 區塊鏈應用開發

目前主攻市級軟體專案設計、構建服務全社會的應用系統。

參考:

  • 程式設計嚴選網

本文由部落格一文多發平臺 OpenWrite 釋出!

相關文章