我正在尝试在银行账户之间创建随机交易。我创建了以下查询:
//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)
注:
- 此查询使用
CREATE
而不是MERGE
,因为不太可能已经存在以当前时间作为time
值的TRANSFERED_TO
关系。(如果仍然可以进行复制,您也可以选择使用MERGE
。( WHERE SIZE(accts) > 1
测试可避免在不存在至少2个帐户时出现错误SIZE(accts)/2*2-1
计算防止RANGE函数生成超过sender
帐户的最后有效索引的列表索引(i
(