2015-05-21 23 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

我还没有检查这段代码是否编译。但它应该清楚整体的想法。 –

相关问题