2016-10-22 44 views
0

我有一組標籤類型的節點。其中一些與其他類型節點有關係,其中一些沒有。我想遍歷所有類型的節點,並做一些動作基礎上的關係(無論是空或有一個現有的關係)試圖做一個嵌套的FOREACH列表中的匹配

在僞代碼,這就是我想做的事:

For each type1 in allTypes 
    For each type2 in allTypes 
     Match relationship between type1 and type2 
     If relationship between type1 and type2 exists 
      do something 
     else 
      do other thing 

但我不知道如何在Cypher中做到這一點。我知道你不能做暗號foreach語句裏面的匹配,所以我用UNWIND嘗試這樣的:

MATCH (Types:Type) 
WITH COLLECT(Types) AS types 
UNWIND types as type1 
UNWIND types as type2 
MATCH (type1)-[r]->(type2) 
RETURN type1.name,type(r), type2.name 

也能正常工作爲已經存在的所有關係,但是當有type1和type2之間沒有關係,我在返回結果中沒有得到任何東西。

+0

你想,如果關係不存在做的? –

+1

你打算在每種情況下做什麼替代「事情」?他們是否在變異(即他們是否改變了圖表),還是需要進行額外的查詢,或者只是從路徑返回屬性? –

+0

我認爲你可能想放棄循環的想法,這是更強制性的方法,即使你設法做到這一點,效率也會很低。你的僞代碼使用雙重for循環,這將轉化爲ñ2複雜的笛卡爾產品。通過在所有類型上匹配一次:類型,找出與其他類型存在什麼關係:類型(或者如果沒有這種關係存在),你應該有一個O(n)操作。 – InverseFalcon

回答

2

如何使用OPTIONAL MATCH

一些示例數據:

CREATE 
    (t1:Type {name:"t1"}), 
    (t2:Type {name:"t2"}), 
    (t3:Type {name:"t3"}), 
    (t1)-[:REL]->(t2) 

查詢:

MATCH (t1:Type) 
OPTIONAL MATCH (t1)-[r]->(t2:Type) 
RETURN 
    t1, t2, 
    CASE r 
    WHEN NULL THEN "other thing" 
    ELSE "something" 
    END AS info 

結果:

╒══════════╤══════════╤═══════════╕ 
│t1  │t2  │info  │ 
╞══════════╪══════════╪═══════════╡ 
│{name: t1}│{name: t2}│something │ 
├──────────┼──────────┼───────────┤ 
│{name: t2}│(null) │other thing│ 
├──────────┼──────────┼───────────┤ 
│{name: t3}│(null) │other thing│ 
└──────────┴──────────┴───────────┘ 
+0

這看起來非常接近,但我們正在尋找其他類型的關係:類型節點,所以不是'(t2)',我認爲這應該是'(t2:Type)'。 – InverseFalcon

相關問題