我有一個包含約800k個節點的圖,我想使用Cypher在它們之間創建隨機關係。像下面在Neo4j中創建關係
例子沒有工作,因爲笛卡爾乘積太大:
match (u),(p)
with u,p
create (u)-[:LINKS]->(p);
比如我要爲每個節點(800K)1間的關係,或者爲每個節點(8M)10間的關係。
總之,我需要一個查詢Cypher爲了UNIFORMLY創建節點之間的關係。 有人知道查詢以這種方式創建關係嗎?
我有一個包含約800k個節點的圖,我想使用Cypher在它們之間創建隨機關係。像下面在Neo4j中創建關係
例子沒有工作,因爲笛卡爾乘積太大:
match (u),(p)
with u,p
create (u)-[:LINKS]->(p);
比如我要爲每個節點(800K)1間的關係,或者爲每個節點(8M)10間的關係。
總之,我需要一個查詢Cypher爲了UNIFORMLY創建節點之間的關係。 有人知道查詢以這種方式創建關係嗎?
所以,你想每個節點有完全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)
如果節點是800k,你爲什麼限制u,p爲10000?你爲什麼要用rand()以20%進行抽樣? –
它不起作用,因爲它爲每個節點創建了很多關係。 –
這應該工作(假設你的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)])
。
[寫一個Cypher查詢以創建隨機節點之間的鏈接]可能的重複(http://stackoverflow.com/questions/32621407/write-a-cypher-query-to-create-links-between-random-nodes ) – cybersam
不,建議的解決方案可以回到我在我的問題中寫下的不起作用的例子。 –