2014-01-13 71 views
1

我知道如何動態地創建我的MATCHWHERE子句,而在我的情況下,它不幸是我必須做的事情......所以,我有類似的東西(這是一個人爲的例子):從Neo4jclient動態返回

var query = client 
    .Cypher 
    .Match("(u1:User)-[:LINKED]->(w:Web)","(u2:User)-[:LINKED]->(w:Web)","(u3:User)-[:LINKED]->(w:Web)") 
    .Where("u1.User.Id = {u1Param}").WithParam("u1Param", 1) 
    .AndWhere("u2.User.Id = {u2Param}").WithParam("u2Param", 2) 
    .AndWhere("u3.User.Id = {u3Param}").WithParam("u3Param", 3); 

MatchWhere基於用戶輸入是動態生成的,並且這產生了正確的Cypher支架。

MATCH 
    (u1:User)-[:LINKED]->(w:Web), (u2:User)-[:LINKED]->(w:Web), (u3:User)-[:LINKED]->(w:Web) 
WHERE 
    u1.User.Id = 1 
    AND u2.User.Id = 2 
    AND u3.User.Id = 3 

在服務器(在Cypher支架),我可以這樣做:

RETURN u1, u2, u3 

,我會得到3個節點我在尋找。我的問題是Returning數據的通用方式通過neo4jclient是通過表達,所以,複製我會做:

query.Return(
    (u1, u2, u3) => 
    { 
     U1 = u1.As<User>(), 
     U2 = u2.As<User>(), 
     U3 = u3.As<User>() 
    }); 

我不知道,只會有「3」的反應,有可能是更多,甚至更少。任何想法如何實現這一目標?無論是現狀,還是完全不同的方式,我都樂於接受所有選擇。

我想是這樣的:

query.Return<User>("u1", "u2", "u3"); //returning IEnumerable<User> 

或可能:

query.Return<User>("u1").AndReturn("u2").AndReturn("u3"); 

我知道我可以直接通過HttpClient或一些這樣這些查詢返回到調用分貝,但我如果可以的話,寧願避免。說實話,我很樂意將它們全部解析到dynamic,但目前還不可能(或者是??? :))。

回答

2

對於像這樣的動態返回形狀,Neo4jClient沒有任何好的解決方案。

在這個人爲的例子中,至少可以將節點壓扁成單個列表嗎?

.Return<IEnumerable<User>>("[u1, u2, u3]") 

你可以很容易分辨出哪是你正在使用的WHERE條款來看,這也將是C#提供的Id財產。

+0

不幸的是,在'''的代碼中有一個檢查會導致一個異常:「你調用的重載需要一個標識(例如:foo),但它看起來像你試圖傳入一個多列語句(例如:foo,bar)「 –

+0

但是,如果我在調試器中跳過它,它會按預期工作,我將在修復中發出一個請求... –

+0

您可以完成。返回()=> new {Users = Return.As >(「[u1,u2,u3]」)})。Results.SelectMany(r => r.Users)是一個笨重的解決方法。 :) –