Neo4j 图数据库基础入门
适用对象:开发者、数据工程师、AI/知识图谱从业者 前置知识:了解基本数据库概念即可 版本:Neo4j Community Edition 5.x + Cypher 查询语言
一、什么是图数据库?为什么需要它?
📌 传统关系型数据库的局限
- 处理'关联查询'效率低(如'朋友的朋友'需多层 JOIN);
- 随着关联深度增加,查询性能急剧下降(N+1 问题);
- 数据模型难以直观表达复杂关系(如社交网络、知识图谱)。
本文介绍 Neo4j 图数据库的基础概念与使用。涵盖图数据库与传统关系型数据库的区别,Neo4j 的核心特点及属性图模型(节点、关系、属性)。详细说明了通过 Docker 和本地方式安装启动 Neo4j 的步骤,并演示了 Web 浏览器访问方法。重点讲解了 Cypher 查询语言的基础操作,包括数据的创建、查询、更新合并及删除。此外还介绍了常用子句函数、索引优化策略、典型应用场景(如社交网络、推荐系统),以及 Neo4j 与关系型数据库的对比分析。适合开发者及数据工程师快速入门图数据库技术。
适用对象:开发者、数据工程师、AI/知识图谱从业者 前置知识:了解基本数据库概念即可 版本:Neo4j Community Edition 5.x + Cypher 查询语言
💡 图数据库 ≠ 图形可视化,而是指以图论为基础的数据存储与查询模型。
Neo4j 是目前最流行、功能最完善的 原生图数据库(Native Graph Database),由 Neo4j Inc. 开发,支持 ACID 事务、高可用、水平扩展(企业版)。
Neo4j 采用 属性图模型(Property Graph),包含三个基本元素:
| 元素 | 说明 | 示例 |
|---|---|---|
| 节点(Node) | 实体,可带标签(Label)和属性(Key-Value) | (:Person {name: "张三", age: 30}) |
| 关系(Relationship) | 有向连接两个节点,必须有类型(Type)和可选属性 | -[:FRIEND]->、-[:BOUGHT {date: "2025-12-01"}]-> |
| 属性(Property) | 键值对,存储在节点或关系上 | {name: "李四"}、{since: 2020} |
🔑 关键理解:节点可有多个标签(如
:User:Customer);关系有方向(A → B ≠ B → A),但查询时可忽略方向;所有数据都通过'模式匹配'来查询,而非 JOIN。
docker run \
--publish=7474:7474 \
--publish=7687:7687 \
--volume=$HOME/neo4j/data:/data \
--env=NEO4J_AUTH=neo4j/password \
neo4j:5.18
neo4j console
打开浏览器访问:http://localhost:7474
默认密码为 neo4j。登录后系统会提示修改密码,设置新密码后即可进行操作。
Cypher 是 Neo4j 的专用查询语言,语法直观,类似 ASCII art 描绘图结构。
// 创建单个节点
CREATE (:Person {name: "Alice", age: 28});
// 创建带标签的节点
CREATE (:Movie {title: "Inception", year: 2010});
// 创建节点并建立关系
CREATE (a:Person {name: "Bob"})-[:ACTED_IN]->(m:Movie {title: "The Matrix"});
⚠️ 注意:每次
CREATE都会新建数据,可能产生重复。生产中常用MERGE(见下文)。
// 查询所有 Person 节点
MATCH (p:Person) RETURN p;
// 查询'看过电影'的用户
MATCH (u:User)-[:WATCHED]->(m:Movie) RETURN u.name, m.title;
// 查询两层关系:朋友的朋友
MATCH (me:Person {name: "Alice"})-[:FRIEND]->(friend)-[:FRIEND]->(fof)
RETURN fof.name;
🔍
MATCH是 Cypher 的核心,用于模式匹配图结构。
// 更新节点属性
MATCH (p:Person {name: "Alice"}) SET p.age = 29, p.city = "北京" RETURN p;
// 安全创建(避免重复):如果不存在则创建
MERGE (p:Person {name: "Charlie"})
ON CREATE SET p.created = timestamp()
ON MATCH SET p.lastSeen = timestamp()
RETURN p;
✅ 最佳实践:用
MERGE代替CREATE避免重复节点。
// 删除关系(先 MATCH 关系)
MATCH ()-[r:TEMP]->() DELETE r;
// 删除节点(必须先删除其所有关系)
MATCH (p:Person {name: "Old User"}) DETACH DELETE p;
| 子句/函数 | 说明 | 示例 |
|---|---|---|
WHERE | 条件过滤 | WHERE p.age > 25 |
RETURN | 返回结果 | RETURN p.name AS name |
ORDER BY / LIMIT | 排序分页 | ORDER BY m.year DESC LIMIT 10 |
COUNT() | 计数 | RETURN count(*) |
COLLECT() | 聚合为列表 | RETURN collect(p.name) |
DISTINCT | 去重 | RETURN DISTINCT p.city |
// 节点属性索引(推荐用于 WHERE/MATCH 条件字段)
CREATE INDEX person_name_index FOR (p:Person) ON (p.name);
// 唯一约束(同时创建索引 + 唯一性校验)
CREATE CONSTRAINT unique_user_email FOR (u:User) REQUIRE u.email IS UNIQUE;
✅ 对经常用于查询条件的属性(如
id,name)建索引。
| 场景 | 图模型示例 |
|---|---|
| 社交网络 | 用户 -(FRIEND)-> 用户 |
| 推荐系统 | 用户 -(BOUGHT)-> 商品 ←-(BOUGHT)- 用户 |
| 知识图谱 | 实体 -(关系)-> 实体(如'北京 -[首都]-> 中国') |
| 欺诈检测 | 账户 -(转账)-> 账户,识别异常环路 |
| 权限管理 | 用户 -(属于)-> 角色 -(有权访问)-> 资源 |
| 供应链追踪 | 原料 → 产品 → 分销商 → 客户 |
🌟 图数据库擅长解决'关联密集型'问题,尤其是路径查找、社区发现、影响力分析等。
| 维度 | Neo4j(图数据库) | MySQL/PostgreSQL(关系型) |
|---|---|---|
| 数据模型 | 节点 + 关系 | 表 + 行 + 外键 |
| 关联查询性能 | O(1) ~ O(k),与深度无关 | O(N^d),随 JOIN 深度指数下降 |
| Schema | 动态(灵活) | 静态(需 ALTER TABLE) |
| 适用场景 | 关系密集型(社交、知识图谱) | 事务密集型(订单、账务) |
| 扩展性 | 垂直扩展为主(企业版支持分片) | 分库分表复杂 |
💡 不是替代关系型数据库,而是互补:核心交易用 SQL,关联分析用图数据库。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
在线格式化和美化您的 SQL 查询(它支持各种 SQL 方言)。 在线工具,SQL 美化和格式化在线工具,online
解析 INSERT 等受限 SQL,导出为 CSV、JSON、XML、YAML、HTML 表格(见页内语法说明)。 在线工具,SQL 转 CSV/JSON/XML在线工具,online
CSV 与 JSON/XML/HTML/TSV/SQL 等互转,单页多 Tab。 在线工具,CSV 工具包在线工具,online