如何解决 "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。
我正在使用带有 .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。