2017-07-07 49 views
2

我有一個擁有3.4百萬個節點的數據庫,並且希望選擇一個隨機節點。Cypher:Neo4j中的隨機節點匹配

我嘗試使用類似

MATCH (n) 
WHERE rand() <= 0.01 
RETURN n 
LIMIT 1 

,但它似乎像算法總是以相同的節點開始,並選擇第一個它的隨機數低於0.01,這意味着在大多數情況下,「隨機」節點是前100個被檢查節點之一。

是否有更好的查詢,選擇一個完全隨機的我的所有節點?

回答

0

您可以從rand()函數生成隨機ID並將其乘以節點數。這通常應該返回一個更隨機的節點。

MATCH (n) 
WHERE id(n) = toInteger(rand() * 3400000) 

一旦有你的節點中創建了一些空間(即他們不再因刪除完全連續的),你可能會錯過一些在這裏和那裏。在這種情況下,你總是可以在任何一邊範圍內隨機數+/-幾個並返回結果的第一行。

WITH toInteger(rand() * 3400000) AS rand_node, 5 AS offset 
WITH range(rand_node - offset, rand_node + offset) AS rand_range 
MATCH (n) 
WHERE id(n) IN rand_range 
RETURN n 
LIMIT 1