Моя структура выглядит следующим образом:
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
через декартово произведение
Большое спасибо!
edit:
Запрос от 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});