使用.As<比;在Neo4jClient返回标签(s)是未知的
本文关键字:未知 标签 返回 As Neo4jClient 使用 | 更新日期: 2023-09-27 18:11:50
有没有人想出一个解决方案,当你正在运行查询,但期望多个标签被返回?
例如,假设我有以下查询来返回与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;
并为每个标签重复该操作(适当地替换标签/类型),但是当您可以轻松地在一个中完成时,三个查询显然不是理想的。我想我可以收集节点的标签,循环遍历结果,并在此基础上进行强制转换,但这是大量额外的工作,最终没有工作;我仍然需要能够从object
转换到我定义的类型。
我可能想得太多了,但是我很感谢你的建议。
如果你要从一个查询中提取多个类型,你总是需要做一些反序列化,这是可行的,但它是否更性能?这将需要一些测试-个人-我认为是在代码中做反序列化比3次调用DB更好。
这是一个非常基本的例子,但它应该能让你明白:
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 */
}