gpt4 book ai didi

c# - Neo4jClient Cypher 查询收集具有多个值的语句

转载 作者:行者123 更新时间:2023-12-02 04:53:15 27 4
gpt4 key购买 nike

我正在尝试将查询从 cypher 转换为在 c# 中使用 neo4jclient api

这是我的密码

start server=node:node_auto_index(serverId='SHO2K3MS49')
MATCH
server-[:IS_SERVER_TYPE]->type,
appEnv-[:HAS_SERVER]->server,
app-[:HAS_ENV]->appEnv
return
server.serverId,
collect([
appEnv.environmentTypeId,
appEnv.appEnvId,
app.appId,
app.appName
]) ;

查询为每个服务器返回一行,并收集该服务器上的所有应用程序。

据我所知,.CollectAs api 只允许单个值。

关于如何使用 .net api 执行此操作的想法?

编辑

我刚试过这个查询

_connectedClient
.Cypher
.Start(new {server = Node.ByIndexLookup("node_auto_index", "serverId", "SHO2K3MS49") })
.Match("server-[:IS_SERVER_TYPE]->type", "appEnv-[:HAS_SERVER]->server", "app-[:HAS_ENV]->appEnv")
.Return((server, appEnv, app) =>
new
{
ServerName = Return.As<string>("server.serverId"),
aa = Return.As<dynamic> ("collect([appEnv.environmentTypeId,appEnv.appEnvId,app.appId,app.appName])")
})
.Results;

并收到了这个结果。

堆栈跟踪

at Neo4jClient.Serialization.CypherJsonDeserializer`1.Deserialize(String content)
at Neo4jClient.GraphClient.<>c__DisplayClass1e`1.<Neo4jClient.IRawGraphClient.ExecuteGetCypherResultsAsync>b__1d(Task`1 responseTask)
at System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke()
at System.Threading.Tasks.Task.Execute()

内部异常

Accessed JArray values with invalid key value: "data". Array position index expected

消息 -- 为简洁起见删除了样板文本

Neo4jClient encountered an exception while deserializing the response from the server. This is likely a bug in Neo4jClient.

Include the full type definition of <>f__AnonymousType1`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].

Include this raw JSON, with any sensitive values replaced with non-sensitive equivalents:

{"columns":["ServerName","aa"],"data":[["SHO2K3MS49",[["PRD","MATT.PRD","MATT","MATT"],["PRD","ARCSERV.PRD","ARCSERV","ArcServ"],["PRD","ACTIVE DIRECTORY _WINDOWS SERVER NETWORKING_.PRD","ACTIVE DIRECTORY _WINDOWS SERVER NETWORKING_","Active Directory (Windows Server networking)"]]]]}
Parameter name: content

最佳答案

因为你从collect带回来的结果语句基本上是没有定义列的字符串。 JSON.NET 无法推断列是什么(并且您不能使用 AS 来帮助它),所以您得到的只是像这样的字符串:

"[\r\n"EnvType1",\r\n"AppEnvId1",\r\n"App2",\r\n"App 2"\r\n]"

您可以使用以下查询获得:

_connectedClient
.Cypher
.Start(new {server = Node.ByIndexLookup("node_auto_index", "serverId", "SHO2K3MS49") })
.Match("server-[:IS_SERVER_TYPE]->type", "appEnv-[:HAS_SERVER]->server", "app-[:HAS_ENV]->appEnv")
.Return((server, appEnv, app) =>
new
{
ServerName = Return.As<string>("server.serverId"),
aa = Return.As<IEnumerable<string>>("collect([appEnv.environmentTypeId,appEnv.appEnvId,app.appId,app.appName])")
})
.Results;

我已经更改了 aa 的返回类型属性为IEnumerable<string> .

另一条路线是使用 GroupBy获取数据后:

var query2 = GraphClient
.Cypher
.Start(new { server = new NodeReference(1) })
.Match("server-[:IS_SERVER_TYPE]->type", "appEnv-[:HAS_SERVER]->server", "app-[:HAS_ENV]->appEnv")
.Return((server, appEnv, app) =>
new
{
ServerId = Return.As<string>("server.ServerId"),
EnvironmentTypeId = Return.As<string>("appEnv.EnvironmentTypeId"),
AppEnvId = Return.As<string>("appEnv.AppEnvId"),
AppId = Return.As<string>("app.AppId"),
AppName = Return.As<string>("app.AppName"),
});

var results2 = query2.Results.GroupBy(g => g.ServerId).ToList();

我认为这会以您想要的方式为您提供结果,我想这里的问题是执行 collect 是否更高效在服务器上,或到 GroupBy在客户端...

关于c# - Neo4jClient Cypher 查询收集具有多个值的语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18439371/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com