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

时间:2019-07-06 22:33:27

标签: neo4j cypher graph-databases

我的结构如下:

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子句遍历所有节点或通过笛卡尔积使用SKIPLIMIT的不同方法

非常感谢!

编辑:

Query,由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});

2 个答案:

答案 0 :(得分:1)

在这种情况下,不使用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))

答案 1 :(得分:0)

您的查询是正确的,但限制应为10000,而不是1000。(最好不要使用该限制)。 它正在为我工​​作,并为500个人和20个爱好创建了近1000个关系(随机人和爱好)。

如果使用它来批量执行此操作,则将批量大小设置为1000,而不是限制1000。WHERE条件将关系数限制为Person和Hobby的所有可能组合的大约10%。 这里500x20 = 1000,所以大约有1000种关系。

  

注意:使用限制1000将仅与第一个建立关系   两个爱好。

对于限制500,将仅使用一个嗜好,对于限制1000,前两个,限制1500,前3,依此类推(以500为人数)。