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



我有一个节点(:P erson(,它可以有以下关系。

  1. [:LIKE] 在 (:Event( 中 [:P ERFORMS] 的 (:LIKE(
  2. [:LIKE] 一个 (:
  3. Host( 谁是 [:HOSTING] 一个 (:事件(
  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)

我尝试使用像 match (me {emailId: 'abc@xyz.com'})-[attend:ATTEND]->(gig), (me)-[:LIKE]->(n)-[:PERFORM|HOSTING]-(gig2) return gig,gig2 这样的查询,但这仅在匹配子句的第一部分(与 :ATTEND 关系匹配(具有非空结果时才返回所需的结果。例如,如果用户没有参加任何活动,但有他/她喜欢的艺术家和主持人,那么我会假设查询仍然基于第二个 MATCH 子句返回结果,但这并没有发生。

我在这里错过了什么?

-谢谢一个密码裸体

如果

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

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

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

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

UNION 可能是您最好的选择,特别是因为您唯一想要的是 :Event 节点,无需进一步处理。

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