在Neo4j中创建关系
我有一个包含约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
不,建议的解决方案可以回到我在我的问题中写下的不起作用的例子。 –