GraphGists

Neo4j Google Group上有一个关于如何在Cypher中以随机顺序返回结果的问题。

第一次尝试

最简单的办法就是按rand()排序

MATCH (n:Crew)
RETURN n
ORDER BY rand()

这会失败,并提示

ORDER BY expressions must be deterministic. For instance, you cannot use the rand() function in the expression

这是可以解释的,你如何按每次调用都生成新值的某个东西排序。

有效的查询

所以我们必须将随机值与每一行关联。幸运的是,使用WITH很容易做到这一点

MATCH (n:Crew)
WITH n, rand() AS r
ORDER BY r
RETURN n

所以WITH n, rand() as r为每一行添加了一个名为r的新列(我们需要别名),然后我们可以按该列排序作为with的一部分(我们甚至可以分页),但在RETURN子句中我们只返回n而不公开r。

如果您希望按以后不想公开的内容进行排序,此方法也很方便。

有用的概念

例如,按人员姓名排序,但按该顺序返回朋友

MATCH (n:Crew)-[:KNOWS]->(o)
WITH n.name as name, o
ORDER BY name DESC
RETURN o