[英]How get relationship's startNodeId and endNodeId using Neo4jClient?
[英]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
可以是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
为定义的类型。
我可能完全想过这一点,但是我很感谢任何建议。
如果要从一个查询中提取多种类型,则总是必须进行反序列化,这是可行的,但是关于它是否更具性能呢? 这将需要一些测试-个人-我认为这是更好地做反序列化的代码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.