如何使用Cypher收集有限数量的节点?

时间:2016-03-05 21:34:33

标签: neo4j cypher

如果我想对前一个MATCH的前25个结果执行MATCH查询,我将如何在Cypher中执行此操作?

我的第一个查询是:

START inputMovie=node(0)
MATCH (inputGenre:Genre)-[:IS_GENRE]-(inputMovie:Movie)
WITH inputMovie, COLLECT(inputGenre) AS inputGenres
MATCH (genre:Genre)-[o:IS_GENRE]-(outMovies:Movie)
WITH inputGenres, outMovies, genre
WHERE (genre IN inputGenres)
RETURN outMovies.title, count(genre) AS foo
ORDER BY foo desc
LIMIT 25

我如何才能那25个结果执行MATCH查询?我可以收集多个节点吗? COLLECT(m)将收集与WHERE约束匹配的每个节点。有没有办法从MATCH查询收集前25名?

1 个答案:

答案 0 :(得分:0)

[EDITED]

首先,您可以改进当前的查询。以下更短更快的查询应该是等效的(并且避免使用不推荐使用的START子句):

MATCH (outMovie:Movie)-[:IS_GENRE]-(:Genre)-[:IS_GENRE]-(inputMovie:Movie)
WHERE ID(inputMovie) = 0
MATCH (outMovie)-[:IS_GENRE]-(genre:Genre)
RETURN outMovie.title, count(genre) AS foo
ORDER BY foo DESC 
LIMIT 25

通常,如果要扩展现有查询,可以将RETURN替换为WITH。您只需为尚未具有标识符的返回值提供别名(在您的情况下,outMovies.title需要别名)。

以下是您的查询的简单示例:

MATCH (outMovie:Movie)-[:IS_GENRE]-(:Genre)-[:IS_GENRE]-(inputMovie:Movie)
WHERE ID(inputMovie) = 0
MATCH (outMovie)-[:IS_GENRE]-(genre:Genre)
WITH outMovies.title AS title, count(genre) AS foo
ORDER BY foo DESC 
LIMIT 25
RETURN COUNT(title) AS num_titles;

返回的num_titles最多为25个。