如何解决Neo4j:匹配随机节点时,with 子句中 rand() 和 rand() 之间的区别
我发现 here 可以使用下一个查询从 neo4j 中选择随机节点:
MATCH (a:Person) RETURN a ORDER BY rand() limit 10
MATCH (a:Person) with a,rand() as rnd RETURN a ORDER BY rnd limit 10
两个查询似乎都在做同样的事情,但是当我尝试匹配与给定节点相关的随机节点时,我得到了不同的结果:
MATCH (p:Person{user_id: '1'})-[r:REVIEW]->(m:Movie)
return m order by rand() limit 10
...但是当我在 with 子句中使用 rand() 时,我确实得到了随机节点:
MATCH (p:Person{user_id: '1'})-[r:REVIEW]->(m:Movie)
with m,rand() as rnd
return m order by rnd limit 10
知道为什么 rand() 在第二个查询的 with 子句中表现不同而在第一个查询中没有吗?
解决方法
了解像这样在 ORDER BY 中使用 rand() 并没有做您认为它在做的事情很重要。它不是每行选择一个随机数,而是按单个数字排序。
它类似于以下查询:
MATCH (p:Person)
RETURN p
ORDER BY 5
随意切换号码。在任何情况下,它都不会改变顺序,因为对每一行进行排序,当使用相同的数字时,不会改变顺序。
但是当您在每行的 WITH 子句中投影出一个随机数时,您不再按所有行的单个数字排序,而是按每行不同的变量排序。
,你的假设不正确。在 Neoj Desktop 中运行时,我总是通过使用以下查询获得随机顺序。
MATCH (p:Person{name: 'Jessica Thompson'})-[r:REVIEWED]->(m:Movie)
return m order by rand() limit 10
如果您的数据中只有 5 条记录,那么添加限制 10 将始终返回 5 条记录。将限制设置为 2,然后您会看到它是“随机的”
MATCH (p:Person{name: 'Jessica Thompson'})-[r:REVIEWED]->(m:Movie)
return m order by rand() limit 2
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。