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

Sus*_*han 4 neo4j cypher

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

  1. [:LIKE] 在 (:Event) 中 [:表演] 的 (:艺术家)
  2. [:LIKE] 一个 (:Host) [:HOSTING] 一个 (:Event)
  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: 'abc@xyz.com'})-[attend:ATTEND]->(gig), (me)-[:LIKE]->(n)-[:PERFORM|HOSTING]-(gig2) return gig,gig2,但是如果匹配子句的第一部分(与 :ATTEND 关系匹配)具有非 null 结果,则这只返回所需的结果。例如,如果用户没有参加任何活动,但有他/她喜欢的艺术家和主持人,那么我会假设查询仍然根据第二个 MATCH 子句返回结果,但这并没有发生。

我在这里缺少什么?

- 谢谢,密码核

Tom*_*nič 5

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

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