2016-03-02 227 views
0

我有一個包含約800k個節點的圖,我想使用Cypher在它們之間創建隨機關係。像下面在Neo4j中創建關係

例子沒有工作,因爲笛卡爾乘積太大:

match (u),(p) 
with u,p 
create (u)-[:LINKS]->(p); 

比如我要爲每個節點(800K)1間的關係,或者爲每個節點(8M)10間的關係。

總之,我需要一個查詢Cypher爲了UNIFORMLY創建節點之間的關係。 有人知道查詢以這種方式創建關係嗎?

+1

[寫一個Cypher查詢以創建隨機節點之間的鏈接]可能的重複(http://stackoverflow.com/questions/32621407/write-a-cypher-query-to-create-links-between-random-nodes ) – cybersam

+0

不,建議的解決方案可以回到我在我的問題中寫下的不起作用的例子。 –

回答

0

所以,你想每個節點有完全x關係?分批試試這個,直到沒有更多的關係被更新:

MATCH (u),(p) WHERE size((u)-[:LINKS]->(p)) < {x} 
WITH u,p LIMIT 10000 WHERE rand() < 0.2 // LIMIT to 10000 then sample 
CREATE (u)-[:LINKS]->(p) 
+0

如果節點是800k,你爲什麼限制u,p爲10000?你爲什麼要用rand()以20%進行抽樣? –

+0

它不起作用,因爲它爲每個節點創建了很多關係。 –

0

這應該工作(假設你的Neo4j服務器有足夠的內存):

MATCH (n) 
WITH COLLECT(n) AS ns, COUNT(n) AS len 
FOREACH (i IN RANGE(1, {numLinks}) | 
    FOREACH (x IN ns | 
    FOREACH(y IN [ns[TOINT(RAND()*len)]] | 
     CREATE (x)-[:LINK]->(y)))); 

此查詢收集的所有節點,並使用嵌套循環做以下{numLinks}次:在每個節點和隨機選擇的節點之間創建一個LINK關係。

最內層的FOREACH用作當前Cypher限制的一種解決方法,您無法在節點模式中放置返回節點的操作。具體而言,這是非法的:CREATE (x)-[:LINK]->(ns[TOINT(RAND()*len)])