Neo4j .NET驱动是否支持类似fetchrow的逐行读取功能?
Neo4j .NET驱动逐行读取结果集方案
不用ToList()全量加载,也不需要SKIP/LIMIT分页,Neo4j .NET驱动本身就支持逐行迭代结果,和关系库的fetchrow逻辑一致,核心是直接操作结果游标,而非一次性把所有数据拉到内存里。
异步逐行读取(推荐方式,驱动官方优先)
Neo4j .NET驱动的IResultCursor实现了IAsyncEnumerable<IRecord>,可以用await foreach异步遍历,每次只加载当前行数据到内存,处理完就释放:
using var driver = GraphDatabase.Driver("bolt://localhost:7687", AuthTokens.Basic("neo4j", "password")); using var session = driver.AsyncSession(); var query = "MATCH (n:User) RETURN n.name, n.age"; var cursor = await session.RunAsync(query); // 逐行读取处理 await foreach (var record in cursor) { var userName = record["n.name"].As<string>(); var userAge = record["n.age"].As<int>(); // 这里写你的业务逻辑,比如写入文件、调用接口等 Console.WriteLine($"User: {userName}, Age: {userAge}"); }
同步逐行读取(适用于旧版同步驱动场景)
如果用的是同步版本的驱动(比如较老的Neo4j.Driver同步API),IResult本身是可枚举的,直接用foreach遍历即可:
using var driver = GraphDatabase.Driver("bolt://localhost:7687", AuthTokens.Basic("neo4j", "password")); using var session = driver.Session(); var query = "MATCH (n:User) RETURN n.name, n.age"; var result = session.Run(query); // 逐行读取处理 foreach (var record in result) { var userName = record["n.name"].As<string>(); var userAge = record["n.age"].As<int>(); // 业务逻辑处理 Console.WriteLine($"User: {userName}, Age: {userAge}"); }
关键注意事项
- 不要调用
ToList()、ToDictionary()这类会枚举全量结果的方法,否则还是会把所有数据加载到内存。 - 游标会在遍历完成后自动关闭,也可以手动调用
cursor.CloseAsync()(异步)或result.Consume()(同步)提前关闭。 - 这种方式的性能和内存占用远优于分页查询,因为不需要多次发起数据库请求,也不会在内存中留存大量数据。
内容的提问来源于stack exchange,提问作者Joseph T. Richardson
相关产品推荐
相关产品推荐

