2014-02-18 28 views
0

我對Neo4j的Cypher支架2.0以下查詢:背後的Neo4j的Cypher查詢神奇的結果

MATCH (u:User{uid:'1111111'}), (c1:Concept), (c2:Concept), 
c1-[:BY]->u, c2-[:BY]->u, c1-[rel:TO]->c2 
WITH c1,c2,rel 
MATCH c1-[:AT]->ctx, c2-[:AT]-ctx 
WHERE ctx.uid = rel.context 
RETURN c1.uid AS source_id, c1.name AS source_name, 
c2.uid AS target_id, c2.name AS target_name, 
rel.uid AS edge_id, 
rel.context AS context_id, ctx.name AS context_name; 

它所做的是,它看起來對連接到UserConcept標籤(c1c2)的所有節點節點u,發現他們(c1c2)連接到彼此(rel),那麼它試圖找到其不同的上下文(ctx)的概念節點(c1c2)中出現,但只有那些,其uid比賽關係relrel.context)的.context財產uid,然後返回他們在一個表,其中我們有源idname,目標idname,連接id,以及這種關係的.contextid財產以及與該id的上下文的名稱。

所以一切正常,但問題是:爲什麼?

我的意思是Cypher如何巧妙地匹配ctx.uid右邊的rel.context以知道它應該完全插入結果表的正確位置?

有人能解釋我背後的魔力嗎?

還是我完全錯了,只是越來越雜亂的結果?

謝謝!

回答

1

它創建一個表示您的組合匹配模式的模式圖。然後它使用索引來查找綁定節點,它開始將模式圖應用於並找到每個找到的匹配結果行。

應用模式圖時,它使用WHERE條件儘可能早地過濾掉你不想要的路徑。

如果找不到綁定節點,它必須遍歷標籤的所有節點(如:Concept)或圖的所有節點(如果您沒有指定任何標籤或查找條件)。

1

您可以將PROFILE添加到您的密碼查詢的開頭,以查看它正在執行的操作的更多詳細信息。