2016-08-23 60 views
0

我在Cypher和Neo4j中採取了一些步驟,並理解cypher如何處理「變量」。變量在密碼匹配查詢中的作用

具體來說,我有一個查詢

match (A {name: "A"}) 
match (A)<-[:st*]-(C)-[:hp]->(c) 
match (A)<-[:st*]-(B)-[:hp]->(b) 
match (c)-[:st]->(b) 
return b 

這不會是我想要的工作。現在,在代碼中,我使用了兩次匹配子句(第2行和第3行),以便變量(c)和(d)在第4行的最終匹配之前基本包含相同的節點。 我可以編寫查詢而不必重複第二個匹配條款?使用

match (A {name: "A"}) 
match (A)<-[:st*]-(B)-[:hp]->(b) 
match (b)-[:st]->(b) 
return b 

似乎是非常不同的東西,沒有返回因爲沒有:從(B)到自身節點ST類型的關係。我的理解到目前爲止,即使(b)和(c)中包含相同的節點,

match (c)-[:st]->(b) 

試圖找到的(c)任何節點和(b)任何節點之間的匹配,而

match (b)-[:st]->(b) 

試圖從(b)的特定節點查找匹配到自己?還是說,人們必須將3個匹配條款視爲一個整體模式?

thanx的任何洞察到內部工作...

回答

0

當你寫了2點MATCH聲明

match (A)<-[:st*]-(C)-[:hp]->(c) 
match (A)<-[:st*]-(B)-[:hp]->(b) 

他們不依賴於彼此的結果(僅適用於以前的結果MATCH找到A)。 Cypher引擎可以獨立執行它們,然後返回一個笛卡爾積的結果,或者它可以執行第一個MATCH,對於每個結果,然後執行第二個MATCH,產生一系列使用當前結果的第一個MATCH並且每個結果的第二個MATCH(實際實現是一個細節)。實際上,它也可以檢測到相同的模式匹配兩次,只執行一次,並從結果中生成所有可能的配對。

總之,bc從結果的同一集合拍攝,但獨立,所以你會得到對,其中bc是同一個節點,也是所有其他對他們都沒有。

如果你做一個單一的MATCH,你顯然有一個單一的節點。

假設一個MATCH返回2個節點12,用2箇中間MATCH最終MATCH將看到所有4雙:

 
    1  2 
1 (1, 1) (1, 2) 
2 (2, 1) (2, 2) 

而具有單箇中間MATCH和最終MATCH使用b兩次,它將只會看到:

 
    1  2 
1 (1, 1) 
2   (2, 2) 

哪些不是有趣的對,如果你沒有有自我關係。

請注意,這是在SQL數據庫相同的,如果你沒有一個SELECT 2表聯接:你也可以得到的結果無關笛卡爾積。