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

How to return the whole node with all its properties from Neo4J .NET client?

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

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

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 获得我想要获得的东西,或者我必须以某种方式降低级别?

所以在幕后,Neo4jClient 使用 Json.NET 将 Neo4j 的输出反序列化为您指定的 class。当您指定没有属性的 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);
}

我想这会得到你想要的,如果 I 是你,我可能会 return 一个 Task<IEnumerable<dynamic>> 而不是重新序列化为 string, 但我不知道你想用这些结果做什么,所以可能不合适。

请参阅 Casting nodes of an unknown type 了解更多信息。

您可以 return 通过创建广义节点 class 节点及其所有属性。

准确的说,

可以做到
  • 创建广义化"GenNode"Class
  • 将您的结果转换为 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;
}

注意return类型。