2013-07-10 116 views
1

我無法從Cypher查詢中檢索匹配的關係。Neo4jClient - 從Cypher查詢關係查詢

我有這個簡單的試用代碼:

var movie = client.Create(new Movie { Title = "The Matrix" }); 

client.Create(new Actor { Name = "Keanu Reeves" }, 
    new ActedIn(movie, new ActedInPayload { Role = "Neo" })); 

client.Create(new Actor { Name = "Hugo Weaving" }, 
    new ActedIn(movie, new ActedInPayload { Role = "Agent Smith" })); 

var actorsAndRoles = client 
    .Cypher 
    .Start(new { movie = movie }) 
    .Match("actor-[r:ACTED_IN]->movie") 
    .Return((actor, r) => new 
    { 
     Actor = actor.As<Node<Actor>>() 
     // ActedIn = r.As<?????>() 
    }) 
    .Results; 

問題是,我不知道如何鑄就R(與匹配的關係)。

嘗試過各種「.As」類型轉換,但沒有任何工作。因爲我的關係類沒有無參數構造函數,所以Casting to Relationship不起作用 - 但是,然後關係基類本身沒有無參數構造函數,所以不要認爲這會起作用。另一方面投射到RelationshipReference會導致異常。根本不投射(只是返回r)導致「不支持」的例外。

有一些關於此問題的相關SO條目,但其中的建議代碼不再有效或已被棄用。

如何檢索匹配關係?

回答

5

您可以爲您的關係類型參數的構造函數,你只要把它傳遞「達夫」的數據,這我知道聽起來很糟糕,但你並不真的需要它,它不會傷害你:

public class ActedIn : Relationship<ActedInPayload>, IRelationshipAllowingSourceNode<Actor>, IRelationshipAllowingTargetNode<Movie> 
{ 
    public ActedIn() : base(-1, null) {} 
    public ActedIn(NodeReference targetNode, ActedInPayload data) : base(targetNode, data) {} 

    public override string RelationshipTypeKey 
    { 
     get { return "ACTED_IN"; } 
    } 
} 

所以這是ActedIn類,與參數的構造函數鏈一個「-1」到基構造函數。

你的查詢就變成了:

var actorsAndRoles = client 
    .Cypher 
    .Start(new {movie}) 
    .Match("actor-[r:ACTED_IN]->movie") 
    .Return((actor, r) => new 
     { 
      Actor = actor.As<Node<Actor>>(), 
      ActedIn = r.As<RelationshipInstance<ActedInPayload>>() 
     }) 
    .Results; 

注意,它被強制轉換爲類型的RelationshipInstanceActedInPayloadActedIn,然後,來獲取數據,你可能想:

foreach (var actorsAndRole in actorsAndRoles) 
{ 
    Console.WriteLine("{0} acted as {1} - which is in the db as {2}-[ACTED_IN]->{3}", 
     actorsAndRole.Actor.Data.Name, 
     actorsAndRole.ActedIn.Data.Role, 
     actorsAndRole.ActedIn.StartNodeReference.Id, 
     actorsAndRole.ActedIn.EndNodeReference.Id); 
} 

哪會給你類似的東西:

奇洛李維斯充當新 - 這是在作爲DB 482- [ACTED_IN] - > 481

雨果充當代理史密斯 - 這是在作爲DB 483- [ACTED_IN] - > 481

雖然顯然在你自己的數據庫上有不同的數字。

+1

謝謝!我發現使用繼承自非泛型關係類的關係類可以直接轉換爲此類型而不是有效數據類型。 –

+0

我也可以使用neo4jclient的1.0.0.662版繼承關係類,從「Relationship 」中繼承關係類,從而省略中間'Node <>'。不過,我很難在一個地方找到更新版本的neo4jclient的文檔。 –