Article

图数据库Neo4j

更新于:2026-07-16

第一章:Neo4j 基础概念

1.1 图数据库基本原理

概念名称说明注意事项
图数据库一种以图结构(节点与边)存储和查询数据的 NoSQL 数据库,强调实体间关系不适合高频率事务性写入场景;更适合关联密集型查询
属性图模型Neo4j 使用的图模型,节点和关系均可携带键值对形式的属性关系必须有方向和类型,不可孤立存在
白板友好性图模型可直接映射现实世界的实体与关系,建模直观避免过度抽象,应贴近业务语义
遍历效率通过指针直接跳转到相邻节点,避免传统 JOIN 操作性能优势在深度关联查询(如”朋友的朋友”)中尤为明显

1.2 Neo4j 核心组件与架构

组件名称说明注意事项
KernelNeo4j 的核心引擎,负责存储、事务、索引和查询执行所有上层功能(如 Cypher、驱动)均构建于 Kernel 之上
Storage Engine基于本地文件系统的原生存储引擎,支持 ACID 事务默认使用嵌入式存储,不依赖外部数据库
Cypher RuntimeCypher 查询的执行引擎,包含解释器与编译器模式企业版支持更高效的编译模式
Bolt 协议Neo4j 官方二进制通信协议,用于驱动与数据库之间的高效连接推荐使用 Bolt 而非 HTTP REST API 以获得更好性能
Web 管理界面内置的浏览器 UI(通常访问 http://localhost:7474仅用于开发调试,生产环境建议关闭或限制访问
Plugin 扩展机制支持通过 APOC、GDS 等插件扩展功能插件需与 Neo4j 版本兼容,安装后需重启服务

1.3 节点、关系、属性与标签

概念名称说明注意事项
节点(Node)表示实体(如”人""商品”),是图的基本单元节点可拥有零个或多个标签,用于分类
关系(Relationship)连接两个节点的有向边,具有类型(如”FRIEND_OF”)关系必须有起点和终点,不可悬空;关系本身也可带属性
属性(Property)键值对(key-value),可附加在节点或关系上键为字符串,值支持字符串、数字、布尔、列表等(不支持嵌套对象)
标签(Label)用于对节点进行分组(如”User""Product”)一个节点可有多个标签;标签用于索引和查询优化
关系类型(Relationship Type)定义关系的语义类别(如”WORKS_AT”)类型名区分大小写,通常用大写;不可动态修改已有关系的类型

1.4 Cypher 查询语言简介

方法/子句名称语法示例用途代码示例注意事项
MATCHMATCH (n:Label)匹配图中的节点或关系MATCH (p:Person {name: 'Alice'}) RETURN p必须配合 RETURN 或其他子句使用;不加条件会全图扫描
CREATECREATE (n:Label {prop: value})创建新节点或关系CREATE (:Person {name: 'Bob', age: 30})每次执行都会创建新实体,可能产生重复
MERGEMERGE (n:Label {prop: value})匹配存在则返回,不存在则创建MERGE (p:Person {name: 'Charlie'}) ON CREATE SET p.created = timestamp()建议在 MERGE 条件字段上建立索引以提升性能
RETURNRETURN n, n.name返回查询结果MATCH (n) RETURN count(n) AS total可使用别名、表达式、函数
WHEREWHERE n.age > 25添加过滤条件MATCH (n:Person) WHERE n.age >= 18 RETURN n.name支持 AND/OR/NOT、正则、IN、EXISTS 等
SETSET n.status = 'active'为节点或关系添加或更新属性MATCH (n {name: 'Alice'}) SET n.lastLogin = date()可同时设置多个属性:SET n.prop1 = v1, n.prop2 = v2
DELETEDELETE r删除关系MATCH ()-[r:FRIEND]->() DELETE r不能删除仍有关联关系的节点
DETACH DELETEDETACH DELETE n删除节点及其所有关系MATCH (n:TempUser) DETACH DELETE n谨慎使用,可能引发级联删除

第二章:Neo4j 安装与配置

2.1 安装 Neo4j(社区版/企业版)

步骤名称操作细节注意事项
选择版本访问 https://neo4j.com/download/,下载社区版(免费)或企业版(需许可)社区版不支持集群、高级监控和热备份;开发测试推荐社区版
安装方式(Linux/macOS)解压 tar.gz 包:tar -xzf neo4j-community-5.x.x-unix.tar.gz需预装 Java 17(Neo4j 5.x 起要求 JDK 17+)
安装方式(Windows)运行 .exe 安装程序或解压 zip 包建议安装路径不含空格或中文
验证安装进入 bin 目录,执行 ./neo4j version(Linux/macOS)或 neo4j.bat version(Windows)应输出版本号如 “5.18.0”
设置环境变量(可选)neo4j/bin 加入 PATH,便于全局调用命令修改 ~/.bashrc~/.zshrc(macOS/Linux)

2.2 启动与停止服务(命令行方式)

命令名称语法用途代码示例注意事项
启动服务(前台)./neo4j console以控制台模式启动,日志直接输出cd neo4j/bin && ./neo4j console适用于调试;关闭终端即停止服务
启动服务(后台)./neo4j start以后台守护进程方式启动./neo4j start首次启动会初始化数据目录
停止服务./neo4j stop停止 Neo4j 服务./neo4j stop确保无活跃事务再停止
重启服务./neo4j restart重启服务./neo4j restart等效于 stop + start
查看服务状态./neo4j status检查服务是否运行./neo4j status返回 “Neo4j is running” 或 “Neo4j is not running”
强制终止(紧急情况)kill -9 $(cat data/neo4j.pid)强制杀死进程kill -9 $(cat data/neo4j.pid)仅在服务无响应时使用,可能导致数据损坏

2.3 配置文件详解(neo4j.conf)

配置项名称默认值 / 示例值说明注意事项
dbms.default_databaseneo4j默认数据库名称Neo4j 4.0+ 支持多数据库,此为启动后自动连接的库
server.http.listen_addresslocalhost:7474HTTP 服务监听地址生产环境若需远程访问,改为 0.0.0.0:7474,但需配合防火墙
server.bolt.listen_addresslocalhost:7687Bolt 协议监听地址驱动连接使用此端口
dbms.security.auth_enabledtrue是否启用身份认证开发环境可设为 false,生产环境必须为 true
dbms.directories.datadata数据存储目录可修改为绝对路径以分离数据盘
dbms.memory.heap.initial_size512mJVM 初始堆内存根据机器内存调整,建议不超过物理内存的 50%
dbms.memory.heap.max_size512mJVM 最大堆内存同上
dbms.logs.http.enabledtrue是否记录 HTTP 请求日志调试 API 调用时有用
cypher.default_language_version5.0默认 Cypher 语言版本影响语法兼容性

注:修改 neo4j.conf 后需重启服务生效。

2.4 初始安全设置与用户管理

操作名称命令语法用途代码示例注意事项
首次登录 Web 控制台浏览器访问 http://localhost:7474使用默认凭据登录用户名:neo4j,密码:首次登录强制修改初始密码必须修改,否则无法执行写操作
修改当前用户密码:password在 Web 控制台中交互式修改输入旧密码 → 输入新密码 → 确认仅限已认证用户
创建新用户(cypher-shell)CREATE USER username SET PASSWORD 'pass' CHANGE NOT REQUIRED创建用户并设密码CREATE USER alice SET PASSWORD 'secret123' CHANGE NOT REQUIRED需具备 admin 权限;CHANGE NOT REQUIRED 表示不要求首次登录改密
授予角色GRANT ROLE role_name TO username分配内置角色(如 reader, writer)GRANT ROLE writer TO alice内置角色:admin, architect, publisher, reader, writer
查看用户列表SHOW USERS列出所有用户及其状态SHOW USERS返回用户名、是否活跃、角色列表
删除用户DROP USER username删除指定用户DROP USER bob无法删除当前会话用户
重置 admin 密码(离线)./neo4j-admin dbms set-initial-password newpass重置初始密码(服务未运行时)./neo4j-admin dbms set-initial-password myNewPass仅在忘记密码且无其他 admin 用户时使用;服务必须停止

第三章:命令行工具使用

3.1 neo4j-admin 工具常用命令

命令名称语法示例用途代码示例注意事项
set-initial-passwordneo4j-admin dbms set-initial-password设置初始 admin 密码./bin/neo4j-admin dbms set-initial-password MyPass123仅在首次启动前或重置密码时使用;服务必须停止
dumpneo4j-admin database dump --to=备份数据库为 dump 文件./bin/neo4j-admin database dump neo4j --to=/backups/neo4j-2026.dump需指定数据库名(默认 neo4j);服务必须停止
loadneo4j-admin database load --database= --force从 dump 文件恢复数据库./bin/neo4j-admin database load /backups/neo4j-2026.dump --database=neo4j --force会覆盖目标数据库;服务必须停止
memrecneo4j-admin memrec推荐 JVM 内存配置./bin/neo4j-admin memrec根据当前机器内存输出建议的 heap 和 pagecache 值
server reportneo4j-admin server report生成诊断报告(含日志、配置等)./bin/neo4j-admin server report用于向 Neo4j 支持团队提交问题
helpneo4j-admin help查看所有子命令./bin/neo4j-admin help可接具体子命令查看用法,如 neo4j-admin help dump

3.2 cypher-shell 命令行客户端

命令/用法名称语法示例用途代码示例注意事项
连接本地数据库cypher-shell使用默认地址连接./bin/cypher-shell默认连接 bolt://localhost:7687,使用 neo4j/neo4j 凭据
指定连接参数cypher-shell -a bolt://host:port -u user -p password自定义连接./bin/cypher-shell -a bolt://192.168.1.10:7687 -u admin -p secret支持 --encryption=false(非 TLS 环境)
执行单条 Cypher 语句echo "MATCH (n) RETURN count(n)" | cypher-shell非交互式执行echo "CREATE (:Test {id: 1})" | ./bin/cypher-shell适用于脚本自动化
启用多行模式:set multiLine true允许输入跨多行的查询在 cypher-shell 中输入 :set multiLine true输入 ; 结束多行语句
显示执行计划EXPLAIN MATCH (n) RETURN n查看逻辑计划EXPLAIN MATCH (p:Person) RETURN p.name不实际执行查询
查看元命令:help列出所有元命令在交互模式中输入 :help其他元命令包括 :exit, :history, :server
退出客户端:exitCtrl+D退出交互会话:exit-

3.3 数据导入与导出(CSV、dump)

操作名称命令/方法用途代码示例注意事项
使用 LOAD CSV 导入Cypher 语句:LOAD CSV FROM 'file:///data.csv' AS row从 CSV 文件导入数据LOAD CSV WITH HEADERS FROM 'file:///users.csv' AS r CREATE (:User {name: r.name, age: toInteger(r.age)})CSV 文件需放在 Neo4j 的 import 目录下(由 dbms.directories.import 控制)
导出为 CSV(cypher-shell)echo "MATCH (n) RETURN n.name, n.age" | cypher-shell -u neo4j -p pass > out.csv将查询结果导出为 CSVecho "MATCH (u:User) RETURN u.name, u.email" | ./bin/cypher-shell -a bolt://localhost:7687 -u neo4j -p mypass > users.csv需处理表头和分隔符;适合小规模数据
dump 全库备份neo4j-admin database dump neo4j --to=/backup/neo4j.dump二进制全量备份./bin/neo4j-admin database dump neo4j --to=/mnt/backup/neo4j.dump服务必须停止;备份不可读,仅用于恢复
load 全库恢复neo4j-admin database load /backup/neo4j.dump --database=neo4j --force从 dump 恢复./bin/neo4j-admin database load /mnt/backup/neo4j.dump --database=neo4j --force会清空目标数据库;服务必须停止
使用 APOC 导出子图CALL apoc.export.cypher.all("graph.cypher", {})导出为可重放的 Cypher 脚本CALL apoc.export.cypher.query("MATCH (n)-[r]->(m) RETURN n,r,m", "subgraph.cypher", {})需先安装 APOC 插件

3.4 日志查看与故障排查

日志/操作名称文件路径或命令用途操作细节注意事项
查询日志logs/query.log记录所有 Cypher 查询tail -f logs/query.log需在 neo4j.conf 中启用 dbms.logs.query.enabled=true
HTTP 访问日志logs/http.log记录 Web 控制台和 REST API 请求grep "POST /db" logs/http.log启用需设置 dbms.logs.http.enabled=true
错误日志logs/neo4j.log主日志,含启动、错误、警告信息grep "ERROR" logs/neo4j.log服务启动失败时首要查看此文件
GC 日志logs/gc.logJVM 垃圾回收日志cat logs/gc.log需在 neo4j.conf 中配置 JVM 参数开启
检查端口占用lsof -i :7474netstat -tulnp | grep 7474确认 Neo4j 端口是否监听lsof -i :7687若端口被占,需 kill 进程或修改配置
验证数据目录权限ls -ld data/检查 Neo4j 是否有读写权限chmod -R 755 data/(若权限不足)启动失败常见原因为 data 目录无写权限
清理临时文件rm -rf data/databases/*/transaction data/databases/*/index/tmp手动清理事务或索引临时文件仅在服务停止且确认无数据损坏风险时操作操作前务必备份;错误清理可能导致数据丢失

第四章:Cypher 查询语言详解

4.1 CREATE / MERGE 创建数据

方法名称语法用途代码示例注意事项
CREATECREATE (variable:Label {key: value})创建新节点或关系CREATE (:Person {name: 'Alice', age: 30})每次执行都会创建新实体,可能产生重复;不检查是否存在
CREATE(关系)CREATE (a)-[:REL_TYPE {prop: val}]->(b)创建带属性的关系MATCH (a:Person {name:'Alice'}), (b:Person {name:'Bob'}) CREATE (a)-[:FRIEND {since: 2020}]->(b)起点和终点必须已存在或在同一语句中创建
MERGEMERGE (variable:Label {key: value})匹配存在则返回,不存在则创建MERGE (p:Person {name: 'Charlie'}) ON CREATE SET p.created = timestamp()建议在 MERGE 条件字段上建立索引,否则性能极差
MERGE(关系)MERGE (a)-[:REL_TYPE]->(b)确保关系唯一性MATCH (a:Person {name:'Alice'}), (b:Person {name:'Bob'}) MERGE (a)-[:KNOWS]->(b)若关系已存在,不会重复创建;但若节点对不同,仍会新建
ON CREATE / ON MATCHMERGE ... ON CREATE SET ... ON MATCH SET ...分支设置属性MERGE (u:User {email: 'x@y.com'}) ON CREATE SET u.status = 'new' ON MATCH SET u.lastSeen = timestamp()ON CREATE 仅在新建时触发,ON MATCH 仅在匹配时触发

4.2 MATCH 查询图数据

方法名称语法用途代码示例注意事项
MATCH(节点)MATCH (n:Label)匹配指定标签的节点MATCH (p:Person) RETURN p.name不加 WHERE 会全图扫描,大数据量下性能差
MATCH(关系)MATCH (a)-[r:TYPE]->(b)匹配特定类型的关系MATCH (a:Person)-[r:FRIEND]->(b:Person) RETURN a.name, b.name关系变量 r 可用于返回或过滤
MATCH(无向关系)MATCH (a)-[r]-(b)匹配任意方向的关系MATCH (a)-[:WORKS_AT]-(c:Company) RETURN a.name, c.name实际存储仍为有向,查询时忽略方向
MATCH(可变长度路径)MATCH (a)-[*1..3]->(b)匹配 1 到 3 跳的关系MATCH (p1:Person)-[:FRIEND*2]->(p2:Person) RETURN p1.name, p2.name长度范围越大,结果爆炸风险越高;建议限制上限(如 *1..5)
OPTIONAL MATCHOPTIONAL MATCH (a)-[r]->(b)类似 LEFT JOINMATCH (p:Person) OPTIONAL MATCH (p)-[r:OWNS]->(c:Car) RETURN p.name, c.model若无匹配,c 为 null,不会丢弃 p 行

4.3 WHERE / RETURN / ORDER BY / LIMIT 过滤与投影

子句名称语法用途代码示例注意事项
WHEREWHERE condition过滤匹配结果MATCH (p:Person) WHERE p.age > 25 RETURN p.name支持 AND/OR/NOT、IN、STARTS WITH、CONTAINS、正则 =~
RETURNRETURN expression [AS alias]指定返回内容MATCH (p:Person) RETURN p.name AS name, p.age可返回节点、关系、属性、表达式、函数结果
RETURN DISTINCTRETURN DISTINCT value去重返回MATCH (p:Person)-[:LIVES_IN]->(c:City) RETURN DISTINCT c.name自动去重,适用于聚合前筛选
ORDER BYORDER BY expression [ASC/DESC]排序结果MATCH (p:Person) RETURN p.name ORDER BY p.age DESC多字段排序:ORDER BY p.age, p.name
LIMITLIMIT n限制返回行数MATCH (p:Person) RETURN p.name LIMIT 10常用于分页;需配合 ORDER BY 保证结果稳定
SKIP / LIMITSKIP m LIMIT n分页查询MATCH (p:Person) RETURN p.name ORDER BY p.id SKIP 20 LIMIT 10第一页 SKIP 0;注意深度分页性能问题

4.4 SET / REMOVE 修改与删除属性

方法名称语法用途代码示例注意事项
SET(更新属性)SET variable.property = value设置或更新属性MATCH (p:Person {name: 'Alice'}) SET p.age = 31若属性不存在则新增
SET(多个属性)SET variable += {k1: v1, k2: v2}批量更新(不覆盖其他属性)MATCH (p:Person {name: 'Bob'}) SET p += {city: 'NYC', status: 'active'}使用 += 可保留原有属性
SET(添加标签)SET variable:Label1:Label2为节点添加标签MATCH (p:Person {name: 'Eve'}) SET p:Admin:VIP标签不可用于关系
REMOVE(删除属性)REMOVE variable.property删除属性MATCH (p:Person) REMOVE p.tempFlag属性不存在时不报错
REMOVE(移除标签)REMOVE variable:Label移除节点标签MATCH (p:TempUser) REMOVE p:TempUser不能移除最后一个标签(节点至少有一个标签)

4.5 DELETE / DETACH DELETE 删除节点与关系

方法名称语法用途代码示例注意事项
DELETE(关系)DELETE relationship_variable删除关系MATCH ()-[r:TEMP]->() DELETE r只能删除关系,不能删除带关系的节点
DELETE(孤立节点)DELETE node_variable删除无任何关系的节点MATCH (n:Temp) WHERE NOT (n)--() DELETE n若节点有关联关系,DELETE 会失败并报错
DETACH DELETEDETACH DELETE node_variable删除节点及其所有关系MATCH (n:DeprecatedUser) DETACH DELETE n谨慎使用!会级联删除所有连接关系
批量删除MATCH (n:Log) WHERE n.ts < 1700000000 DETACH DELETE n删除大量数据MATCH (n:Session) WHERE n.expired = true DETACH DELETE n建议分批操作(如 LIMIT 1000),避免事务过大

4.6 WITH / UNWIND 流程控制

方法名称语法用途代码示例注意事项
WITHWITH expression AS alias将前步结果传递给后续查询MATCH (p:Person) WITH p WHERE p.age > 30 RETURN p.name可用于中间过滤、聚合、重命名
WITH + collectMATCH (p:Person)-[:FRIEND]->(f) WITH p, collect(f.name) AS friends RETURN p.name, friends分组收集关联数据同上collect() 会将多行合并为列表
UNWINDUNWIND list_expression AS item将列表展开为多行UNWIND ['A', 'B', 'C'] AS letter CREATE (:Tag {name: letter})常用于从应用传入列表批量创建
UNWIND + rangeUNWIND range(1, 5) AS i CREATE (:Counter {id: i})生成序列UNWIND range(0, 9) AS n RETURN n * nrange(start, end) 生成整数列表
WITH + LIMIT 分页中间处理MATCH (e:Event) WITH e ORDER BY e.time DESC LIMIT 100 MATCH (e)<-[:PARTICIPATED]-(u) RETURN u.name先筛选再关联避免先关联再 LIMIT 导致结果不准顺序影响语义和性能

4.7 函数与聚合(count, collect, exists 等)

函数名称语法用途代码示例注意事项
count(*)count(*)统计行数MATCH (p:Person) RETURN count(*) AS total包含 null 行
count(expr)count(n)统计非 null 值数量MATCH (a)-[r]->(b) RETURN count(r)忽略 null
collect()collect(property)收集值为列表MATCH (p:Person) RETURN collect(p.name)保留重复值
exists()exists(variable.property)判断属性是否存在MATCH (p:Person) WHERE exists(p.email) RETURN p.name也可用于关系:exists((p)-[:FRIEND]->())
toInteger(), toString()toInteger('123')类型转换MATCH (n) WHERE toInteger(n.age) > 18 RETURN n转换失败返回 null
size()size(list)size(pattern)获取列表长度或路径跳数MATCH p = (a)-[:FRIEND*1..3]->(b) RETURN size(p)size((a)-->(b)) 返回关系数
coalesce()coalesce(a, b, ...)返回第一个非 null 值MATCH (p:Person) RETURN coalesce(p.nick, p.name)类似 SQL 的 COALESCE
min(), max(), avg(), sum()avg(n.age)数值聚合MATCH (p:Person) RETURN avg(p.age), max(p.age)仅作用于数值类型

4.8 索引与约束(CREATE INDEX / CONSTRAINT)

DDL 名称语法用途代码示例注意事项
创建 B-tree 索引CREATE INDEX [index_name] FOR (n:Label) ON (n.property)加速等值/范围查询CREATE INDEX person_name_idx FOR (p:Person) ON (p.name)Neo4j 5.x 默认使用 B-tree;旧版用 CREATE INDEX ON :Label(prop)
创建全文索引CREATE FULLTEXT INDEX [name] FOR (n:Label) ON EACH [prop_list]支持文本模糊搜索CREATE FULLTEXT INDEX book_title_ft FOR (b:Book) ON EACH [b.title, b.desc]查询需用 db.index.fulltext.queryNodes('name', 'keyword')
创建唯一约束CREATE CONSTRAINT [name] FOR (n:Label) REQUIRE n.property IS UNIQUE确保属性唯一CREATE CONSTRAINT user_email_unique FOR (u:User) REQUIRE u.email IS UNIQUE自动创建索引;插入重复值会失败
创建存在性约束(企业版)CREATE CONSTRAINT [name] FOR (n:Label) REQUIRE n.property IS NOT NULL禁止属性为 nullCREATE CONSTRAINT product_sku_notnull FOR (p:Product) REQUIRE p.sku IS NOT NULL社区版不支持
查看索引/约束SHOW INDEXES / SHOW CONSTRAINTS列出所有索引或约束SHOW INDEXES YIELD name, type, entityType, labelsOrTypes, properties可配合 WHERE 过滤
删除索引DROP INDEX index_name删除指定索引DROP INDEX person_name_idx删除后查询性能可能下降
删除约束DROP CONSTRAINT constraint_name删除约束DROP CONSTRAINT user_email_unique删除唯一约束后,原索引也会被移除

第五章:高级功能与优化

5.1 全文索引与文本搜索

方法/操作名称语法/操作细节用途代码示例注意事项
创建全文索引CREATE FULLTEXT INDEX index_name FOR (n:Label) ON EACH [prop1, prop2]为指定标签和属性创建全文索引CREATE FULLTEXT INDEX article_fulltext FOR (a:Article) ON EACH [a.title, a.content]支持多属性;仅支持字符串类型;Neo4j 4.3+ 语法
查询全文索引CALL db.index.fulltext.queryNodes('index_name', 'search_query') YIELD node, score执行全文搜索并返回匹配节点CALL db.index.fulltext.queryNodes('article_fulltext', 'database~') YIELD node, score RETURN node.title, score使用 Lucene 语法(如 fuzzy ~、wildcard *、phrase "..."
删除全文索引DROP INDEX index_name删除全文索引DROP INDEX article_fulltext删除后无法再使用该索引查询
列出全文索引SHOW FULLTEXT INDEXES查看所有全文索引SHOW FULLTEXT INDEXES返回索引名、实体类型、属性列表等
更新延迟(索引异步更新)全文索引非实时生效新增数据可能延迟数秒才可搜到CREATE (:Article {title: 'New'}); CALL db.index.fulltext.queryNodes('article_fulltext', 'New') YIELD node RETURN node可通过 db.awaitIndexes() 等待
自定义分析器(企业版)neo4j.conf 中配置控制分词行为dbms.fulltext.analyzer.default=english社区版仅支持默认分析器

5.2 APOC 插件安装与使用

操作/方法名称语法/操作细节用途代码示例注意事项
安装 APOC(社区版)apoc-*.jar 放入 plugins 目录,并在 neo4j.conf 启用扩展 Cypher 功能1. 下载对应版本 APOC jar;2. 放入 $NEO4J_HOME/plugins/;3. 添加配置:dbms.security.procedures.unrestricted=apoc.*dbms.security.procedures.allowlist=apoc.*必须与 Neo4j 版本严格匹配(如 5.18 配 apoc-5.18.x)
验证安装CALL apoc.help('apoc')检查 APOC 是否可用CALL apoc.version()返回 APOC 版本号
导出子图为 CypherCALL apoc.export.cypher.query(query, file, config)生成可重放的 Cypher 脚本CALL apoc.export.cypher.query("MATCH (p:Person)-[r]->(c:Company) RETURN p,r,c", "export.cypher", {format: 'plain'})需启用 apoc.export.file.enabled=true(默认 false)
条件创建(upsert)CALL apoc.do.when(condition, ifQuery, elseQuery, params)条件分支执行CALL apoc.do.when(true, "CREATE (:Flag {type: 'on'})", "CREATE (:Flag {type: 'off'})", {}) YIELD value RETURN value类似编程中的 if-else
批量提交CALL apoc.periodic.iterate(statement1, statement2, {batchSize:1000})分批处理大数据CALL apoc.periodic.iterate("MATCH (n:Log) WHERE n.ts < 1700000000 RETURN n", "DETACH DELETE n", {batchSize:5000})避免大事务 OOM;每批独立事务
JSON 处理apoc.json.parse(jsonString)解析 JSON 字符串WITH '{"name":"Alice"}' AS json CALL apoc.json.parse(json) YIELD value CREATE (:Person {name: value.name})返回 map 或 list

5.3 图算法库(Graph Data Science Library)

操作/方法名称语法/操作细节用途代码示例注意事项
安装 GDS 库下载 gds-*.jar 放入 plugins 目录,重启服务启用图算法功能1. 从 Neo4j 官网下载 GDS;2. 放入 plugins/;3. 无需额外配置(默认启用)仅企业版支持全部算法;社区版支持部分(如 PageRank、WCC)
创建投影图CALL gds.graph.project('graphName', nodeLabel, relType)将子图加载到内存CALL gds.graph.project('myGraph', 'Person', 'FRIEND')投影图独立于原图,用于高效计算
运行 PageRankCALL gds.pageRank.stream('graphName') YIELD nodeId, score计算节点重要性CALL gds.pageRank.stream('myGraph') YIELD nodeId, score RETURN gds.util.asNode(nodeId).name AS name, score ORDER BY score DESCstream 模式不写回原图;write 模式可写属性
写回结果CALL gds.pageRank.write('graphName', {writeProperty: 'pagerank'})将算法结果存回节点CALL gds.pageRank.write('myGraph', {writeProperty: 'score'})需确保节点有写权限
查看投影图CALL gds.graph.list()列出所有内存图CALL gds.graph.list()显示图名、节点/关系数量、内存占用
释放投影图CALL gds.graph.drop('graphName')释放内存CALL gds.graph.drop('myGraph')长期不用的图应及时释放
弱连通分量(WCC)CALL gds.wcc.stream('graphName') YIELD nodeId, componentId发现连通子图CALL gds.wcc.stream('myGraph') YIELD nodeId, componentId RETURN componentId, count(*) AS size ORDER BY size DESC适用于社区发现初步分析

5.4 性能调优与查询计划(EXPLAIN / PROFILE)

方法/操作名称语法/操作细节用途代码示例注意事项
EXPLAINEXPLAIN MATCH (n:Person {name: 'Alice'}) RETURN n查看逻辑执行计划(不执行)EXPLAIN MATCH (a)-[:FRIEND*2]->(b) RETURN b用于预估查询复杂度;显示运算符树
PROFILEPROFILE MATCH (n:Person {name: 'Alice'}) RETURN n查看实际执行计划(含性能数据)PROFILE MATCH (p:Person)-[:WORKS_AT]->(c:Company) WHERE c.name = 'Neo4j' RETURN p.name显示每步的 DB Hits(数据库命中次数),值越低越好
查看 DB Hits在 PROFILE 输出中观察衡量查询效率高 DB Hits 通常因缺少索引或全图扫描
使用索引提示USING INDEX n:Label(property)强制使用索引(极少需要)MATCH (n:Person {name: 'Alice'}) USING INDEX n:Person(name) RETURN n通常优化器自动选择;仅在误判时使用
避免笛卡尔积确保 MATCH 有连接条件防止爆炸性中间结果MATCH (a:Person), (b:Company) RETURN a, b / ✅ MATCH (a:Person)-[:WORKS_AT]->(b:Company) RETURN a, b笛卡尔积会导致 DB Hits 激增
参数化查询使用 $param 而非拼接提升计划缓存复用:param name => 'Alice'; MATCH (p:Person {name: $name}) RETURN p驱动程序中应使用参数化语句
清除计划缓存CALL db.clearQueryCaches()重置查询计划缓存CALL db.clearQueryCaches()用于测试不同索引效果时

第六章:Neo4j 应用开发

6.1 官方驱动(Java / Python / JavaScript 等)连接示例

驱动类型语法/初始化方式用途代码示例注意事项
Java Driver使用 GraphDatabase.driver(uri, auth)Java 应用连接 Neo4jDriver driver = GraphDatabase.driver("bolt://localhost:7687", AuthTokens.basic("neo4j", "password")); Session session = driver.session(); Result result = session.run("MATCH (n) RETURN count(n)"); System.out.println(result.single().get(0).asLong()); session.close(); driver.close();需添加 Maven 依赖:org.neo4j.driver / neo4j-java-driver / 5.18.0
Python Driverfrom neo4j import GraphDatabasePython 应用连接driver = GraphDatabase.driver("bolt://localhost:7687", auth=("neo4j", "password")); with driver.session() as session: result = session.run("MATCH (n:Person) RETURN n.name"); for record in result: print(record["n.name"]); driver.close()安装:pip install neo4j;支持异步(AsyncGraphDatabase
JavaScript Driverconst neo4j = require('neo4j-driver')Node.js 应用连接const driver = neo4j.driver('bolt://localhost:7687', neo4j.auth.basic('neo4j', 'password')); const session = driver.session(); session.run('MATCH (n) RETURN count(n)').then(result => { console.log(result.records[0].get(0).toNumber()); session.close(); driver.close(); });安装:npm install neo4j-driver;默认使用 Bolt 协议
Go Driver"github.com/neo4j/neo4j-go-driver/v5/neo4j"Go 应用连接driver, err := neo4j.NewDriverWithContext("bolt://localhost:7687", neo4j.BasicAuth("neo4j", "password", "")); session := driver.NewSession(neo4j.SessionConfig{}); result, _ := session.Run("MATCH (n) RETURN count(n)", nil); record, _ := result.Single(); fmt.Println(record.Values[0])需启用 Go modules;v5 对应 Neo4j 5.x

6.2 REST API 调用方式(HTTP endpoint)

操作名称请求方式与路径用途代码示例注意事项
执行 Cypher(事务内)POST /db/{database}/tx通过 HTTP 执行查询(推荐)curl -X POST http://localhost:7474/db/neo4j/tx -H "Content-Type: application/json" -u neo4j:password -d '{"statements":[{"statement":"MATCH (n) RETURN count(n)"}]}'返回 JSON 结果;需处理事务 commit/rollback
执行单条语句(简单模式)POST /db/{database}/cypher快速执行单条查询(已弃用)curl -X POST http://localhost:7474/db/neo4j/cypher -H "Content-Type: application/json" -u neo4j:password -d '{"query":"MATCH (n:Person) RETURN n.name"}'Neo4j 4.0+ 已标记为 deprecated,建议使用 /tx 接口
获取节点(by ID)GET /db/{database}/node/{id}按 ID 获取节点(旧版 REST)curl -u neo4j:password http://localhost:7474/db/neo4j/node/123仅适用于旧版(Neo4j 3.x);5.x 不推荐使用
列出数据库GET /db获取可用数据库列表curl -u neo4j:password http://localhost:7474/db返回 ["neo4j", "system"]
认证方式Basic Auth提供用户名密码所有请求需带 -u user:passAuthorization: Basic base64(user:pass)dbms.security.auth_enabled=false 可省略
错误处理查看 HTTP 状态码诊断失败原因401: 认证失败;404: 路径错误;500: 查询异常响应体中通常包含 error.message 字段

6.3 事务处理与批量操作

方法/操作名称语法/操作细节用途代码示例(Python)注意事项
显式事务(begin/commit)session.begin_transaction()控制多语句原子性with driver.session() as session: tx = session.begin_transaction(); try: tx.run("CREATE (:Order {id: 1})"); tx.run("CREATE (:Log {event: 'order_created'})"); tx.commit(); except: tx.rollback(); raise所有写操作应在事务中;默认自动提交(每条语句独立事务)
自动提交事务(single)session.execute_write(func)推荐的写操作封装def create_person(tx, name): tx.run("CREATE (:Person {name: $name})", name=name); with driver.session() as session: session.execute_write(create_person, "Alice")驱动自动处理事务 begin/commit/rollback
批量插入(分批)循环 + 分批提交避免大事务 OOMusers = [{"name": f"User{i}"} for i in range(10000)]; batch_size = 1000; for i in range(0, len(users), batch_size): batch = users[i:i+batch_size]; session.execute_write(lambda tx: tx.run("UNWIND $batch AS u CREATE (:Person {name: u.name})", batch=batch))单事务建议不超过 1 万条;监控内存使用
参数化查询使用 $param防止注入 & 提升性能session.run("MATCH (p:Person {name: $name}) RETURN p.age", name="Bob")所有用户输入必须参数化
读写分离execute_read / execute_write明确操作意图session.execute_read(lambda tx: tx.run("MATCH (n) RETURN count(n)"))有助于未来扩展(如读副本)

6.4 与 Spring Boot / Django 等框架集成

框架集成方式用途代码示例要点注意事项
Spring Boot使用 Spring Data Neo4j (SDN)对象图映射(OGM)1. 添加依赖:implementation 'org.springframework.boot:spring-boot-starter-data-neo4j';2. 配置 application.ymlspring.neo4j.uri=bolt://localhost:7687spring.neo4j.authentication.username=neo4jspring.neo4j.authentication.password=password;3. 定义实体:@Node public class Person { @Id @GeneratedValue private Long id; private String name; };4. Repository:interface PersonRepository extends Neo4jRepository<Person, Long> {}SDN 6+ 基于官方驱动,不再依赖 OGM;支持 reactive
Django使用 neomodel 或 py2neoPython ORM 风格操作1. pip install neomodel;2. settings.py 中设置:NEO4J_URL = 'bolt://neo4j:password@localhost:7687';3. 定义模型:from neomodel import StructuredNode, StringProperty; class Person(StructuredNode): name = StringProperty();4. 使用:alice = Person(name='Alice').save()neomodel 提供类似 Django ORM 的体验;py2neo 更底层
Node.js + Express直接使用 JavaScript 驱动构建 RESTful 服务const driver = neo4j.driver(...); app.get('/users', async (req, res) => { const session = driver.session(); try { const result = await session.run("MATCH (u:User) RETURN u.name"); res.json(result.records.map(r => r.get('u.name'))); } finally { await session.close(); } });建议封装数据库访问为 service 层;注意连接池管理
.NET Core使用 Neo4j.Driver NuGet 包C# 应用集成services.AddSingleton(sp => GraphDatabase.Driver("bolt://localhost:7687", AuthTokens.Basic("neo4j", "password")));支持 async/await;需处理 IDisposable 生命周期

第七章:运维与高可用

7.1 备份与恢复(neo4j-admin dump / load)

操作名称命令语法用途代码示例注意事项
全量备份(dump)neo4j-admin database dump database --to=path将数据库导出为二进制 dump 文件./bin/neo4j-admin database dump neo4j --to=/backups/neo4j-20260202.dump服务必须停止;仅支持单数据库备份;企业版支持在线备份(需额外许可)
全量恢复(load)neo4j-admin database load dump-file --database=name --force从 dump 文件恢复数据库./bin/neo4j-admin database load /backups/neo4j-20260202.dump --database=neo4j --force服务必须停止;--force 覆盖现有数据;目标数据库名可不同于原名
备份多数据库分别对每个数据库执行 dump备份系统中所有业务库./bin/neo4j-admin database dump neo4j --to=/backups/neo4j.dump; ./bin/neo4j-admin database dump analytics --to=/backups/analytics.dumpNeo4j 4.0+ 支持多数据库;需逐个备份
验证 dump 文件file dump-filehead -c 100 dump-file确认文件非空且格式正确file /backups/neo4j.dump正常 dump 文件为 gzip 压缩格式,file 命令显示 “gzip compressed data”
自动化备份脚本编写 shell 脚本 + cron定期自动备份#!/bin/bash; NEO4J_HOME=/opt/neo4j; $NEO4J_HOME/bin/neo4j stop; $NEO4J_HOME/bin/neo4j-admin database dump neo4j --to=/backups/neo4j-$(date +%Y%m%d).dump; $NEO4J_HOME/bin/neo4j start停机备份影响可用性;生产环境应使用企业版在线备份或文件系统快照
清理旧备份find /backups -name "*.dump" -mtime +7 -delete保留最近7天备份find /backups -name "neo4j-*.dump" -mtime +30 -exec rm {}避免磁盘占满

7.2 集群部署(因果集群 Causal Clustering)

组件/配置项说明/配置值用途配置示例(neo4j.conf)注意事项
Core Server存储全量数据,参与共识(Raft)保证数据强一致性和持久性dbms.mode=COREdbms.cluster.discovery_type=SINGLEdbms.cluster.initial_discovery_members=localhost:5000,localhost:5001,localhost:5002至少 3 个 Core 节点(容忍 1 节点故障);奇数个更佳
Read Replica只读副本,异步同步数据扩展读吞吐,降低 Core 负载dbms.mode=READ_REPLICAdbms.cluster.discovery_type=SINGLEdbms.cluster.initial_discovery_members=localhost:5000可水平扩展;不参与写共识;数据略有延迟
Discovery Port5000(默认)节点间发现与通信causal_clustering.discovery_listen_address=:5000需开放 TCP 端口;各节点 discovery_address 必须可达
Transaction Port6000(默认)Raft 日志复制causal_clustering.transaction_listen_address=:6000Core 节点间同步事务日志
Raft Port7000(默认)Raft 选举与心跳causal_clustering.raft_listen_address=:7000Core 节点间维持共识状态
初始成员列表所有 Core 节点的 discovery 地址集群启动引导dbms.cluster.initial_discovery_members=core1:5000,core2:5000,core3:5000所有 Core 节点必须配置相同列表;Read Replica 也需配置
客户端连接地址任一 Core 或 Read Replica 的 Bolt 地址应用连接入口driver = GraphDatabase.driver("bolt://core1:7687", ...)写操作必须连 Core;读操作可连 Read Replica
集群状态检查CALL dbms.cluster.overview()查看集群拓扑与角色CALL dbms.cluster.overview() YIELD id, role, groups RETURN *在任意 Core 节点执行;返回各节点状态

7.3 监控指标与 Prometheus 集成

操作/配置名称配置/命令细节用途配置示例(neo4j.conf)注意事项
启用 Prometheus 端点设置 metrics.prometheus.enabled=true暴露监控指标供 Prometheus 抓取metrics.prometheus.enabled=truemetrics.prometheus.endpoint=localhost:2004/metrics默认端口 2004;路径 /metrics
自定义监听地址修改 endpoint 地址允许远程抓取metrics.prometheus.endpoint=0.0.0.0:2004/metrics生产环境需配合防火墙限制访问源
关键监控指标Neo4j 暴露的指标名称用于告警与可视化neo4j_transactions_activeneo4j_page_cache_hits_rationeo4j_causal_clustering_core_rolejvm_memory_used_bytes完整列表见官方文档;建议监控事务队列、缓存命中率、集群角色
配置 Prometheus jobprometheus.yml 中添加抓取 Neo4j 指标scrape_configs: - job_name: 'neo4j' static_configs: - targets: ['core1:2004', 'core2:2004']每个 Neo4j 实例需单独配置 target
Grafana 仪表盘导入 Neo4j 官方 dashboard JSON可视化监控使用 ID 11999(Neo4j Community Dashboard)需先配置 Prometheus 数据源
日志监控集成Filebeat / Fluentd 采集 logs/neo4j.log异常日志告警配置 Filebeat 读取 logs/neo4j.log 并发送至 ELK关注 ERROR、WARN 级别日志
自定义指标(APOC)CALL apoc.metrics.register(...)注册业务指标CALL apoc.metrics.register('user_count', 'MATCH (u:User) RETURN count(u)')需启用 apoc.metrics.enabled=true

7.4 升级与版本迁移

操作名称步骤/命令用途操作细节注意事项
版本兼容性检查查阅 Neo4j 官方升级文档确认跨版本支持例如:5.10 → 5.18 支持滚动升级;4.x → 5.x 需停机迁移大版本升级(如 4→5)不兼容,需 dump/load
小版本滚动升级(集群)逐个替换 Core 节点零停机升级1. 停止一个 Core 节点;2. 替换二进制文件;3. 启动新版本;4. 等待同步完成;5. 重复其他节点仅适用于补丁或小版本(如 5.17 → 5.18);需保持协议兼容
大版本迁移(停机)dump → 新实例 load跨主版本迁移1. 在旧版停机后执行 dump;2. 安装新版 Neo4j;3. 执行 load 恢复数据;4. 启动并验证必须停机;插件(APOC/GDS)需升级到对应版本
插件兼容性处理下载匹配新版本的插件避免启动失败删除 plugins/apoc-5.10.jar,放入 apoc-5.18.jar插件版本必须与 Neo4j 主版本严格一致
配置文件迁移对比新旧 neo4j.conf适配新参数新版可能废弃旧参数(如 dbms.active_databasedbms.default_database建议从新安装实例的默认 conf 文件开始,逐步合并自定义配置
回滚计划保留旧版本备份应对升级失败1. 备份整个 NEO4J_HOME;2. 记录旧版本号;3. 测试回滚流程升级前必须验证回滚可行性
数据验证升级后运行校验查询确保数据完整MATCH (n) RETURN count(n) AS nodeCount, count { (n)-[]->() } AS relCount与升级前统计值对比;检查关键业务实体