如何从 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类型。
我正在尝试制作一个可以过滤连接到用户的对象的通用代码。这些对象可以是不同的类型,具有不同的属性等。
基本上我想实现这个方法:
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类型。