使用Neo4jClient返回复合类

时间:2013-12-06 12:44:20

标签: cypher neo4jclient

Neop4jClient cypher wiki(https://github.com/Readify/Neo4jClient/wiki/cypher)包含一个使用lambda表达式返回多个投影的示例......

var query = client
.Cypher
.Start(new { root = client.RootNode })
.Match("root-[:HAS_BOOK]->book-[:PUBLISHED_BY]->publisher")
.Return((book, publisher) => new {
    Book = book.As<Book>(),
    Publisher = publisher.As<Publisher>(),
});

因此查询将返回书籍节点和发布者节点的详细信息。但我想做一些略有不同的事情。我想将单个节点类型的内容与匹配路径的属性组合在一起。假设我有Person节点的属性'name',以及一个定义的类,,,

public class descendant
{
    public string name { get; set; }
    public int depth { get; set; }
}

像这样的密码查询将返回我想要的东西,这是给定节点的所有后代与关系的深度......

match p=(n:Person)<-[*]-(child:Person) 
where n.name='George' 
return distinct child.name as name, length(p) as depth

如果我尝试像这样的Neo4jClient查询...

var query =
     _graphClient.Cypher
          .Match("p=(n:Person)<-[*]-(child:Person)")
          .Where("n.name='George'")
          .Return<descendant>("child.name,  length(p)") ;

我收到错误,语法已过时,但我无法弄清楚如何将cypher结果投影到我的C#POCO上。任何人的想法?

1 个答案:

答案 0 :(得分:0)

查询应如下所示:

var query = 
    _graphClient.Cypher
        .Match("p=(n:Person)<-[*]-(child:Person)")
        .Where((Person n) => n.name == "George")
        .Return((n,p) => new descendant
        {
            name = n.As<Person>().Name,
            depth = p.Length()
        });

Return语句应该包含您关心的2个参数(在本例中为np)并通过lambda语法(=>)进行投影以创建一个新的descendant实例。 这与示例的不同之处在于,该示例创建了一个新的匿名类型,而您希望创建一个具体类型。

然后我们使用属性初始值设定项({ }大括号内的代码)来设置名称和深度,使用As<>Length扩展方法来获取所需的值。< / p>

作为旁注,我还更改了Where子句以使用参数,如果可以,始终执行此操作,它将使您的查询更快更安全。