Создание графика-солнце - как написать запрос? - PullRequest
0 голосов
/ 10 мая 2018

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

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

Может ли кто-нибудь дать что-то подобное?

1 Ответ

0 голосов
/ 10 мая 2018

Вы можете использовать запрос как этот:

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)

для создания этого графика:

Graph

Обратите внимание на использование функции rand () для назначения случайного значения свойству rank в каждом узле.

И чтобы получить верхние узлы на основе свойства rank, которое вы можете использовать (в данном случае 5 лучших):

match (:Center)<-[:LINKED_TO]-(n:Node)
with n order by n.rank desc limit 5
return n

EDIT

Здесь более элегантное (но сложное) решение для создания "графа-солнца" с использованием процедуры APOC apoc.periodic.iterate. Я использую параметр, чтобы определить количество соседей. docs о apoc.periodic.iterate говорит:

С apoc.periodic.iterate вы предоставляете 2 утверждения, первое внешнее оператор предоставляет поток значений для обработки. Второй, внутреннее утверждение обрабатывает один элемент за один раз или с iterateList: true для всего пакета за раз.

Итак, в первом утверждении я возвращаю number_of_n элементов (используя range () ). Затем второй оператор выполняется 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}})

Этот запрос выводит график вроде:

Graph generated using apoc.periodic.iterate

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...