Neo4j/Cypher语言 - 从匹配结果中获取随机节点



我需要播种一个 Neo4j 数据库。假设在添加Person节点后,我需要它们来写入Book s。这是我到目前为止所拥有的:

MATCH (p:Person)
WITH ["Book 1", "Book 2", "Book 3", "Book 4", "Book 5"] AS titles
UNWIND titles AS title
CREATE (???)-[:CREATED]->(:Content { title: title, content: "Words..." })

我想我可以用一个随机的人来填写??? p ,这是MATCH在第一行。我该怎么做?

使用 APOC 程序,您可以使用函数从列表中选择随机项目。下面是一个用法示例:

MATCH (p:Person)
WITH collect(p) as people
UNWIND ["Book 1", "Book 2", "Book 3", "Book 4", "Book 5"] AS title
WITH apoc.coll.randomItem(people) as person, title
CREATE (person)-[:CREATED]->(:Content { title: title, content: "Words..." })

如果你只想要 5 个不同的Person节点,并且你不在乎它们是否随机分布,或者重复运行很可能得到相同的节点,你可以使用这个高效的查询(因为它不需要获取所有Person节点(:

MATCH (p:Person)
WITH p LIMIT 5
WITH COLLECT(p) AS ps, ["Book 1", "Book 2", "Book 3", "Book 4", "Book 5"] AS titles
UNWIND [i IN RANGE(0, SIZE(ps)-1) | {p: ps[i], title: titles[i]}] AS data
WITH data.p AS p, data.title AS title
MERGE (p)-[:CREATED]->(:Content {title: title, content: "Words..."})

请注意,我使用 MERGE 而不是 CREATE ,以避免在您想要重新运行此查询时产生重复的关系和节点。

最新更新