如何在节点之间创建随机关系



我正在尝试在银行账户之间创建随机交易。我创建了以下查询:

//Create transactions
CALL apoc.periodic.iterate("
match (a:BANK_ACCOUNT)
WITH apoc.coll.randomItem(collect(a)) as sender
return sender", "
MATCH (b:BANK_ACCOUNT)
WHERE NOT sender = b
WITH apoc.coll.randomItem(collect(b)) as receiver
MERGE (sender)-[r:HAS_TRANSFERED {time: datetime()}]->(receiver)
set r.amount = rand()*1000",
{batchSize:100, parallel:false});

我假设它会在随机的银行账户之间创建100笔随机交易。相反,它创建了一个新的银行账户和一个新关系。我做错了什么?我该怎么办?

谢谢你的帮助!

以下查询使用apoc.coll.randomItems一次获得200个不同的随机帐户(比获得一个随机帐户200次快得多(:

MATCH (ba:BankAccount)
WITH apoc.coll.randomItems(COLLECT(ba), 200) AS accts
WHERE SIZE(accts) > 1 
UNWIND RANGE(0, SIZE(accts)/2*2-1, 2) AS i
WITH accts[i] AS sender, accts[i+1] AS receiver
CREATE (sender)-[:TRANSFERED_TO {time: datetime()}]->(receiver)

注:

  1. 此查询使用CREATE而不是MERGE,因为不太可能已经存在以当前时间作为time值的TRANSFERED_TO关系。(如果仍然可以进行复制,您也可以选择使用MERGE。(
  2. WHERE SIZE(accts) > 1测试可避免在不存在至少2个帐户时出现错误
  3. SIZE(accts)/2*2-1计算防止RANGE函数生成超过sender帐户的最后有效索引的列表索引(i(

最新更新