GraphGists

在 Neo4j Google Group 上有一个关于在 Cypher 中随机排序结果的问题。

第一次尝试

最简单的方法是直接使用 `ORDER BY 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
© . All rights reserved.