採用以下模式,該模式以標有「對話」的節點開始,並且具有[:RESPONSE]關係的一條長鏈。在多重關係中的Cypher中過濾
該模式中有許多節點,但我們只關心其中的2個:(答案)和(元素)。 而且有我們關心的只有一個關係:[:RESPONSE]
(Conversation) <-[:RESPONSE]-(unimportant_node)<-[:RESPONSE]
..()..()..()..(Answer)<-()..()..(Element)..().().()..()..()..
(Answer)…()..(Element)<—()..()..(Answer)-..()-..(Element)<-..().()
我要的是找出所有的(答案),每個都有其相關的(元)。
可變部分:節點(對話)和(應答),並且還之間(應答)和(元件)之間的數量是可變的。
不變部分:在每個(Answer)之後都有一個(Element)節點,它基本上與那個(Answer)相關聯。然後,在某個時候,還有另一個(答案),它也有一個關聯的(元素)。
我在做什麼: 因爲我想檢索所有的(答案),我用(C:會話)< - [:RESPONSE *] - (A:答案)。然後,因爲我不知道有多少個節點在(Answer)和它的關聯(Element)之間,所以我再次使用[:RESPONSE *]。
所以,我的查詢看起來是這樣的:
match (c:Conversation) <- [:RESPONSE*] - (a:Answer) <-[:RESPONSE*]-(e:Element)
這種把所有的(元素)以下每一個(答案),這是不好的,因爲我只在FIRST(元)以下感興趣每個(答案)。
我還是設法找到這個解決方案:
match (c:Conversation) <- [:RESPONSE*] - (a:Answer) <- [:RESPONSE*] - (e:Element)
with c,a,head(collect(e)) as first_e //could also use: collect(e)[0] as first_e
...code continues...
不過,我在尋找每個(答)後的替代解決辦法,只是簡單地找到第一個(元素),然後停止,從而使Cypher的工作少得多。
玩這個,我已經注意到,如果我想要,只帶第一個(答案)是很容易的。 (但在我的情況下,我想要所有人,所以我沒有這樣做)。
match (c:Conversation) <- [:RESPONSE*] - (a:Answer) <- [:RESPONSE*]-(e:Element)
where not( (:Answer)<- [:RESPONSE]-(a) )
我想通必須有應用該技術的每個(答)後,只帶了第一個(元素)一個簡單的方法,所以我嘗試:
match (c:Conversation) <- [:RESPONSE*]-(a:Answer)
with c,a
match (a) <-[:RESPONSE*]-(e:Element)
where not((:Answer)<- [:RESPONSE]-(a))
不幸的是,這邏輯不適用於for_each(Answer)作用域,而是應用於整個查詢。因此,這隻會帶來1列結果:
conversation | the_very_last_Answer | the_very_last_element
我也試圖把這場比賽在foreach,但我得到一個SyntaxError。
相關,布魯諾的答案是一個辦法由Neo4j的知識庫文章上[每行限制結果]提到(https://neo4j.com/developer/kb/limiting-match-results-per-row/),和應該很好。文章中提到了其他方法,在其他情況下可能有用。 – InverseFalcon
謝謝布魯諾和InverseFalcon。我需要關注APOC,因爲我沒有意識到!感謝您的建議。 – jb007