圖資料模型與查詢 (Graph Models)

★★★★★Reviewed

FromDDIA

📚 From the Books

圖資料模型與查詢 (Graph Models)Data Models

當「多對多」變成資料的主角——關係比實體還重要、還會無限延伸——文件與關聯模型都吃力。圖模型把頂點 (vertex) 與邊 (edge) 升為一等公民,讓「關係」本身可被儲存、索引與遍歷。

🧠 Intuition

TIP

一句話分辨:當你的查詢長得像「從這個點出發,沿著關係一直走下去,看能走到哪」(朋友的朋友、零件的零件、誰影響了誰)——這就是圖。關聯模型能存這些關係,但「沿著走」這件事它做得很笨。

⚖️ Tradeoffs

Property Graph vs Triple-Store — 兩種圖模型
  • Property graph(如 Neo4j):頂點與邊都是物件,各自可掛任意 key-value 屬性;邊有方向、有標籤。直覺、貼近物件思維。
  • Triple-store(如 RDF):所有資訊拆成 (主詞, 謂詞, 受詞) 三元組,例如 (Lucy, livesIn, Idaho)。極度均勻、適合資料交換與語意網。
  • 表達力大致等價,差在「粒度」:property graph 以節點為中心,triple-store 把一切打散成最小事實單位。
宣告式查詢 — Cypher / SPARQL / Datalog
  • Cypher(property graph):用 ASCII 圖形語法描述路徑模式,如 (person)-[:LIVES_IN]->(loc),讀起來像在畫圖。
  • SPARQL(triple-store / RDF):對三元組做模式比對,類似 SQL 但天生為圖遍歷設計。
  • Datalog(邏輯式):以規則 (rules) 定義關係,可遞迴組合小規則成複雜查詢,表達力強、組合性好。
  • 共通點:你只描述「想要的模式」,遍歷路徑與優化交給引擎——這正是 SQL 在多跳查詢上做不到的。
自然表達任意深度的遍歷
  • 「找出所有移居美國、但出生在歐洲的人」——這需要沿 bornInlivesIn 各自往上走到不定深度的地理階層。
  • 圖查詢語言對「重複遍歷某種邊 0 到多次」有原生語法(Cypher 的 *0..、SPARQL 的屬性路徑)。
  • 深度不固定,正是圖模型相對關聯模型的核心優勢。
為何 SQL 遞迴查詢笨拙
  • SQL 的 join 數目必須在查詢撰寫時就寫死;但圖遍歷的跳數往往事先未知。
  • 變通是 recursive CTEWITH RECURSIVE)——能做到,但語法冗長、難讀難維護、優化器也常力不從心。
  • 同一個「朋友的朋友的朋友」查詢,Cypher 幾行搞定,SQL recursive CTE 要寫一大段且效能難料。
  • 結論:不是 SQL 做不到,而是它把「不定深度遍歷」這個圖的核心操作,硬塞進為固定 join 設計的語法裡。

🔑 Takeaways

✍️ My Notes

2026-07-01

  • Q: 既然關聯模型也能存多對多,什麼時候才真的「需要」圖資料庫?
  • A: 分水嶺在遍歷的深度是否固定。多對多但只跳一兩層(如貼文 ↔ 標籤),關聯模型的 join 完全夠用。一旦查詢是「沿著關係走到底、深度事先未知」(朋友的朋友的朋友、供應鏈追溯、權限繼承鏈),SQL 就得動用 recursive CTE,語法與效能都開始痛苦——這時圖模型 + Cypher/SPARQL 的原生遍歷才真正划算。換句話說,是查詢的形狀(不定深度遍歷)逼你選圖,而不只是資料有多對多。

📖 Further Reading