首页 > 解决方案 > neo4j 试图做 UNION 但我仍然看到超出范围的东西

问题描述

「喂!我有一个观看和喜欢电影的人的数据库。总共有 5 个人的朋友关系是这样的:a>b>c>d>e。我试图将他们观看和喜欢的所有电影从 a 人到 d 人。我让它与这个查询一起工作,但有很多重复:

MATCH(p:Person{name:'Joe'})-[:Friend*1..3]->(f) 
MATCH(m:Movie)<-[:Watched]-(f) 
MATCH(ml:Movie)<-[:Liked]-(f) 
MATCH (mg:Movie)<-[:Watched]-(p) 
MATCH (mgl:Movie)<-[:Liked]-(p) 
RETURN m,ml,mg,mgl

我试图用 UNION 缩小范围,但我仍然看到只有一个人看过并喜欢的电影:

MATCH(p:Person{name:'Joe'})-[:Friend*..3]->(f)
MATCH(m:Movie)<-[:Watched]-(f)
RETURN m
UNION 
MATCH(m:Movie)<-[:Liked]-(f)
RETURN m
UNION
MATCH (m:Movie)<-[:Watched]-(p) 
RETURN m 
UNION 
MATCH (m:Movie)<-[:Liked]-(p) 
RETURN m

我怎样才能删除它们?

标签: databaseneo4jnosqlmatchunion

解决方案


您需要: - 向左和向右扩展匹配模式 - 然后将电影放入列表中 - 展开它 - 并删除重复项

MATCH (mp:Movie)<-[:Watched|Liked]-(p:Person{name:'Joe'})
      -[:Friend*1..3]->
      (f:Person)-[:Watched|Liked]->(mf:Movie)
WITH collect(DISTINCT mp) + collect(DISTINCT mf) AS movies
UNWIND movies AS movie
RETURN DISTINCT movie

推荐阅读