使用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
部分交互,如果这没有帮助,您可能需要更新问题以显示使用预期。
按照我问的问题:
我得到了关于如何 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
部分交互,如果这没有帮助,您可能需要更新问题以显示使用预期。