【问题标题】:Write a Cypher query to CREATE links between random nodes编写一个 Cypher 查询来创建随机节点之间的链接
【发布时间】:2015-09-17 01:50:52
【问题描述】:

要为数据库播种,我想创建一小组 Person 节点...

WITH ["Amy","Bob","Cal","Dan","Eve"]
AS names
FOREACH (r IN range(0, size(names)-1) |
  CREATE (:Person {name: names[r]})
)

...我想为每个人创建一个随机连接。是否可以在单个查询中执行此操作?

我想我需要将每个新 Person 添加到集合中,并使用从 FLOOR(RAND() * size(names)) 创建的变量,但官方文档并没有提供很多线索来说明如何这样做。

【问题讨论】:

    标签: random neo4j cypher


    【解决方案1】:

    好问题!

    有几件事,首先我更喜欢UNWIND 而不是FOREACH,尤其是在这样的情况下:

    WITH ["Amy","Bob","Cal","Dan","Eve"] AS names
    UNWIND names AS name
    CREATE (:Person {name: name})
    

    就创建随机关系而言,Michael Hunger 有一篇很好的博文介绍了它:

    http://jexp.de/blog/2014/03/quickly-create-a-100k-neo4j-graph-data-model-with-cypher-only/

    在你的情况下,它会是这样的:

    MATCH (p1:Person), (p2:Person)
    WITH p1, p2
    WHERE rand() < 0.1
    MERGE p1-[:LIKES]->p2
    

    请注意这一点,因为第一个 MATCH 指定了所有人与所有其他人的完整笛卡尔积,随着您的 Person 节点的增长,它可以快速增长。迈克尔在帖子中的WITH 上添加了LIMIT

    【讨论】:

    • 非常感谢您提供此内容以及指向 Michael Hunger 文章的链接。这是我现在使用的单个查询:WITH ["Amy","Bob","Cal","Dan","Eve"] AS names UNWIND names AS name CREATE p = (:Person {name: name}) WITH p MATCH (p1:Person), (p2:Person) WITH p1, p2 WHERE rand() &lt; 0.3 AND p1 &lt;&gt; p2 MERGE p1-[:LIKES]-&gt;p2 RETURN DISTINCT p1, p2。我添加了p1&lt;&gt;p2,这样链接总是在不同的节点之间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-17
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多