随机思考
在 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
这个页面有帮助吗?