我们无法获得像您之前提出的问题那样的输出 - 这是因为您正在要求一个节点(movie
)和字符串集合(collect
)并且它们没有共同的属性,甚至没有共同的属性样式。
首先,让我们看看执行此操作的痛苦方法:
var q = gc.Cypher
.Match("(movie:Movie)")
.OptionalMatch("(movie)<-[r]-(person:Person)")
.Return(() => Return.As<string>("{movie:movie, roles:collect([person.name, head(split(lower(type(r)), '_')), r.roles])}"));
var results = q.Results;
这里我们取查询项(movie, r, person
)并用它们创建一个类型{}
围绕结果,并将其转换为string
.
这会给你一个可怕的字符串Node
周围的数据movie
然后是角色的集合:
foreach (var m in results)
{
//This is going to be painful to navigate/use
dynamic d = JsonConvert.DeserializeObject<dynamic>(m);
Console.WriteLine(d.movie);
Console.WriteLine(d.roles);
}
你最好做这样的事情:
var q = gc.Cypher
.Match("(movie:Movie)")
.OptionalMatch("(movie)<-[r]-(person:Person)")
.Return(() => new
{
Movie = Return.As<Node<string>>("movie"),
Roles = Return.As<IEnumerable<string>>("collect([person.name, head(split(lower(type(r)), '_')), r.roles])")
});
var res = q.Results;
你可以JsonConvert.DeserializeObject<dynamic>()
电影节点,在您有空的时候,或者编写一个强类型类。
就“动态”对象而言,我不知道您想如何与collect
return 语句的一部分,如果这没有帮助,您可能需要更新问题以显示使用预期。