在Neo4j中创建关系

在Neo4j中创建关系,neo4j,cypher,relationships,Neo4j,Cypher,Relationships,我有一个大约800k个节点的图,我想用Cypher在它们之间创建随机关系 由于笛卡尔积太大,以下示例不起作用: match (u),(p) with u,p create (u)-[:LINKS]->(p); 例如,我希望每个节点有一个关系(800k),或者每个节点有10个关系(8M) 简而言之,我需要一个查询密码,以便在节点之间统一创建关系。 有人知道以这种方式创建关系的查询吗?所以您希望每个节点都有确切的x关系?分批尝试此操作,直到不再更新任何关系: MATCH (u),(p) WH

我有一个大约800k个节点的图,我想用Cypher在它们之间创建随机关系

由于笛卡尔积太大,以下示例不起作用:

match (u),(p)
with u,p
create (u)-[:LINKS]->(p);
例如,我希望每个节点有一个关系(800k),或者每个节点有10个关系(8M)

简而言之,我需要一个查询密码,以便在节点之间统一创建关系。
有人知道以这种方式创建关系的查询吗?

所以您希望每个节点都有确切的
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)
匹配(u),(p)其中的大小((u)-[:LINKS]->(p))<{x}
u,p限制为10000,其中rand()小于0.2//限制为10000,然后采样
创建(u)-[:链接]->(p)
这应该可以工作(假设您的neo4j服务器有足够的内存):

此查询收集所有节点,并使用嵌套循环执行以下
{numLinks}
次操作:在每个节点和随机选择的节点之间创建
链接
关系


最里面的
FOREACH
用作当前密码限制的解决方法,即不能将返回节点的操作放入节点模式中。具体来说,这是非法的:
CREATE(x)-[:LINK]->(ns[TOINT(RAND()*len)]

可能重复No,建议的解决方案回到了我在问题中编写的无效示例中。如果节点为800k,为什么将u,p限制为10000?为什么要以20%的比率使用rand()进行采样?它不起作用,因为它为每个节点创建了很多关系。
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) )));