繁体   English   中英

在节点之间创建随机关系

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

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