neo4j 是服务端数据库,不支持直接读写本地文件;所有操作必须通过 bolt 协议连接运行实例,使用官方驱动执行 cypher,严禁直接操作 graph.db 目录。

Neo4j 不是文件数据库,它不支持直接读写本地文件来操作图数据——你不能像打开 graph.db 文件夹那样用 File.ReadAllBytes 或 FileStream 去“操作”它。所有交互必须走官方驱动的网络协议。
Neo4j 是服务端数据库,不是嵌入式文件库
很多人误以为 neo4j-community-5.x 解压后那个 data/databases/graph.db 目录可以直接被 C# 程序读写。实际上:这个目录是 Neo4j 进程私有管理的存储格式(底层是记录页+日志+映射表),没有公开、稳定、跨版本的文件结构文档;直接修改会破坏一致性,导致启动失败或数据损坏;C# 里用 Directory.Delete 或 File.Copy 操作该目录 ≠ 备份/迁移,只是复制了一堆不可用的二进制碎片。
正确路径只有一条:通过 Bolt 协议连接运行中的 Neo4j 实例。
- 确保 Neo4j 服务已启动(
neo4j start或 Windows 服务运行中) - 确认
dbms.connector.bolt.enabled=true和dbms.default_listen_address=0.0.0.0在conf/neo4j.conf中已配置 - 防火墙放行 7687 端口(Bolt 默认端口)
用 Neo4j.Driver 连接并执行 Cypher
官方 Neo4j.Driver NuGet 包(v5+)是唯一推荐方式。它封装了连接池、自动重连、事务生命周期,比手写 HTTP 请求或反序列化文件安全得多。
安装包:NuGet Install-Package Neo4j.Driver
10分钟内自己学会PHP其中,第1篇为入门篇,主要包括了解PHP、PHP开发环境搭建、PHP开发基础、PHP流程控制语句、函数、字符串操作、正则表达式、PHP数组、PHP与Web页面交互、日期和时间等内容;第2篇为提高篇,主要包括MySQL数据库设计、PHP操作MySQL数据库、Cookie和Session、图形图像处理技术、文件和目录处理技术、面向对象、PDO数据库抽象层、程序调试与错误处理、A
基础用法示例:
var driver = GraphDatabase.Driver("bolt://localhost:7687", AuthTokens.Basic("neo4j", "password"));
using var session = driver.AsyncSession();
var result = await session.ExecuteReadAsync(async tx =>
{
var cursor = await tx.RunAsync("MATCH (n:Person) WHERE n.age > $age RETURN n.name", new { age = 30 });
return await cursor.ToListAsync();
});
- 不要在每次查询都新建
GraphDatabase.Driver——它很重,应全局单例或依赖注入生命周期管理 - 避免用
session.ReadTransaction后再手动CommitAsync;优先用ExecuteReadAsync/ExecuteWriteAsync,它们自动处理事务边界 - 参数必须用命名占位符(
$age),不能字符串拼接,否则引发 Cypher 注入
本地开发时如何“假装”文件操作?
如果你真需要类似“加载本地图文件”的体验(比如测试用小数据集),可行做法是:把 Cypher 脚本存成 .cypher 文本文件,再用驱动批量执行。
例如 init-graph.cypher:
CREATE (:Person {name: 'Alice', age: 32});
CREATE (:Person {name: 'Bob', age: 28});
CREATE (a:Person {name: 'Alice'})-[:FRIEND]->(:Person {name: 'Charlie'});
然后在 C# 中读取并执行:
var script = File.ReadAllText("init-graph.cypher");
await session.ExecuteWriteAsync(tx => tx.RunAsync(script));
- 注意:大脚本要分批(每 100–500 行一个
RunAsync),否则可能触发 Neo4j 的语句超时或内存限制 - 不要用
CREATE反复执行同一脚本——加MERGE或先MATCH判断存在性,否则报重复键错误 -
.cypher文件只是文本,不是数据库快照;它不包含索引、约束、用户权限等元信息
真正需要离线图分析的场景,别硬套 Neo4j:考虑 GraphSharp、QuickGraph 这类纯内存图库,或者导出为 GraphML/CSV 再加载。Neo4j 的“文件”从来就不是接口,而是实现细节——碰它,等于绕过引擎直接拧活塞。









