当返回的标签未知时在 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 可能是 DirectorActorProducer 或数据库中的其他标签,但结果并没有告诉我这些,也没有似乎有一种方法可以在查询中解决这个问题(除了使用 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 */
}