使用.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转换到我定义的类型。

我可能想得太多了,但是我很感谢你的建议。

使用.As<比;在Neo4jClient返回标签(s)是未知的

如果你要从一个查询中提取多个类型,你总是需要做一些反序列化,这是可行的,但它是否更性能?这将需要一些测试-个人-我认为在代码中做反序列化比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 */
}