CypherResultMode.Projection和CypherResultMode.Set之间的区别

时间:2014-01-10 10:34:10

标签: c# neo4j neo4jclient

C#.Net Neo4jclient中CypherResultMode.Projection和CypherResultMode.Set有什么区别?

1 个答案:

答案 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;
}

要点:

  • 投影=多列,每行一个对象,每列一个属性
  • Set =我想忘记Cypher表,只是得到一堆对象