0

私は流暢な構文に翻訳するのに苦労している次の Cypher を持っています:

MATCH (u:User)-[:HAS_ROLE]->(r:Role)-[:ROLE_OF]->(a:App) 
RETURN u AS User, COLLECT([r, a]) AS Roles

これは私がこれまでに持っているものですが、COLLECT([r, a]) を Roles として返す方法がわかりません。結果をビューに渡すことができるようにするために、UserDetails クラスを使用しています。

var results = _graphClient.Cypher
    .Match("(user:User)-[:HAS_ROLE]->(role:Role)-[:ROLE_OF]->(app:App)")
    .Return((user,role,app) => new UserDetails {
        User = user.As<User>(),
        Roles = ???
    })
    .OrderBy("user.Username")
    .Results;

私は最初に辞書を試しましたが、Neo4jClient は として返すことしかできませDictionary<string, T>Dictionary<Role,App>

Roles = Return.As<Dictionary<Role,App>>("COLLECT([role, app])") // doesn't work

使用する次のクラスを作成することも検討しましたが、それが機能する方法が見つかりません。

public class RoleWithApp
{
    public Role Role { get; set; }
    public App App { get; set; }
}

Roles = Return.As<List<RoleWithApp>>("COLLECT([role, app])") // doesn't work

これについての助け、またはそれを行うためのより良い方法の提案に非常に感謝しています。

どうもありがとう :)

4

2 に答える 2

1

問題は、Neo4j がクエリ結果を返す方法にあります。Neo4j でクエリを実行し、json をダウンロードすると、次のような結果になります。

"[[{\"RoleName\":\"R1\"},{\"AppName\":\"A1\"}]]"

JSON.Net はこれを解析する方法を知る方法がありません。次の形式のものが必要になります。

[{"Role":{"RoleName":"Bar"},"App":{"AppName":"Foo"}}]

重要なのは、JSON.Net を適切な場所に導く"Role:"との定義です。"App:"

残念ながら、@LameCoderの例のように値を直接読み取ったとしても、それについてできることはあまりありません-注文に関連するホーキー解析、または取得したもののプロパティを行う必要があります。

もちろん、将来、次のようなことができれば、COLLECT([role as Role, app as App])良い時代になるでしょう...

于 2013-11-18T12:08:36.977 に答える
0

誰かが質問の対象となる特定のドライバーに対して適切な回答を提供してくれることを願っていますが、コメントで手動で行う方法を尋ねられたため、これをコメントに入れる十分なスペースがないため、回答にしました。

これは非常に基本的なものであり、これを手動で行うことを開始するのに役立ちます。

var to = "http://localhost:7474/db/data/cypher";
var reqMsg = new HttpRequestMessage("POST", to);
var cypher = @" ... ";
var parameters = new Dictionary<string, object>();

var req = new {
    query = cypher,
    @params = parameters //Use @ to be able to use a keyword as an identifier
};

var body = JToken.FromObject(req);

//You don't have to use streams if you don't want to. I just like to avoid creating large strings
reqMsg.Content = new PushStreamContent((stream, content, context) =>
                    {
                        using (var sw = new StreamWriter(stream))
                        using (var jw = new JsonTextWriter(sw))
                        {
                            body.WriteTo(jw);
                        }
                    }, "application/json");

using (var client = new HttpClient())
{
    var response = await client.SendAsync(reqMsg, HttpCompletionOption.ResponseHeadersRead);
    if (!response.IsSuccessStatusCode)
    {
        var s = await response.Content.ReadAsStringAsync();
        throw new Exception("Got status code " + response.StatusCode + " with error: " + s);
    }

    using (var reader = new JsonTextReader(new StreamReader(await response.Content.ReadAsStreamAsync())))
    {
        var o = JObject.Load(reader);
        return o;
    }

}
于 2013-11-14T16:32:19.767 に答える