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上。任何人的想法?
答案 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个参数(在本例中为n
和p
)并通过lambda语法(=>
)进行投影以创建一个新的descendant
实例。
这与示例的不同之处在于,该示例创建了一个新的匿名类型,而您希望创建一个具体类型。
然后我们使用属性初始值设定项({ }
大括号内的代码)来设置名称和深度,使用As<>
和Length
扩展方法来获取所需的值。< / p>
作为旁注,我还更改了Where
子句以使用参数,如果可以,应始终执行此操作,它将使您的查询更快更安全。