如何组合两个不同MATCH子句的结果并返回合并结果?

时间:2017-03-18 15:59:52

标签: neo4j cypher

我有一个节点(:Person)可以有以下关系。

  1. [:LIKE]一位(:艺术家)[:PERFORMS]在(:事件)
  2. [:LIKE] a(:主持人)谁是[:HOSTING]和(:事件)
  3. [:ATTENDS] an(:Event)
  4. 我正在尝试编写一个返回所有

    事件的密码查询
    1. 正由用户参加 (me:Person)-[:ATTEND]->(gig:Event)
    2. 有一位用户喜欢表演的艺术家 (me:Person)-[:LIKE]->(a:Artist)-[:PERFORMS]->(gig:Event)
    3. 由用户喜欢的主机托管 (me:Person)-[:LIKE]->(h:Host)-[:HOSTING]->(gig:Event)
    4. 我尝试使用像match (me {emailId: 'abc@xyz.com'})-[attend:ATTEND]->(gig), (me)-[:LIKE]->(n)-[:PERFORM|HOSTING]-(gig2) return gig,gig2之类的查询,但是如果匹配子句的第一部分匹配:ATTEND关系,具有非空结果,则只会返回所需的结果。例如,如果用户没有参加任何活动,但是艺术家和主持人喜欢他们,那么我假设查询仍然根据第二个MATCH条款返回结果,但这不会发生。

      我在这里缺少什么?

      - 谢谢, 一个密码塞

3 个答案:

答案 0 :(得分:4)

来自TomažBratanič的查询工作。但是有一个更紧凑的替代方案,路径长度可变:

match (me:Person {emailId: 'abc@xyz.com'})
      -[:LIKE|ATTEND|PERFORMS|HOSTING*1..2]->
      (e:Event)
return e

答案 1 :(得分:3)

如果MATCH没有返回任何内容,则查询会停止,这就是您遇到问题的原因。解决方案是OPTIONAL MATCH,因此如果返回为空,它不会停止。您可以尝试将查询更改为此,因此,无论用户是否参加过演出,如果他喜欢在演出中表演的艺术家,您将获得结果。

optional match (me {emailId: 'abc@xyz.com'})-[attend:ATTEND]->(gig), 
(me)-[:LIKE]->(n)-[:PERFORMS|HOSTING]-(gig2) return gig,gig2

答案 2 :(得分:2)

UNION可能是你最好的选择,特别是因为你唯一想要的是:事件节点,没有进一步的处理。

MATCH (me:Person {emailId: 'abc@xyz.com'})-[:ATTEND]->(gig:Event)
RETURN gig
UNION
MATCH (me:Person {emailId: 'abc@xyz.com'})-[:LIKE]->(a:Artist)-[:PERFORMS]->(gig:Event)
RETURN gig
UNION
MATCH (me:Person {emailId: 'abc@xyz.com'})-[:LIKE]->(h:Host)-[:HOSTING]->(gig:Event)
RETURN gig