LinkedIn 的「你可能認識的人」、Netflix 的「你也喜歡」、電商的詐欺偵測——這些功能的共同點是關係本身比資料更重要

在關聯式資料庫裡建立「朋友關係」:user_relationships 表有 user_id_auser_id_b。查「三度以內的朋友」需要 3 次 SELF JOIN,每增加一度查詢複雜度指數成長。100 萬用戶、每人平均 200 個朋友——三度人脈查詢在 PostgreSQL 上可能要幾分鐘。

Graph DB 的核心差異:關係有自己的 index,從一個節點走到相鄰節點的成本是 O(1),不管總資料量多大。


核心概念

Node(節點):代表實體。用 label 分類(:User:Product:Article)。

Relationship(關係):連接兩個節點,有方向()和類型(FOLLOWSPURCHASEDWROTE)。

Property:節點和關係都可以有屬性(name: "Alice"since: 2023)。

-- Cypher 查詢:找 Alice 的二度朋友(朋友的朋友)
MATCH (alice:User {name: "Alice"})-[:FRIEND]->(friend)-[:FRIEND]->(fof)
WHERE NOT (alice)-[:FRIEND]->(fof) AND alice <> fof
RETURN fof.name, COUNT(*) AS common_friends
ORDER BY common_friends DESC

在 Neo4j 上這個查詢對幾百萬節點仍然是毫秒級,因為它走的是真實的 graph traversal,不是 JOIN。


適合用 Graph DB 的場景

社交圖譜:用戶關係、粉絲、追蹤、社群發現。

推薦引擎:「看過 A 的人也看過 B」——協同過濾用 graph traversal 比矩陣分解更直觀。

詐欺偵測:同一個 IP 地址登入過多少帳號、這張信用卡跟已知詐欺帳號有幾度分離。

知識圖譜:Google Knowledge Graph、企業內的 entity relationship(員工-部門-專案-技能)。

Access Control / Permission Inheritance:「這個角色繼承那個角色的權限」——權限的傳遞性很自然地用圖來表達。


不適合用 Graph DB 的場景

  • 高並發的簡單 CRUD(訂單、用戶 profile)——用 PostgreSQL
  • 大量數值聚合(報表、分析)——用 OLAP
  • 文件搜尋——用 Elasticsearch
  • 已有的關聯式資料,關係不複雜——遷移成本 > 收益

主要產品

Neo4j:最成熟的圖資料庫,Cypher 查詢語言標準化程度高,有開源版和企業版。AuraDB 是其 cloud 託管版本。

Amazon Neptune:AWS 托管,同時支援 property graph(Gremlin)和 RDF(SPARQL)。適合已在 AWS 生態的團隊。

JanusGraph:分散式 graph DB,建在 Cassandra / HBase 上,適合 TB 級超大圖。

Dgraph:原生 GraphQL,分散式,Go 實作,開源。

ArangoDB:多模型(graph + document + key-value),適合需要混合查詢的場景。


Graph DB 不是 PostgreSQL 的替代

Graph DB 是補充,不是替代。大多數系統的大多數資料仍然適合放在關聯式資料庫裡。

當你的資料模型開始出現「多跳關係查詢」、「關係本身有屬性」、「path 找最短路徑」這類需求時,才是考慮引入 Graph DB 的時機。很多系統用 PostgreSQL + graph extension(如 pgRouting 或 Apache AGE)就能解決 80% 的圖查詢需求,不需要引入獨立的 graph DB。