2015-05-21 64 views
0

我試圖做一個通用的代碼,可以過濾連接到用戶的對象。這些對象可以是不同類型的,具有不同的屬性等如何從Neo4J .NET客戶端返回具有其所有屬性的整個節點?

基本上我想要實現這個方法:

public string GetRelatedObjects(string sourceObject, string userId){ 
    var resQuery = GraphDB.Cypher 
    .Match("(src:" + sourceObject + ")--(usr:User { Id:{userId} })") 
    .WithParam("userId", userId) 
    .Return(src => src.As<object>()); 
    var result = await resQuery.ResultsAsync; 

    return JsonConvert.SerializeObject(result); 
} 

的問題是,當我使用.As<object>()我回來的空項。

當我把一個具體的類型,如.As<User>()我得到我期望的結果。有沒有辦法讓我想用Neo4JClient獲得什麼,或者我必須以某種方式降低水平?

回答

2

因此,Neo4jClient使用Json.NET將輸出從Neo4j反序列化到您指定的類中。正如你指定的object沒有屬性,你不會獲得任何屬性。 Neo4jClient和Json.NET都不知道你後面的內容,所以你只能得到object。現在,解決時間 - 您可以改爲使用dynamic

public async Task<string> GetRelatedObjectsAsJson(string sourceObject, string userId) 
{ 
    var resQuery = GraphDB.Cypher 
     .Match(string.Format("(src:{0})--(usr:User {{ Id:{{userId}} }})", sourceObject)) 
     .WithParam("userId", userId) 
     .Return(src => src.As<Node<string>>()); 
    var result = await resQuery.ResultsAsync; 

    var output = result.Select(node => JsonConvert.DeserializeObject<dynamic>(node.Data)).ToList(); 
    return JsonConvert.SerializeObject(output); 
} 

我想這會得到你想要的東西,如果我是你,我可能會返回一個Task<IEnumerable<dynamic>>,而不是reserializing到string,但我不知道你要使用的結果是什麼,所以也許不合適。

更多信息請參閱Casting nodes of an unknown type

0

您可以通過創建廣義節點類來返回具有其所有屬性的節點。

public class GenNode 
{ 
    public long Id { get; set; } 
    public IEnumerable<String> Labels { get; set; } 
    public Dictionary<String, String> Properties { get; set; } 
} 

準確地說,它可以通過

  • 創建廣義 「GenNode」 類
  • 鑄造你的結果作爲GenNode

C#類來完成

改寫方法:

public IEnumerable<GenNode> GetRelatedObjects(string sourceObject, string userId){ 
var resQuery = GraphDB.Cypher 
    .Match("(src:" + sourceObject + ")--(usr:User { Id:{userId} })") 
    .WithParam("userId", userId) 
    .With("src, properties(src) as prop") 
    .Return((src,prop) => new GenNode 
    { 
     Id = src.Id(), 
     Labels = src.Labels(), 
     Properties = prop.As<Dictionary<Object,Object>>() 
    }); 

    var result = await resQuery.ResultsAsync; 

    return result; 
} 

注重返回類型。

+0

我還沒有檢查這段代碼是否編譯。但它應該清楚整體的想法。 –

相關問題