You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 14:30:53