[英]Creating random relationships between nodes
我有一个包含1,000个公司,1,000个人员和2,000个银行帐户的数据库。 我想将每个公司的一个银行帐户随机配对,将每个人的一个银行随机配对,但没有一个银行帐户连接多个实体。
我尝试了以下操作,但未成功:
MATCH (a:PERSON), (b:BANK_ACCOUNT)
WHERE NOT (a)-[:HAS_BANK_ACCOUNT]->(:BANK_ACCOUNT)
AND NOT (b)<-[:HAS_BANK_ACCOUNT]-(:COMPANY|:PERSON)
MERGE (a)-[:HAS_BANK_ACCOUNT]->(b);
MATCH (COMPANY), (b:BANK_ACCOUNT)
WHERE NOT (a)-[:HAS_BANK_ACCOUNT]->(:BANK_ACCOUNT)
AND NOT (b)<-[:HAS_BANK_ACCOUNT]-(:COMPANY|:PERSON)
MERGE (a)-[:HAS_BANK_ACCOUNT]->(b);
你能帮我吗?
最好,
如何使用APOC rock_n_roll
做这样的事情
// iterate over people
// and create a relationship to one bank
// that does not already have the HAS_BANK_ACCOUNT
CALL apoc.periodic.rock_n_roll(
'MATCH (a:PERSON)
WHERE NOT (a)-[:HAS_BANK_ACCOUNT]->()
RETURN a AS a',
'WITH {a} AS a MATCH (b:BANK_ACCOUNT)
WHERE NOT (b)<-[:HAS_BANK_ACCOUNT]->()
WITH a, b
LIMIT 1
MERGE (a)-[:HAS_BANK_ACCOUNT]->(b)',
100
)
// repeat, but for companies this time
CALL apoc.periodic.rock_n_roll(
'MATCH (a:COMPANY)
WHERE NOT (a)-[:HAS_BANK_ACCOUNT]->()
RETURN a AS a',
'WITH {a} AS a
MATCH (b:BANK_ACCOUNT)
WHERE NOT (b)<-[:HAS_BANK_ACCOUNT]->()
WITH a, b
LIMIT 1
MERGE (a)-[:HAS_BANK_ACCOUNT]->(b)',
100
)
另外,只需稍作更改,您也可以一口气完成
CALL apoc.periodic.rock_n_roll(
'MATCH (a)
WHERE a:PERSON or a:COMPANY
AND NOT (a)-[:HAS_BANK_ACCOUNT]->()
RETURN a AS a',
'WITH {a} AS a
MATCH (b:BANK_ACCOUNT)
WHERE NOT (b)<-[:HAS_BANK_ACCOUNT]->()
WITH a, b
LIMIT 1
MERGE (a)-[:HAS_BANK_ACCOUNT]->(b)',
100
)
如果要使关系比添加关系的顺序更随机,则可以使用一行来随机化行驶MATCH语句。
CALL apoc.periodic.rock_n_roll(
'MATCH (a)
WHERE a:PERSON or a:COMPANY
AND NOT (a)-[:HAS_BANK_ACCOUNT]->()
RETURN a AS a, rand() AS random
ORDER BY random',
'WITH {a} AS a
MATCH (b:BANK_ACCOUNT)
WHERE NOT (b)<-[:HAS_BANK_ACCOUNT]->()
WITH a, b, rand() AS random
ORDER BY random
LIMIT 1
MERGE (a)-[:HAS_BANK_ACCOUNT]->(b)',
100
)
由于节点数量很少,您应该可以使用APOC收集函数进行混排和压缩来轻松实现此目的:
MATCH (b:BANK_ACCOUNT)
WITH collect(b) as accounts
WITH apoc.coll.shuffle(accounts) as accounts
MATCH (p:PERSON)
WITH accounts, collect(p) as persons
UNWIND apoc.coll.zip(persons, accounts[..1000]) as personAccount
WITH accounts, personAccount[0] as person, personAccount[1] as account
CREATE (person)-[:HAS_BANK_ACCOUNT]->(account)
WITH distinct accounts[1000..] as accounts
MATCH (c:COMPANY)
WITH accounts, collect(c) as companies
UNWIND apoc.coll.zip(companies, accounts) as companyAccount
WITH companyAccount[0] as company, companyAccount[1] as account
CREATE (company)-[:HAS_BANK_ACCOUNT]->(account)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.