我开始玩neo4jclient,虽然我找到了显示拉出节点等的维基页面。但我很难混淆如何从graphDB中获取更复杂的结构并重新构建它进入我的POCO对象。
举个例子,说我有以下图表:
我有以下课程:
public class Person
{
public string name { get; set; }
public List<Sport> watches { get; set; }
public List<Sport> plays { get; set; }
}
public class Sport
{
public string name { get; set; }
public GoverningBody governingBody { get; set; }
}
public class GoverningBody
{
public string name { get; set; }
}
有人可以给我一些c#代码,我需要用它来提取大卫&#34;以及他所扮演的运动和这项运动的管理机构。最终目标是Person,Sport(s)和GoverningBody对象都将被填充,以便我可以在C#代码中正常使用它们。
由于 大卫
答案 0 :(得分:1)
这是一个非常快速的解决方案 - 您可以在With
语句中创建(实际上)匿名类型,您可以将其解析为结果,例如,添加SportAndGovern
类:
public class SportAndGovern
{
public Sport Sport { get; set; }
public GoverningBody Govern { get; set; }
}
你可以执行这个Cypher(我没有使用参数化的东西,你应该)让一个人有一个他们玩的运动列表 - 你最终会回来重复的管理机构回来,即每个人观看的运动一个。
var query = Client.Cypher
.Match("(p:Person {Name:'David'})")
.OptionalMatch("(p)-[:PLAYS]->(s:Sport)<-[:GOVERNS]-(g:GoverningBody)")
.With("p, Collect(Distinct {Sport: s, Govern: g}) as sportAndGovern")
.Return((p, sportAndGovern) => new
{
Person = p.As<Person>(),
SportAndGovern = Return.As<IEnumerable<SportAndGovern>>("sportAndGovern")
});
答案 1 :(得分:0)
此代码可以帮助您入门
var userQuery = client.Cypher
.Match("(n:Person { name: 'David'})-[:PLAYS]->(s:Sport)")
.Return((n, s) => new
{
Peep = n.As<Person>(),
Sports = s.CollectAsDistinct<Sport>()
})
.Results
.FirstOrDefault();
var david = userQuery.Peep;
david.plays = userQuery.Sports.ToList();
所以在稍微详细一点上看这一点有一点需要注意。
首先,client
指的是Neo4jClient
的一个实例,并假设您之前已初步确定此内容。
其次,该查询假设您只有一个Person
节点,其中name
属性的值为"David"
。
Return
子句将查询结果投影为匿名类型。它使用CollectAsDistinct
方法返回IEnumerable<Sport>
集合。这将转换为Cypher中的COLLECT(distinct s)
以收集Sport
个节点。
最后,然后用户使用匿名类型来构建要返回的Person
对象。