我有一个节点(:Person)可以有以下关系。
我正在尝试编写一个返回所有
事件的密码查询(me:Person)-[:ATTEND]->(gig:Event)
(me:Person)-[:LIKE]->(a:Artist)-[:PERFORMS]->(gig:Event)
(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条款返回结果,但这不会发生。
我在这里缺少什么?
- 谢谢, 一个密码塞
答案 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