我正在尝试形成一个与多个关系匹配的查询。以下是我的疑问:基础知识:
START inputMovie=node(1)
MATCH inputMovie<-[r:RATED]-User-[o:RATED]->(movies)<-[:IS_GENRE]->genres
RETURN movies.title LIMIT 5
我希望它返回一个被评为同一个人并且属于同一类型的电影列表。我做错了什么?
谢谢
答案 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;
注意:
movies
和genres
)。DISTINCT
限定符,因为movie
节点上的聚合(在第二个WITH
子句中)隐式地使每个movie
实例唯一。