2015-12-11 25 views
0

我开始与neo4jclient玩,虽然我已经找到了维基网页这表明拉出节点等。我有点困惑如何采取slighlty更复杂的结构从graphDB和重建它进入我的POCO对象。neo4jclient到POCO objectGraph

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

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#代码,我将需要使用把“大卫”以及他所参加的运动和该运动的管理机构一起拔出。最终目标是人,体育和GoverningBody对象都将被填充,以便我可以在C#代码中正常使用它们。

感谢 大卫

回答

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对象返回。

+0

感谢这个,它看起来完全合理。我明白你的例子只是为了让我开始然而,因为并主张它已经在我明白了GoverningBody创建循环引用(两种运动是由同一GoverningBody管辖)的问题。你能否扩展你的例子来展示如何正确处理? – DavidReid

+0

这实际上更多关于Cypher查询。如果我有时间,我会稍后再看看。在此期间,您可以尝试询问更多密码问题。如果您随后需要帮助将其转换为C#,则应该相对简单。 – ceej

+0

我不知道我是否错过了一些东西,但Cypher查询似乎是:“match(p:Person {name:'David'}) - [:Watches] - >(s:Sport)< - [ :Governs] - (g:GoverningBody)返回p,s,g“将需要的物品带回来,但将它们拉入POCO物件令我困惑。 – DavidReid

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") 
    }); 
+0

好的建议。 'Collect(Distinct {Sport:s,Govern:g})'对我来说是新的。值得+1。我喜欢学习! – ceej

+0

我只在几个月前才学会了自己做这件事:) –