使用neo4j客户端在动态查询中返回多值

Returning multi value in dynamic query using neo4j client

按照我问的问题:

我得到了关于如何 return 仅使用字符串动态赋值的答案。

当我尝试将语法用于 return 来自查询的多个值时,它失败了,
我尝试了以下查询:

var resQuery2 = WebApiConfig.GraphClient.Cypher
            .Match("(movie:Movie {title:{title}})")
            .OptionalMatch("(movie)<-[r]-(person:Person)")
            .WithParam("title", title)
            .Return(() => Return.As<string>("movie, collect([person.name, head(split(lower(type(r)), '_')), r.roles])"));

我收到以下错误:

The deserializer is running in single column mode, but the response included multiple columns which indicates a projection instead. If using the fluent Cypher interface, use the overload of Return that takes a lambda or object instead of single string. (The overload with a single string is for an identity, not raw query text: we can't map the columns back out if you just supply raw query text.)

是否可以 return 多个节点仅使用字符串?

我们无法像您之前提出的问题那样获得输出 - 这是因为您要求的是节点(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.

这会给你一个可怕的字符串,其中包含 movie 周围的 Node 数据,然后是角色的集合:

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>() Movie 节点,或者编写强类型 class。

就 'dynamic' 对象而言,我不知道您想如何与 return 语句的 collect 部分交互,如果这没有帮助,您可能需要更新问题以显示使用预期。