2015-09-23 127 views
0

我有兩個不同的父節點,它們都有特定關係類型(指向各種第三和第四個子節點)的特定關係。只有一個父節點具有不同關係類型的另一個關係(指向各種第五和第六個子節點)。我想編寫一個使用WITH運算符的密碼查詢,以便我可以返回父(對於RELATIONSHIP_ONE)的node.id,以及由RELATIONSHIP_TWO產生的用於子節點的target.id的集合數組。我有Cypher支架查詢返回節點的任何麻煩沒有類型RELATIONSHIP_TWO的關係Cypher CASE WHEN/ELSE與WITH - 返回值

這將返回一個JSON對象作爲數組的第一個索引:

MATCH (n)-[rel_one:RELATIONSHIP_ONE]-() 
WHERE n.id='EXAMPLE_ID_ONE' 
WITH n 
MATCH (n)-[rel_two:RELATIONSHIP_TWO]->(target) 
RETURN n.id     AS id, 
     COLLECT(target.id) AS targetlist;") 

[ 
    { 
    "id": "EXAMPLE_ID_ONE", 
    "targetlist": [ 
     "target_one_id", 
     "target_two_id", 
     "target_three_id", 
     "target_four_id", 
     "target_five_id" 
    ] 
    } 
] 

這將返回一個空數組:

MATCH (n)-[rel_one:RELATIONSHIP_ONE]-() 
WHERE n.id='EXAMPLE_ID_TWO' 
WITH n 
MATCH (n)-[rel_two:RELATIONSHIP_TWO]->(target) 
RETURN n.id AS id, 
     COLLECT(target.id) AS targetlist;") 

[] 

因爲有這EXAMPLE_ID_TWO暗號查詢(其中n和目標是通過關係型RELATIONSHIP_TWO的關係)沒有結果似乎取消此暗號查詢的返回值n.id能力。也許像這樣:

[ 
    { 
    "id": "EXAMPLE_ID_TWO", 
    "targetlist": []   // or even null 
    } 
] 

我在使用CASE做出了嘗試WHEN/ELSE表達式,但它未能返回一個值(即使EXAMPLE_ID_ONE)。下面的例子。如果沒有RELATIONSHIP_TW0加入n和目標節點,我想使用一個空數組作爲目標列表的值。我會非常感謝你的幫助。

MATCH (n)-[rel_one:RELATIONSHIP_ONE]-() 
WHERE n.id='EXAMPLE_ID_ONE' 
WITH n 
MATCH (n)-[rel_two:RELATIONSHIP_TWO]->(target) 
RETURN n.id AS id, 
     CASE WHEN target is NULL THEN [] 
      ELSE COLLECT(target.id) END AS targetlist; 

MATCH (n)-[rel_one:RELATIONSHIP_ONE]-() 
WHERE n.id='EXAMPLE_ID_TWO' 
WITH n 
MATCH (n)-[rel_two:RELATIONSHIP_TWO]->(target) 
RETURN n.id AS id, 
     CASE WHEN target is NULL THEN []; 
      ELSE COLLECT(target.id) END AS targetlist; 
+0

什麼是年底的暗號部分你的問題?一個辦法?或者你嘗試過的東西? – Supamiu

+0

它只是我嘗試但沒有工作 –

回答

1

讓你的第二場比賽的一個可選的比賽,這是表現得像一個外部聯接,即還產生至少一個結果,如果沒有匹配

MATCH (n:Label) 
WHERE n.id='EXAMPLE_ID_TWO' and exists((n)-[:RELATIONSHIP_ONE]-()) 
OPTIONAL MATCH (n)-[:RELATIONSHIP_TWO]->(target) 
RETURN n.id AS id, 
     filter(x in COLLECT(target.id) where not x is null) AS targetlist