Neo4j:匹配随机节点时with子句中rand()和rand()的区别
Neo4j: Difference between rand() and rand() in with clause when matching random nodes
我发现 here 我可以 select 使用下一个查询来自 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
这两个查询似乎做同样的事情,但是当我尝试匹配与给定节点相关的随机节点时,我得到了不同的结果:
下一个查询将 return 始终是相同的节点(节点不是随机 selected)
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 子句中投射出一个随机数时,您就不再按所有行的单个数字排序,而是按每行不同的变量排序。
我发现 here 我可以 select 使用下一个查询来自 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
这两个查询似乎做同样的事情,但是当我尝试匹配与给定节点相关的随机节点时,我得到了不同的结果:
下一个查询将 return 始终是相同的节点(节点不是随机 selected)
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 子句中投射出一个随机数时,您就不再按所有行的单个数字排序,而是按每行不同的变量排序。