在我问的问题之后: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而不是单个字符串。 (过载与 单个字符串用于标识,而不是原始查询文本:我们无法映射 如果您只提供原始查询文本,则列会退出。)
是否可以仅使用字符串返回多个节点?
答案 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>()
部分进行交互,如果这没有帮助,你可能需要更新问题以显示使用期望。