匹配Cypher中的多个关系?

时间:2015-10-29 22:49:02

标签: neo4j cypher

我正在尝试形成一个与多个关系匹配的查询。以下是我的疑问:基础知识:

START inputMovie=node(1)
MATCH inputMovie<-[r:RATED]-User-[o:RATED]->(movies)<-[:IS_GENRE]->genres
RETURN movies.title LIMIT 5

我希望它返回一个被评为同一个人并且属于同一类型的电影列表。我做错了什么?

谢谢

1 个答案:

答案 0 :(得分:3)

您有一个拼写错误,因为Cypher不允许双向关系:<-[:IS_GENRE]->

猜测您的数据模型,这可能对您有用:

START inputMovie=node(1)
MATCH inputMovie<-[r:RATED]-User-[o:RATED]->(movies)-[:IS_GENRE]->genres
RETURN movies.title LIMIT 5;

注意:上述查询可以返回重复的结果,因为多个用户可以观看相同的电影。如果这是一个问题,您可以使用DISTINCT限定符来防止这种情况。例如:

START inputMovie=node(1)
MATCH inputMovie<-[r:RATED]-User-[o:RATED]->(movies)-[:IS_GENRE]->genres
RETURN DISTINCT movies.title LIMIT 5;

[EDITED]

如果您只想返回({至少)所有与inputMovie相同类型的电影,您可以执行以下操作。

START inputMovie=node(1)
MATCH (inputGenre)<-[:IS_GENRE]-(inputMovie)
WITH inputMovie, COLLECT(inputGenre) AS inputGenres
MATCH (inputMovie)<-[r:RATED]-(User)-[o:RATED]->(movie)-[:IS_GENRE]->(genre)
WITH inputGenres, movie, COLLECT(genre) AS genres
WHERE ALL(x IN inputGenres WHERE x IN genres)
RETURN movie.title LIMIT 5;

注意:

  • 为清晰起见,我已重命名了几个标识符(例如moviesgenres)。
  • 不再需要DISTINCT限定符,因为movie节点上的聚合(在第二个WITH子句中)隐式地使每个movie实例唯一。