2015-12-11 96 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

我只在幾個月前才學會了自己做這件事:) –