写一个Cypher查询来创建随机节点之间的链接

时间:2015-09-17 01:50:53

标签: random neo4j cypher

要为数据库设定种子,我想创建一小组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))创建的变量,但官方文档没有提供很多关于如何使用的线索这样做。

1 个答案:

答案 0 :(得分:5)

好问题!

有几件事,首先我经常更喜欢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节点的增长而快速增长。迈克尔在帖子中LIMIT放置WITH