微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Neo4j:匹配随机节点时,with 子句中 rand() 和 rand() 之间的区别

如何解决Neo4j:匹配随机节点时,with 子句中 rand() 和 rand() 之间的区别

我发现 here 可以使用下一个查询从 neo4j 中选择随机节点:

  1. MATCH (a:Person) RETURN a ORDER BY rand() limit 10
  2. 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 举报,一经查实,本站将立刻删除。