如何从Neo4J .NET客户端返回整个节点及其所有属性?

时间:2015-05-21 20:26:09

标签: c# neo4j neo4jclient

我正在尝试制作一个可以过滤连接到用户的对象的通用代码。这些对象可以是不同类型,具有不同的属性等。

基本上我想实现这个方法:

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 个答案:

答案 0 :(得分: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>>而不是重新序列化为string,但我不会&#39 ; t知道你想用什么结果,所以可能不合适。

有关详细信息,请参阅Casting nodes of an unknown type

答案 1 :(得分:0)

您可以通过创建通用节点类来返回具有其所有属性的节点。

准确地说,可以通过

来完成
  • 创建广义“GenNode”类
  • 将结果投射为GenNode

C#Class:

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

重写方法:

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;
}

注意返回类型。