在Neo4J中添加随机关系仅使用单节点



我的结构看起来像:

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个节点。

我的查询中是否缺少什么?还是我应该以不同的方式解决这个问题?

我还尝试了通过所有节点循环或使用SKIPLIMIT通过笛卡尔产品

使用FOREACH子句的不同方法

非常感谢!

编辑:

使用 apoc.periodic.iterate inversefalcon查询:

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))

您的查询正确,除非限制为10000而不是1000。(最好不要使用限制(。它对我有用,并为500人和20个爱好建立了近1000个关系(随机人和爱好(。

如果您用它进行批处理执行此操作,然后将批处理大小设置为1000而不是限制1000。这里500x20 = 1000,所以将有大约1000个关系。

注意:使用限制1000只会与第一个创建关系 两个爱好。

对于极限500,将仅使用一种爱好,对于限制1000前两个,对于限制1500的前3个等(500是人数(。

最新更新