Neo4j / Cypher - Получить случайный узел из соответствующего результата - PullRequest
0 голосов
/ 09 июля 2019

Мне нужно заполнить базу данных 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 ed в первой строке.Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 09 июля 2019

Если вы просто хотите, скажем, 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, чтобы избежать дублирования отношений и узлов, если вы захотите повторно выполнить этот запрос.

1 голос
/ 09 июля 2019

Используя процедуры 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..." })
...