2016-10-06 1 views
0

クエリを実行しているときに複数のラベルが返されることを期待している人は誰でも解決策を見つけましたか?例えばNeo4jClientで.As <>を使用すると返されるときラベルが不明です

、私はMovieに関連付けられているすべての人を返すために、次のクエリを持っていると言う:

MATCH (movie:Movie)-[link]->(person) WHERE movie.Title = "The Princess Bride" RETURN person;

personデータベースでDirectorActorProducer、または他のいくつかのラベルかもしれないが、結果は私にそのことを教えてくれないし、クエリ内でそれを理解する方法もないようだ(Labels()を除く)。

私は期待しているフィールドを指定するラベルをそれぞれ定義していますので、さまざまな操作を実行できますが、Neo4jClientを使用してこれらのタイプを解決する方法がわかりません。

現在、私は次のことを行ってきた:ときに、同じようにすることができます

IEnumerable<Actor> actorResult = this._graphClient.Cypher .Match("(movie:Movie)-[link]->(person:Actor)") .Where((Movie movie) => movie.Title == "The Princess Bride") .Return((person) => person.As<Actor>()) .Results;

そして、それぞれのラベルのためにそれを繰り返すことは、(適切なラベル/タイプを交換する)が、3つのクエリは明らかに理想的ではありません1つで簡単に行うことができます。私はノードのラベルを収集し、結果をループし、それに基づいてキャストすることができると思っていましたが、それは機能しなくなった余分な作業の多くです。私はまだobjectから私の定義された型にキャストできる必要があります。

私はこの1つを完全に思っているかもしれませんが、私は何か提案をいただきありがとうございます。

答えて

1

1つのクエリから複数の型を取り出す場合は、常にデシリアライゼーションを行う必要がありますが、それは実行可能ですが、それがパフォーマンスが良いかどうかについては、それはいくつかのテストを行うつもりです - 個人的に - 私はであると思います。

これは非常に基本的な例であるが、それはそこにあなたを取得する必要があります:

var query = _graphClient.Cypher 
    .Match("(movie:Movie)-[link]->(person)") 
    .Where((Movie movie) => movie.Title == "The Princess Bride") 
    .Return(person => new { 
     Node = person.As<Node<string>>(), 
     Labels = person.Labels() 
    }); 

var actors = new List<Actor>(); 
var directors = new List<Director>(); 

foreach(var person in query.Results) 
{ 
    if(person.Labels.Contains("Actor") 
     actors.Add(JsonConvert.DeserializeObject<Actor>(person.Node.Data)); 
    if(person.Labels.Contains("Director") 
     directors.Add(JsonConvert.DeserializeObject<Director>(person.Node.Data)); 
    /* ETC */ 
} 
+0

私はNeo4jClientで 'ノード<>'クラスを逃したのか分からない...それは私が探していたまさにですために。はい、特に私が3つ以上のデータベースコールを持っている他のケースでは、私は同意します。パフォーマンスのメリットは大規模になります。この返答いただきありがとうございます!これは非常に役に立ちます。 –

関連する問題