2016-12-14 79 views
0

我的Cypher支架的查詢看起來像這樣:具有可變長度路徑的Cypher查詢

match (n1:N1)-[r1:R1]->()<-[r2:R2*0..]-(n3)<-[r3:R3]-(n4) return * 

因爲在可變長度關係(<-[r2:R2*0..]-)的0,I期待此查詢是相同的爲以下的(n2添加):

match (n1:N1)-[r1:R1]->(n2)<-[r2:R2*0..]-(n3)<-[r3:R3]-(n4) return * 

但他們返回完全不同的結果。 有人可以幫我理解爲什麼會出現這種情況嗎? 僅僅是0是不允許的? 謝謝。

回答

0

你的第二個查詢有一個變量不存在於第一個查詢中,所以當然你的結果會不同,會有一個額外的列。

如果我們取第一個查詢的相關片段:

(n1:N1)-[r1:R1]->()<-[r2:R2*0..]-(n3) 

這意味着,從該圖案中的未結合的節點「()」中,我們將遍歷類型的0或多個關係:R2和生成的節點將被綁定到n3變量。因此,未綁定的節點將始終存在於n3列中,無論是否存在任何:R2關係存在以遍歷。

您的第二個查詢會產生非常相似的結果,每個列應該匹配相同的數據,但有一個額外的列n2,它總是匹配先前未綁定的節點。該節點仍然會出現在n3列中。

如果這不能解決問題,您可能希望更好地解釋結果中的內容對您沒有意義,以及您認爲0在您的查詢中做了什麼(0肯定是允許的可變長度關係)。

+0

我正在將結果看作圖形(瀏覽器中的交互式可視化),而不是表格。在那種情況下,我希望結果是一樣的。 – Dennis

+0

沒有。 「R2 * 0 ...」表示零長度關係,即無關係。 –

+0

@ChristophMöbius你在這裏弄錯了,「..」表示這是一種變長的關係。 0是下限,因爲我們省略了上限,所以它默認爲無限。文檔中的[零長度路徑]部分(https://neo4j.com/docs/developer-manual/current/cypher/clauses/match/#_zero_length_paths)解釋了此模式將與始發節點本身相匹配,或任何數量的給定類型的關係(零關係以上)以匹配路徑的下一部分。 – InverseFalcon

相關問題