Neo4j 图数据库入门与实战指南
一、安装部署
1. Windows 环境安装
准备环境
新版 Neo4j 通常依赖 JDK 17 及以上版本,请确保本地已配置好 Java 环境。
下载与解压
访问官方部署中心下载对应系统的社区版。解压后进入 bin 目录即可运行。
启动服务
直接执行 neo4j.bat console 在控制台查看日志。启动成功后,浏览器访问 http://localhost:7474/。
首次登录默认账号密码为 neo4j/neo4j,系统会强制要求修改为新密码。
2. Docker 快速部署
使用容器化方式可以避免环境冲突,命令如下:
docker pull neo4j:3.5.22-community
docker run -d \
-p 7474:7474 -p 7687:7687 \
--name neo4j \
-e "NEO4J_AUTH=neo4j/123456" \
-v /usr/local/soft/neo4j/data:/data \
-v /usr/local/soft/neo4j/logs:/logs \
-v /usr/local/soft/neo4j/conf:/var/lib/neo4j/conf \
-v /usr/local/soft/neo4j/import:/var/lib/neo4j/import \
neo4j:3.5.22-community
二、CQL 核心语法
Cypher 是 Neo4j 的查询语言,设计初衷就是直观表达图结构关系。
1. 创建节点与属性
使用 CREATE 语句定义节点及其标签(Label)和属性(Properties)。标签类似于数据库中的表名,用于分类索引。
-- 创建基础节点
CREATE (stu:Student), (tea:Teacher)
-- 创建带属性的节点
CREATE (zhangsan:Student { id: 1, name: 'zhangsan', age: 13 })
2. 查询数据
MATCH 配合 RETURN 是最基础的查询组合。如果不加 RETURN,查询结果会被丢弃且可能报错。
-- 匹配所有学生节点并返回
MATCH (s:Student) RETURN s
-- 只返回特定属性
MATCH (s:Student) RETURN s.id, s.name, s.age
3. 条件过滤
WHERE 子句用于筛选数据,支持逻辑运算符如 AND, OR, IS NOT NULL 等。
-- 多条件查询
MATCH (emp:Employee)
WHERE emp.name = 'Abc' OR emp.name = 'Xyz'
RETURN emp
-- 处理空值
MATCH (e:Employee)
WHERE e.id IS NOT NULL
RETURN e.id, e.name
4. 关系操作
图数据库的核心在于关系。可以使用 CREATE 连接两个已知或新创建的节点。
-- 创建单向关系
CREATE (d:Dog)-[r:Like]->(c:Cat)
-- 创建带属性的关系
MATCH (d:Dog), (c:Cat)
WHERE d.name = 'dog1' AND c.name = 'cat1'
CREATE (d)-[r:love {info: 'loveit'}]->(c)
RETURN r
5. 更新与删除
SET 用于添加或更新属性,DELETE 删除节点或关系,REMOVE 移除标签或属性。
-- 更新属性
MATCH (book:Book)
SET book.title = 'superstar'
RETURN book
-- 删除关系
MATCH (d)-[r:love]->(c)
DELETE r
-- 移除标签
MATCH (m:Movie:Pic)
REMOVE m:Pic
6. 排序与分页
ORDER BY 控制结果顺序,LIMIT 和 SKIP 实现分页效果。
-- 按薪资降序排列
MATCH (emp:Employee)
RETURN emp.empid, emp.salary
ORDER BY emp.salary DESC
-- 分页:跳过前 10 条,取 5 条
MATCH (emp:Employee)
RETURN emp SKIP 10 LIMIT 5
7. 合并与去重
MERGE 是 MATCH 和 CREATE 的结合体,如果模式存在则匹配,不存在则创建,常用于幂等操作。
-- 确保节点存在
MERGE (p:Profile {id: 1})
-- 去重查询
MATCH (n) RETURN DISTINCT n.name LIMIT 25
8. 索引与约束
为了提高查询效率,建议在常用属性上建立索引;唯一约束可防止重复数据。
-- 创建索引
CREATE INDEX ON :Customer(name)
-- 创建唯一约束
CREATE CONSTRAINT ON (cc:CreditCard) ASSERT cc.number IS UNIQUE
三、常用函数
1. 字符串处理
Neo4j 内置了丰富的字符串函数,如 UPPER, LOWER, SUBSTRING, REPLACE 等。
MATCH (e:Employee)
RETURN UPPER(e.name), SUBSTRING(e.name, 0, 2)
2. 聚合函数
类似 SQL 的 GROUP BY,可对路径上的节点进行计数或求和。
MATCH (p:Person)-[:KNOWS]->(f:Person)
RETURN p.name, count(f)
四、备份与恢复
生产环境中定期备份至关重要。需先停止服务再进行文件级操作。
# 停止服务
./neo4j stop
# 导出备份
./neo4j-admin dump --database=graph.db --to=/home/backup.dump
# 启动服务
./neo4j start
恢复时同样需要停止服务,并使用 load 命令导入。
./neo4j-admin load --from=/home/backup.dump --database=graph.db --force
五、复杂路径查询
图数据库的优势在于处理多层关联关系。
1. 变量长度路径
使用 [*..N] 表示最多 N 层的关系。
-- 查找 Alice 最多 3 层关系内的其他 Person
MATCH (p1:Person {name: 'Alice'})-[*..3]-(p2:Person)
WHERE p1 <> p2
RETURN p1, p2
2. 最短路径
shortestPath 函数用于寻找两点间的最短连接。
MATCH (p1:Person {name: 'Alice'}), (p2:Person {name: 'Bob'})
MATCH path = shortestPath((p1)-[*]-(p2))
RETURN path
3. 过滤路径节点类型
结合 ALL 谓词可以限制路径中间经过的节点类型。
MATCH (p1:Person {name: 'Alice'})-[*..3]-(p2:Person)
WHERE ALL(n IN nodes(path) WHERE n:Person)
RETURN p1, p2
六、Spring Boot 集成
在 Java 项目中集成 Neo4j 非常方便,主要涉及依赖引入和配置。
1. Maven 依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-neo4j</artifactId>
</dependency>
2. 配置文件
spring.neo4j.uri=bolt://localhost:7687
spring.neo4j.authentication.username=neo4j
spring.neo4j.authentication.password=your_password
七、配置参考
以下是 neo4j.conf 中常用的关键配置项说明,可根据实际需求调整。
# 数据库名称,默认为 graph.db
dbms.active_database=graph.db
# 数据存储路径
# dbms.directories.data=data
# 允许非本地连接(生产环境慎用)
dbms.connectors.default_listen_address=0.0.0.0
# Bolt 协议端口
dbms.connector.bolt.listen_address=:7687
# HTTP 管理界面端口
dbms.connector.http.listen_address=:7474
# 禁用认证(仅开发测试环境)
# dbms.security.auth_enabled=false
# JVM 堆内存设置
# dbms.memory.heap.initial_size=512m
# dbms.memory.heap.max_size=1g
# 启用 G1GC 垃圾回收器
dbms.jvm.additional=-XX:+UseG1GC
# 允许从文件系统加载 CSV 文件
dbms.security.allow_csv_import_from_file_urls=true
注:以上示例基于 Neo4j 社区版编写,具体版本差异请以官方文档为准。


