neo4jclient to POCO objectGraph

时间:2015-12-11 07:40:51

标签: c# neo4j neo4jclient

我开始玩neo4jclient,虽然我找到了显示拉出节点等的维基页面。但我很难混淆如何从graphDB中获取更复杂的结构并重新构建它进入我的POCO对象。

举个例子,说我有以下图表:

graphDB

我有以下课程:

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#代码中正常使用它们。

由于 大卫

2 个答案:

答案 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对象。