2017-03-18 44 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