2017-06-21 18 views
1

採用以下模式,該模式以標有「對話」的節點開始,並且具有[: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。

回答

1

您可以安裝APOC procedures和使用apoc.cypher.run程序做到這一點。事情是這樣的:

MATCH (c:Conversation)<-[:RESPONSE*]-(a:Answer) 
CALL apoc.cypher.run(' 
    WITH {a} AS a 
    MATCH (a)-[:RESPONSE*]->(e:Element) 
    RETURN e LIMIT 1', 
    {a:a}) YIELD value 
RETURN c, value.e 

隨着apoc.cypher.run你可以每行與LIMIT執行子查詢(1,在這種情況下)。

+1

相關,布魯諾的答案是一個辦法由Neo4j的知識庫文章上[每行限制結果]提到(https://neo4j.com/developer/kb/limiting-match-results-per-row/),和應該很好。文章中提到了其他方法,在其他情況下可能有用。 – InverseFalcon

+0

謝謝布魯諾和InverseFalcon。我需要關注APOC,因爲我沒有意識到!感謝您的建議。 – jb007