2

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
  ]) ;

クエリは、サーバーごとに 1 行を返し、そのサーバー上のすべてのアプリケーションを収集します。

私が見る限り、.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
4

1 に答える 1

5

これは、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、クライアントで実行する方がパフォーマンスが高いかということです...

于 2013-08-27T08:18:57.583 に答える