2013-02-26 75 views
1

我可以創建一個關係,我有它的RelationshipReference。但是,我如何獲得有效載荷和所有關係的其餘部分?如何使用Neo4jClient通過其ID來獲取Neo4j關係?

與節點我可以只client.Get(nodeid)但AFAIK沒有什麼類似的關係。


Gremlin要走了嗎?如果是這樣 - 有人可以給我一個提示,因爲我仍然在試用和恐嚇如何通過Neo4jClient做到這一點。

+1

如果答案請看到 http://stackoverflow.com/questions/12491221/how-do-i-retrieve -a-relationship-in-neo4j-graph-database 可以幫助你。 – 2013-02-26 11:47:58

+0

@ChrisSkardon完美 - 但現在我得到{「無法訪問Newtonsoft.Json.Linq.JProperty上的子值」。}而是。將它們手動添加到關係並從ExecuteGetAllRelationshipsGremlin中刪除也無濟於事。 – LosManos 2013-02-26 12:41:53

回答

3

你可以使用一個擴展方法爲IGraphClient本身:

public static class GraphClientExtensions 
{ 
    public static RelationshipInstance<T> GetRelationship<T>(this IGraphClient graphClient, RelationshipReference relationshipReference) where T : Relationship, new() 
    { 
     if(graphClient == null) 
      throw new ArgumentNullException("graphClient"); 
     if(relationshipReference == null) 
      throw new ArgumentNullException("relationshipReference"); 

     var rels = graphClient.ExecuteGetAllRelationshipsGremlin<T>(string.Format("g.e({0}).outV.outE", relationshipReference.Id), null); 
     return rels.SingleOrDefault(r => r.Reference == relationshipReference); 
    } 
} 

用法:( IsFriendOf是一個關係派生類,數據只是一個POCO)

var d1 = new Data{Name = "A"}; 
var d2 = new Data{Name = "B"}; 

var d1Ref = graphClient.Create(d1); 
var d2Ref = graphClient.Create(d2); 
var rel = new IsFriendOf(d2Ref) { Direction = RelationshipDirection.Outgoing }; 
var relRef = graphClient.CreateRelationship(d1Ref, rel); 

//USAGE HERE 
var relBack = graphClient.GetRelationship<IsFriendOf>(relRef); 

它的效果並不理想,但它確實使你的代碼有點更容易閱讀。 (加上你不需要知道節點,只是關係參考)

0

由於this一個變種我得到這個工作:

// Get every relation going out from the node we used as out-node 
// when we created the relation. 
var query = string.Format("g.v({0}).outE", fromNodeID); 
var rels = _client.ExecuteGetAllRelationshipsGremlin<MyPayload>(
    query, null 
); 
// We can get too many so filter per ID. 
var rel = rels.Single(r => r.Reference.Id == relID); 

但是,這不是我想要的工作方式。我有一個ID,最快的就是使用它,不是嗎?

我已經試過

var rels = _client.ExecuteGetAllRelationshipsGremlin<MyPayload>(
    "g.e(42)", null 
); 

,但所發生的一切是我得到異常:

{"Cannot access child value on Newtonsoft.Json.Linq.JProperty."} 

沒有在連載開始與有效載荷什麼。 (bug?)另外:刪除<MyPayload>沒有幫助。所以我不認爲這是一個反序列化問題;但查詢「g.e(42)」的結果與作爲工作解決方法提到的「g.v(11).outE」不同。

(Neo4j的版本是1.9.M04和我Neo4jClient應該只是一週半的歷史。)

+0

我認爲*問題在於'ExecuteGetAllRelationshipsGremlin'方法正在尋找一個關係集合,而不僅僅是一個,因此反序列化器試圖獲得一個集合,但是你只能帶回一個關係。 – 2013-02-27 12:06:02