当返回的标签未知时在 Neo4jClient 中使用 .As<>
Using .As<> in Neo4jClient When Returned Label(s) are Unknown
当您 运行 查询但希望 return 编辑多个标签时,有没有人找到解决方案?
例如,假设我有以下查询 return 与 Movie
关联的所有人:
MATCH (movie:Movie)-[link]->(person)
WHERE movie.Title = "The Princess Bride"
RETURN person;
person
可能是 Director
、Actor
、Producer
或数据库中的其他标签,但结果并没有告诉我这些,也没有似乎有一种方法可以在查询中解决这个问题(除了使用 Labels()
)。
我为每个指定字段的标签定义了 类,因此我可以对它们执行各种操作,但我不确定如何使用 Neo4jClient 来解析这些类型。
目前我一直在做以下事情:
IEnumerable<Actor> actorResult = this._graphClient.Cypher
.Match("(movie:Movie)-[link]->(person:Actor)")
.Where((Movie movie) => movie.Title == "The Princess Bride")
.Return((person) => person.As<Actor>())
.Results;
并为每个标签重复该操作(适当地替换 label/types),但是三个查询显然不理想,因为您可以轻松地一次完成。我在想我可以收集节点的标签,遍历结果,并基于它进行投射,但是很多额外的工作并没有最终奏效;我仍然需要能够从 object
转换为我定义的类型。
我可能完全想多了,但我很感激任何建议。
如果你要从一个查询中提取多种类型,你总是必须做一些反序列化,这是可行的,但它是否更高效?这需要进行一些测试 - 就个人而言 - 我认为 在代码中进行反序列化与 3 次调用数据库相比更好。
这是一个非常基本的示例,但它应该可以帮助您:
var query = _graphClient.Cypher
.Match("(movie:Movie)-[link]->(person)")
.Where((Movie movie) => movie.Title == "The Princess Bride")
.Return(person => new {
Node = person.As<Node<string>>(),
Labels = person.Labels()
});
var actors = new List<Actor>();
var directors = new List<Director>();
foreach(var person in query.Results)
{
if(person.Labels.Contains("Actor")
actors.Add(JsonConvert.DeserializeObject<Actor>(person.Node.Data));
if(person.Labels.Contains("Director")
directors.Add(JsonConvert.DeserializeObject<Director>(person.Node.Data));
/* ETC */
}
当您 运行 查询但希望 return 编辑多个标签时,有没有人找到解决方案?
例如,假设我有以下查询 return 与 Movie
关联的所有人:
MATCH (movie:Movie)-[link]->(person)
WHERE movie.Title = "The Princess Bride"
RETURN person;
person
可能是 Director
、Actor
、Producer
或数据库中的其他标签,但结果并没有告诉我这些,也没有似乎有一种方法可以在查询中解决这个问题(除了使用 Labels()
)。
我为每个指定字段的标签定义了 类,因此我可以对它们执行各种操作,但我不确定如何使用 Neo4jClient 来解析这些类型。
目前我一直在做以下事情:
IEnumerable<Actor> actorResult = this._graphClient.Cypher
.Match("(movie:Movie)-[link]->(person:Actor)")
.Where((Movie movie) => movie.Title == "The Princess Bride")
.Return((person) => person.As<Actor>())
.Results;
并为每个标签重复该操作(适当地替换 label/types),但是三个查询显然不理想,因为您可以轻松地一次完成。我在想我可以收集节点的标签,遍历结果,并基于它进行投射,但是很多额外的工作并没有最终奏效;我仍然需要能够从 object
转换为我定义的类型。
我可能完全想多了,但我很感激任何建议。
如果你要从一个查询中提取多种类型,你总是必须做一些反序列化,这是可行的,但它是否更高效?这需要进行一些测试 - 就个人而言 - 我认为 在代码中进行反序列化与 3 次调用数据库相比更好。
这是一个非常基本的示例,但它应该可以帮助您:
var query = _graphClient.Cypher
.Match("(movie:Movie)-[link]->(person)")
.Where((Movie movie) => movie.Title == "The Princess Bride")
.Return(person => new {
Node = person.As<Node<string>>(),
Labels = person.Labels()
});
var actors = new List<Actor>();
var directors = new List<Director>();
foreach(var person in query.Results)
{
if(person.Labels.Contains("Actor")
actors.Add(JsonConvert.DeserializeObject<Actor>(person.Node.Data));
if(person.Labels.Contains("Director")
directors.Add(JsonConvert.DeserializeObject<Director>(person.Node.Data));
/* ETC */
}