[數據庫]圖數據庫基礎入門
概念
圖數據庫是一種使用圖結構(節點、邊和屬性)進行數據存儲和查詢的數據庫管理系統。與傳統的關系型數據庫不同,圖數據庫專注于實體之間的關系,特別適合處理高度互聯的數據。常見的圖數據庫包括:Neo4j、JanusGraph、HugeGraph…
核心優勢:
- 高效處理復雜關系查詢
- 直觀的數據模型表示
- 靈活應對數據模式變化
- 卓越的性能(尤其對多跳查詢)
主要有以下特點:
- 節點(Node):表示具體實體(如人物、地點、產品)
- 可擁有標簽(Label)進行分類
- 可包含屬性(鍵值對)
- 例如:湯姆漢克斯Actor,Actor是演員代表分類,湯姆漢克斯代表實際的節點
- 關系(Relationship):連接節點的有向邊
- 必須有類型或可以理解為具體的關系(如:ACT表示演員與影視作品出演的關系、PURCHASED表示人與商品之間的購買關系)
- 可包含屬性,例如:xxx出演了什么電影,出演這個邊(關系)中,我們可以設置具體的時間,具體什么時候出演了這個電影
- 屬性(Properties):節點和關系的鍵值對屬性
- 標簽(Labels):節點的分類標記,如:Movie電影、Person人、Actor演員等
應用場景
- 社交網絡分析
- 好友推薦系統
- 影響力傳播分析
- 推薦引擎
- “購買此商品的用戶也購買了…”
- 個性化內容推薦
- 相關好友推送
- 欺詐檢測
- 識別異常交易模式
- 發現欺詐團伙關聯
- 知識圖譜
- 構建企業知識庫
- 語義搜索系統
- 血緣圖譜
- 網絡與IT運維
- 基礎設施依賴關系映射
- 影響分析
- 供應鏈管理
- 物流路徑優化
- 風險傳播分析
…
安裝[neo4j]
這里以neo4j為例,講解圖數據庫基本使用。
官方網站:https://neo4j.com/
官方教程地址:https://neo4j.ac.cn/docs/
大家可以直接通過官網下載,也可以通過docker方式下載使用,我這里演示docker安裝:
# 創建映射目錄
mkdir -p /Users/ziyi/docker-home/neo4j/{data,logs,conf,import}docker run -d --name neo4j -p 7474:7474 -p 7687:7687 -v /Users/ziyi/docker-home/neo4j/data:/data -v /Users/ziyi/docker-home/neo4j/plugins:/var/lib/neo4j/plugins -v /Users/ziyi/docker-home/neo4j/logs:/logs -v /Users/ziyi/docker-home/neo4j/conf:/var/lib/neo4j/conf -v /Users/ziyi/docker-home/neo4j/import:/var/lib/neo4j/import -e NEO4J_AUTH=neo4j/12345678 neo4j:5.26.6# 訪問瀏覽器,并輸入 neo4j / 12345678 登錄賬號
http://localhost:7474/browser/preview/
使用
1. cypher語法
創建節點
// 其中Person為標簽/類型,Alice為一個具體的節點,name、age是Alice這個具體節點的屬性
CREATE (:Person {name: 'Alice', age: 30})
CREATE (:Person {name: 'Bob', occupation: 'Engineer'})
最后效果:
創建關系
//找到Alice和Bob兩個節點,并為其創建FRIENDS朋友關系,同時為這個關系設置屬性
MATCH (a:Person), (b:Person)
WHERE a.name = 'Alice' AND b.name = 'Bob'
CREATE (a)-[:FRIENDS {since: '2020-01-01'}]->(b)
查詢數據
// 查找所有人員
MATCH (p:Person) RETURN p// 查找Alice的朋友
MATCH (alice:Person {name: 'Alice'})-[:FRIENDS]->(friend)
RETURN friend.name
更新數據
MATCH (p:Person {name: 'Alice'})
SET p.age = 31, p.location = 'New York'
RETURN p
刪除數據
// 刪除節點及其關系
MATCH (p:Person {name: 'Bob'})
DETACH DELETE p// 刪除關系
// 刪除任意方向的FRIENDS關系
MATCH (t:Person {name: 'Tom'})-[r:FRIENDS]-(b:Person {name: 'Bob'})
DELETE r// 刪除所有數據(謹慎使用!)
MATCH (n) DETACH DELETE n
多跳查詢
//補充數據用于展示多跳查詢
CREATE (:Person {name: 'Tom', age: 30});
MATCH (a:Person), (b:Person)
WHERE a.name = 'Tom' AND b.name = 'Bob'
CREATE (a)-[:FRIENDS]->(b),(b)-[:FRIENDS]->(a);// 查找Alice的2度好友(朋友的朋友)
MATCH (alice:Person {name: 'Alice'})-[:FRIENDS*2]->(fof)
RETURN DISTINCT fof.name
最短查詢
MATCH (a:Person {name: 'Alice'}), (b:Person {name: 'Tom'}),
path = shortestPath((a)-[*]-(b))
RETURN path
聚合函數
MATCH (p:Person)
RETURN avg(p.age) AS averageAge, count(*) AS totalPeople
2. 插件安裝[apoc]
neo4j圖數據庫可支持很多插件擴展,例如:apoc、
- apoc插件下載:https://github.com/neo4j/apoc/releases?page=1
neo4j與apoc版本對應關系:https://neo4j.ac.cn/labs/apoc/5/installation/
下載與自己neo4j匹配的插件即可,因為開始通過docker搭建neo4j時,我們已經做了plugins的映射:-v /Users/ziyi/docker-home/neo4j/plugins:/var/lib/neo4j/plugins。所以我們直接將插件下載到本地/Users/ziyi/docker-home/neo4j/plugins目錄即可。
2. 配置文件新增配置
neo4j.conf新增:
dbms.security.procedures.unrestricted=apoc.*
dbms.security.procedures.allowlist=apoc.*
- 重啟容器
# 重啟neo4j容器
docker ps | grep neo4j
docker restart 容器ID
- 來到可視化頁面,輸入下面命令驗證插件是否安裝成功
return apoc.version()
5. apoc里面有很多內置函數,可直接使用
效果: