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

时间:2016-03-15 10:15:15

标签: neo4j neo4jclient

在我问的问题之后:Build a dynamic query using neo4j client

我得到了一个关于如何仅使用字符串动态返回值的答案。

当我尝试使用语法从查询中返回多个值时,它失败了,
我尝试了以下查询:

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])"));

我收到以下错误:

  

反序列化器以单列模式运行,但是响应   包括多个列,表示投影。如果   使用流畅的Cypher接口,使用Return的重载   采用lambda或object而不是单个字符串。 (过载与   单个字符串用于标识,而不是原始查询文本:我们无法映射   如果您只提供原始查询文本,则列会退出。)

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

1 个答案:

答案 0 :(得分:4)

我们无法获得您之前提出的问题中的输出 - 这是因为您要求节点(movie)和字符串集合({{ 1}})它们没有共同的属性,甚至没有属性。

首先,让我们看看这种痛苦的方式:

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; 电影节点,或者写一个强类型的课程。

就动态&#39;而言。对象,我不知道你想如何与return语句的JsonConvert.DeserializeObject<dynamic>()部分进行交互,如果这没有帮助,你可能需要更新问题以显示使用期望。