繁体   English   中英

在Neo4j中创建关系

[英]Create relationships in Neo4j

我有一个约有80万个节点的图,我想使用Cypher在它们之间创建随机关系。

由于笛卡尔积太大,因此以下示例无法正常工作:

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

例如,我想要每个节点1个关系(800k),或者每个节点10个关系(8M)。

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

因此,您希望每个节点都具有精确的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)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM