C#.Net Neo4jclient中CypherResultMode.Projection和CypherResultMode.Set有什么区别?
答案 0 :(得分:1)
(上下文:我是Neo4jClient的作者。)
这些是内部的,你永远不应该处理它们。
如果您正在使用它们,那么您不会按照我的预期方式使用该库,也不会按照我记录的方式使用该库。
无论如何,它们存在的原因如下......
Cypher返回表格。每一行都成为C#land中的结果对象。
MATCH n-[r]-()
RETURN n as Col1, r as Col2
___________________
| Col1 | Col2 |
===================
| a | b | <--- this row becomes an object
| c | d | <--- this row becomes an object
-------------------
现在,在这个多列场景中,每行都是一个对象是有意义的。我们这样使用它:
foreach (var result in query.Results)
{
result.Col1;
result.Col2;
}
但是,我们只想找到所有用户:
MATCH (u:User)
RETURN u as User
__________
| User |
==========
| a | <--- this row becomes an object
| c | <--- this row becomes an object
----------
遵循与以前相同的逻辑,我们可以这样访问它:
foreach (var result in query.Results)
{
result.User;
}
因为每个结果都代表一行,所以我们必须手动从该行获取用户。
这样做更自然:
foreach (var user in query.Results)
{
user;
}
这就是'设置'模式的作用。它会导致Neo4jClient在对其进行反序列化时“解包”该行,并有效地忽略了结果为表的事实。
正是这段管道使这段代码成为可能:
var users = graphClient.Cypher
.Match("(u:User)")
.Return<User>("u")
.Results;
foreach (var user in users) {}
没有它,你必须写下这个:
public class UserResult
{
public User u { get; set; }
}
var results = graphClient.Cypher
.Match("(u:User)")
.Return<UserResult>("u")
.Results;
foreach (var result in results)
{
var user = result.u;
}
或者,您必须使用匿名类型:
var results = graphClient.Cypher
.Match("(u:User)")
.Return(u => new {
User = u.As<User>()
})
.Results;
foreach (var result in results)
{
var user = result.User;
}
要点: