C# 具有多个值的Neo4jClient Cypher查询收集语句
我正在尝试将一个来自cypher的查询转换为在c中使用neo4jclient api# 这是我的密码C# 具有多个值的Neo4jClient Cypher查询收集语句,c#,neo4j,neo4jclient,C#,Neo4j,Neo4jclient,我正在尝试将一个来自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,
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只允许单个值
如何使用.NETAPI实现这一点
编辑
我刚刚试过这个问题
_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;
消息——为简洁起见,删除了样板文本
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
Neo4jClient在反序列化服务器响应时遇到异常。这可能是Neo4jClient中的一个bug。
包括f_uuAnonymousType1`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]]。
包括此原始JSON,任何敏感值都替换为非敏感等效值:
{“列”:[“服务器名”、“aa”]、“数据”:[“SHO2K3MS49”[“PRD”、“MATT.PRD”、“MATT”、“MATT”]、[“PRD”、“ARCSERV.PRD”、“ARCSERV”、“ARCSERV”]、[“PRD”、“ACTIVE DIRECTORY\u WINDOWS SERVER NETWORKING\u.PRD”、“ACTIVE DIRECTORY\u WINDOWS SERVER NETWORKING\u”、“ACTIVE DIRECTORY(WINDOWS SERVER NETWORKING)”]]
参数名称:内容
这是因为从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;
我认为这会以您想要的方式为您提供结果,我想这里的问题是,在服务器上执行收集
,还是在客户端执行GroupBy
"[\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;
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();