繁体   English   中英

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

[英]Neo4j: Difference between rand() and rand() in with clause when matching random nodes

我在这里发现我可以使用下一个查询从 neo4j 随机节点 select :

  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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM