2017-03-18 46 views
1

我有一個節點(:人),可以有以下關係。如何組合兩個不同MATCH子句的結果並返回組合結果?

  1. [:LIKE]一(:藝術家)誰[:執行]在(:事件)
  2. [:LIKE A(:主機)是誰[:HOSTING]一(:事件)
  3. [:出席]一(:事件)

我試圖寫一個返回所有,要麼

  1. 正在被用戶參加了活動一個暗號查詢 (me:Person)-[:ATTEND]->(gig:Event)
  2. 有用戶喜歡錶演藝術家 (me:Person)-[:LIKE]->(a:Artist)-[:PERFORMS]->(gig:Event)
  3. 正在被主機託管用戶喜歡 (me:Person)-[:LIKE]->(h:Host)-[:HOSTING]->(gig:Event)

我使用像match (me {emailId: '[email protected]'})-[attend:ATTEND]->(gig), (me)-[:LIKE]->(n)-[:PERFORM|HOSTING]-(gig2) return gig,gig2查詢嘗試,但這隻返回如果所期望的結果匹配條款的第一部分匹配:ATTEND關係,有非空結果。例如,如果用戶沒有參加任何事件,但擁有他/她喜歡的藝術家和主持人,那麼我會假定查詢仍然返回基於第二個MATCH子句的結果,但這不會發生。

我在這裏錯過了什麼?

- 謝謝, 一個暗號NUBE

回答

2

UNION可能會在這裏你最好的選擇,特別是因爲你想要的東西是:事件節點,沒有進一步的處理。

MATCH (me:Person {emailId: '[email protected]'})-[:ATTEND]->(gig:Event) 
RETURN gig 
UNION 
MATCH (me:Person {emailId: '[email protected]'})-[:LIKE]->(a:Artist)-[:PERFORMS]->(gig:Event) 
RETURN gig 
UNION 
MATCH (me:Person {emailId: '[email protected]'})-[:LIKE]->(h:Host)-[:HOSTING]->(gig:Event) 
RETURN gig 
+0

This Works!謝謝 :) –

3

如果MATCH不返回任何內容,則查詢將停止,這就是爲什麼你有問題。解決方案是OPTIONAL MATCH,以便在返回空時不停止。你可以嘗試改變你的查詢,所以無論用戶是否參加了演出,如果他喜歡在演出中表演的藝術家,你會得到結果。

optional match (me {emailId: '[email protected]'})-[attend:ATTEND]->(gig), 
(me)-[:LIKE]->(n)-[:PERFORMS|HOSTING]-(gig2) return gig,gig2 
4

查詢來自TomažBratanič的工作。但有一個可變的路徑長度更緊湊的替代方案:

match (me:Person {emailId: '[email protected]'}) 
     -[:LIKE|ATTEND|PERFORMS|HOSTING*1..2]-> 
     (e:Event) 
return e 
+0

我覺得這個可能會在意外事件上發生匹配:事件。例如,如果您:如果有人蔘加了:參加活動,您也會收到該活動。 – InverseFalcon