如何解决 "Neo4j returned a valid response, however Neo4jClient was unable to deserialize into the object structure you supplied." 错误?

How to resolve "Neo4j returned a valid response, however Neo4jClient was unable to deserialize into the object structure you supplied." error?

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

public class 数据库健康检查: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 无法反序列化为您提供的对象结构。

谁能帮帮我?

您正在编写的查询不会 return 任何东西,您实际执行的是:

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。