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

C#中使用Neo4j Driver读取数据时IResultCursor处理问题求助

Neo4j Driver 读取所有节点并转换为对象的正确示例

出现“records have already been consumed”错误的核心原因是:IResultCursor是一次性枚举器,一旦被遍历(比如调用ToListAsync()或异步遍历),就无法再次读取。必须在ExecuteReadAsync的委托内部完成游标数据的读取和转换,不能将游标带出委托范围。

完整代码示例

1. 定义实体类

public class NodeEntity
{
    public string Id { get; set; }
    public string MainLabel { get; set; }
    public Dictionary<string, object> Properties { get; set; }
}

2. 读取所有节点的方法

using Neo4j.Driver;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

public async Task<List<NodeEntity>> FetchAllNodesAsync(IDriver driver)
{
    return await driver.ExecuteReadAsync(async session =>
    {
        // 执行Cypher查询
        var cursor = await session.RunAsync("MATCH (n) RETURN n");
        
        // 遍历游标并转换为自定义实体
        var nodeList = new List<NodeEntity>();
        await foreach (var record in cursor)
        {
            var neo4jNode = record["n"].As<INode>();
            
            nodeList.Add(new NodeEntity
            {
                Id = neo4jNode.Id,
                MainLabel = neo4jNode.Labels.FirstOrDefault(), // 取节点的第一个标签,可按需调整
                Properties = neo4jNode.Properties.ToDictionary(kv => kv.Key, kv => kv.Value)
            });
        }

        return nodeList;
    });
}

关键注意事项

  • 所有对IResultCursor的操作必须在ExecuteReadAsync的委托内部完成,游标会在委托执行结束后被自动释放,外部无法复用。
  • 也可以用cursor.ToListAsync()一次性读取所有记录,同样要在委托内部执行:
    var records = await cursor.ToListAsync();
    foreach (var record in records)
    {
        // 转换逻辑同上
    }
    

内容的提问来源于stack exchange,提问作者Yafim Simanovsky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 04:35:36