Как написать запрос на Cypher, который создает граф-солнце? Я имею в виду один узел в центре, у него есть ребра к каждому узлу, однако другие узлы (вне центра) не связаны между собой.
Более того, я бы хотел, чтобы у каждого узла было какое-то случайное свойство, например rank.
А затем, как написать запрос, который находит 10 лучших (с учетом ранга) соседей центрального узла?
Мог ли кто-нибудь дать что-то подобное?





Вы можете использовать такой запрос:
create (center:Center),
(:Node{rank : rand()})-[:LINKED_TO]->(center),
(:Node{rank : rand()})-[:LINKED_TO]->(center),
(:Node{rank : rand()})-[:LINKED_TO]->(center),
(:Node{rank : rand()})-[:LINKED_TO]->(center),
(:Node{rank : rand()})-[:LINKED_TO]->(center),
(:Node{rank : rand()})-[:LINKED_TO]->(center),
(:Node{rank : rand()})-[:LINKED_TO]->(center)
для создания этого графика:
Обратите внимание на использование функции rand () для присвоения случайного значения свойству rank в каждом узле.
И чтобы получить верхние узлы на основе свойства rank, вы можете использовать (в данном случае верхние 5):
match (:Center)<-[:LINKED_TO]-(n:Node)
with n order by n.rank desc limit 5
return n
РЕДАКТИРОВАТЬ
Вот более элегантное (но сложное) решение для создания «графа-солнца» с помощью процедуры APOC apoc.periodic.iterate. Я использую параметр для определения количества соседей. документы об apoc.periodic.iterate говорит:
With apoc.periodic.iterate you provide 2 statements, the first outer statement is providing a stream of values to be processed. The second, inner statement processes one element at a time or with iterateList:true the whole batch at a time.
Итак, в первом заявлении я возвращаю элементы number_of_n (используя функцию диапазон()). Затем второй оператор выполняется number_of_n раза, создавая каждого соседа.
CALL apoc.periodic.iterate(
"with range(0, {number_of_n} - 1) as items
unwind items as item
return item",
"merge (center:Center)
create (:Node{rank : rand()})-[:LINKED_TO]->(center)",
{params : {number_of_n:20}})
Этот запрос выводит такой график:
Привет, @CypherFancy! Если мой ответ решил ваш вопрос, пожалуйста, примите во внимание принимая это, установив галочку. Это показывает широкому сообществу, что вы нашли решение, и дает некоторую репутацию как автору, так и вам. Это не обязательно. Спасибо!