微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何解决“Neo4j 返回了有效响应,但是 Neo4jClient 无法反序列化为您提供的对象结构”错误?

如何解决如何解决“Neo4j 返回了有效响应,但是 Neo4jClient 无法反序列化为您提供的对象结构”错误?

我正在使用具有 .net 核心 API 的 neo4jclient 图形数据库。我必须添加健康检查。我使用 Ihealthcheck 界面创建了自己的健康检查。下面是我的健康检查课

公共类 DatabaseHealthCheck : IHealthCheck

{
    public DatabaseHealthCheck(IGraphClient graphClient)
    {
        _graphClient = graphClient;
    }

    private readonly IGraphClient _graphClient;
    public async Task<HealthCheckResult> CheckHealthAsync(
        HealthCheckContext context,CancellationToken cancellationToken = default(CancellationToken))

    {
        try
        {
            var result = await _graphClient.Cypher.Match(@"show databases")
            .Return((n) => n.As<DatabaseDetail>()).ResultsAsync;

            foreach (var res in result)
            {
                if (res.currentStatus == "Online")
                {
                    return await Task.Fromresult(
                           HealthCheckResult.Healthy("Healthy"));
                }
            }
        }

        catch (Exception ex)
        {
            return new HealthCheckResult(status: context.Registration.FailureStatus,exception: ex);
        }

        return HealthCheckResult.Healthy();

        //    return await Task.Fromresult(
        //        new HealthCheckResult(context.Registration.FailureStatus,//        "Unhealthy"));
    }
}

通过此运行状况检查,我想获取数据库详细信息,然后检查数据库天气是否在线,但出现以下错误

Neo4j 返回了有效响应,但是 Neo4jClient 无法反序列化为您提供的对象结构。

有人可以帮我吗?

解决方法

您正在编写的查询不会返回任何内容,您实际执行的是:

MATCH (show databases)
RETURN n

如果您将代码更改为如下所示,您可以看到这一点:

var query = _graphClient.Cypher.Match(@"show databases")
           .Return((n) => n.As<string>());
           
var text = query.Query.DebugQueryText;
var result = await query.ResultsAsync;

如果您在其中放置一个断点以便您可以看到 text 变量是什么,您将能够看到它。

现在!当您使用 GraphClient 时,我想不出如何获得您想要的东西 - BoltGraphClient 可能是可能的 - 但您得到的错误意味着您正在使用前者。

如果您在 BoltGraphClient 上,您可以访问 Driver 并执行:

var session = ((BoltGraphClient)_graphClient).Driver.AsyncSession(d => d.WithDatabase("system"));
var cursor = await session.RunAsync("SHOW DATABASES");
while (await cursor.FetchAsync())
{
    var name = cursor.Current.Values["name"].As<string>();
    var status = cursor.Current.Values["currentStatus"].As<string>();
    Console.WriteLine($"{name} is {status.ToUpperInvariant()}");
}

我不知道有关 http GraphClient 的任何其他工作 - 需要将其添加到客户端。理论上 - 如果您愿意,这不是一个复杂的 PR。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。