簡體   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