2013-02-02 39 views
3

我創建中,我們匹配ordersstaff系統節點。從概念上講,order是要求人做某些工作,而staff是能夠完成這項工作的人。一個order可以有一個或多個requirements(即對誰可以做的工作限制),以及staff可以有一個更詳細requirements(即資格做的工作)。找到具有所有常見的中介

我試圖創建一個暗號查詢,這將使我有所有staff由給定order列出的requirement S的所有。換言之,我試圖找到與每個節點相關的每個requirement節點相關的所有staff節點。 我的問題是:我如何創建一個密碼查詢來建模業務邏輯?

作爲一個例子,考慮下面的示例數據:

看那訂單ID:1個節點。它有一個requires關係到兩個節點,標記RNER IV。換句話說,訂單#1要求任何申請人具有RN資格和ER IV資格。恰巧,工作人員埃文STAFFID是:1)同時具有這些資格,所以他應該能夠接受那份工作。工作人員蒂姆有這些要求之一,但不是兩個,所以他不應該能夠申請這項工作。此外,orderId:2只有一個要求,埃文和蒂姆都有,所以他們都應該能夠申請這項工作。

所以在本質上,如果我要開始爲了#1我想回去只埃文。如果我要開始訂購#2,我會想要找回埃文和蒂姆*。

以下查詢是在那裏的一半。它將一次給予我從給定訂單到工作人員所有要求的所有獨特路徑。但是,它不檢查每一個需求路徑的情況下(這意味着目前它只會訂單,只有有一個要求工作):

start o=node(2) 
match o-[:requires]->req<-[:hasRequirement]-s 
return o, req, s; 

所以我有哪些選擇?我可以以某種方式檢查是否存在未知數量的匹配關係?或者我需要以不同的方式爲我的數據建模?

* 編輯:我設置我的樣本數據時犯了一個錯誤。 應已隨RN關聯,以便他可以勝任訂單#2。

回答

6

我想這暗號聲明解決您的問題:

start o=node(2) 
match o-[:requires]->req<-[:hasRequirement]-p 
with o, p, count(req) as c 
where length(o-[:requires]-()) = c 
return p, c 
3

我想出了

start o=node(2) 
match o-[orderReqRel:requires]->r 
with count(orderReqRel) as orderReqs, o 
match p-[personReqRel:hasRequirement]->r<-[:requires]-o 
with count(personReqRel) as personReqs,p,orderReqs 
where personReqs=orderReqs 
return p; 

似乎對訂單1,其中我只拿回埃文工作。 訂購2似乎並沒有有添了一個要求(你的解釋表明,但由於某些原因,沒有看到它在你共享的控制檯)

+0

好,我在設置樣本數據時犯了一個錯誤。無論如何,你的答案完美無缺,斯蒂芬也是如此 - 我希望我能接受你的答案。我會選擇斯蒂芬的答案,僅僅是因爲它更簡潔一些,但也要感謝你的回答。 – ean5533

+1

Stefan's好多了:-) – Luanne