在Neo4j中创建关系

问题描述:

我有一个包含约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

不,建议的解决方案可以回到我在我的问题中写下的不起作用的例子。 –

所以,你想每个节点有完全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

它不起作用,因为它为每个节点创建了很多关系。 –

这应该工作(假设你的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)])