[英]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.