2014-03-27 54 views
1

上下文(解釋在領域模型中使用「應用程序」這個詞):我的軟件管理假期申請(用於替代舊紙申請表格)。一個neo4j密碼查詢與可用於可選創建關係的可爲空參數 - 這可能嗎?

有沒有辦法在一個密碼查詢中接受可空/可選參數「projectManager」的下面兩個類似的查詢?

//createApplicationForUserWithProjMgr: 
    match (u:User), (s:User), (p:User), (l:User) 
     where u.username={username} and 
     s.username={substitute} and 
     p.username={projectManager} and 
     l.username={lineManager} 
    create (u)-[ur:APPLIED_FOR]->(a:Application), 
     (a)-[sr:SUBSTITUTE]->(s), 
     (a)-[pr:PROJECT_MANAGER]->(p), 
     (a)-[lr:LINE_MANAGER]->(l) 
    set a={application} 
    return a, s, l, u, sr, lr, ur, p, pr""" 

//createApplicationForUserWithoutProjMgr: 
    match (u:User), (s:User), (l:User) 
     where u.username={username} and 
     s.username={substitute} and 
     l.username={lineManager} 
    create (u)-[ur:APPLIED_FOR]->(a:Application), 
     (a)-[sr:SUBSTITUTE]->(s), 
     (a)-[lr:LINE_MANAGER]->(l) 
    set a={application} 
    return a, s, l, u, sr, lr, ur""" 

回答

3

這在技術上是可行的,但解決方案是一個黑客,你是目前最好的,除非這是一個性能瓶頸,做到在兩個查詢的清晰度。我相信稍後會以一種乾淨的方式增加支持,但目前尚未開發。

攻擊是使用FOREACH作爲分支語句,所以foreach項目經理創建一個,如果沒有項目經理作爲參數發送,它將不會創建任何項目管理器。在這種情況下,您需要將null轉換爲空列表,但您可以使用COALESCE:

FOREACH(manager IN COALESCE(managers ,[]) | CREATE (pm:ProjectManager)) 
+0

這看起來很酷,謝謝! 當我所有的關係(替代,projMgr,lineMgr)都是可選的時,我肯定會更喜歡你的解決方案。我最終會得到線性跨度 - 每個null/not null組合的一個查詢 - 以及醜陋的代碼來決定執行哪個查詢。 –