繁体   English   中英

返回的标签未知时,在Neo4jClient中使用.As <>

[英]Using .As<> in Neo4jClient When Returned Label(s) are Unknown

是否有人在您运行查询时想出一种解决方案,但希望返回多个标签?

例如,说我有以下查询可返回与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;

并为每个标签重复该操作(适当替换标签/类型),但是当您可以轻松地一次完成三个查询时,三个查询显然并不理想。 我本以为可以收集节点的标签,循环遍历结果,然后基于此进行转换,但是很多额外的工作最终没有奏效。 我仍然需要能够从object为定义的类型。

我可能完全想过这一点,但是我很感谢任何建议。

如果要从一个查询中提取多种类型,则总是必须进行反序列化,这是可行的,但是关于它是否更具性能呢? 这将需要一些测试-个人-我认为这更好地做反序列化的代码VS 3X调用数据库。

这是一个非常基本的示例,但是应该可以帮助您:

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 */
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM