我的结构如下所示:
Person -[:HAS_HOBBY]-> Hobby
我正在随机生成500个节点和20个爱好节点,现在想在它们之间生成随机链接,以便每个人都有1个或多个爱好,但并不是每个人都有相同的爱好。
CALL apoc.periodic.iterate("
match (p:Person),(h:Hobby) with p,h limit 1000
where rand() < 0.1 RETURN p,h ",
"CREATE (p)-[:HAS_HOBBY]->(h)",
{batchSize: 20000, parallel: true})
YIELD batches, total
RETURN *
没有APOC功能,查询如下所示:
MATCH(p:Person),(h:Hobby)
WITH p,h
LIMIT 10000
WHERE rand() < 0.1
CREATE (p)-[:HAS_HOBBY]->(h)
这是我尝试过的查询,问题是所有人员节点都链接到一个单一的兴趣节点,因此仅使用了1/20个节点。
查询中是否缺少任何内容?还是我应该以其他方式解决这个问题?
我还尝试了通过FOREACH
子句遍历所有节点或使用SKIP
和LIMIT
通过笛卡尔乘积的不同方法
非常感谢!
编辑:
使用InverseFalcon进行查询apoc.periodic.iterate
:
call apoc.periodic.iterate("
// first generate your range of how many hobbies you want a person to have
// for this example, 1 to 5 hobbies
WITH range(1,5) as hobbiesRange
// next get all hobies in a list
MATCH (h:Hobby)
WITH collect(h) as hobbies, hobbiesRange
MATCH (p:Person)
// randomly pick number of hobbies in the range, use that to get a number of random hobbies
WITH p, apoc.coll.randomItems(hobbies, apoc.coll.randomItem(hobbiesRange)) as hobbies
// create relationships
RETURN p,hobbies",
"FOREACH (hobby in hobbies | CREATE (p)-[:HAS_HOBBY]->(hobby))",
{batchSize: 1000, parallel: false});
在这种情况下,不使用iterate()会更容易,而要使用APOC的某些集合帮助器函数,例如那些用于从集合中获取随机项目的函数。像这样的东西:
// first generate your range of how many hobbies you want a person to have
// for this example, 1 to 5 hobbies
WITH range(1,5) as hobbiesRange
// next get all hobies in a list
MATCH (h:Hobby)
WITH collect(h) as hobbies, hobbiesRange
MATCH (p:Person)
// randomly pick number of hobbies in the range, use that to get a number of random hobbies
WITH p, apoc.coll.randomItems(hobbies, apoc.coll.randomItem(hobbiesRange)) as hobbies
// create relationships
FOREACH (hobby in hobbies | CREATE (p)-[:HAS_HOBBY]->(hobby))
非常感谢,感谢您的配合!我不得不与查询一起使用,
apoc.periodic.iterate
因为它无法处理具有10个爱好的200.000个人节点的负载。我将apoc.periodic.iterate
在您的问题中使用包裹您的代码