Cypher-запрос для назначения значений свойств в произвольном количестве узлов - PullRequest
0 голосов
/ 12 января 2019

Я новичок в Neo4J, поэтому заранее прошу прощения, если мой вопрос слишком тривиален.

Я пытаюсь создать график Neo4J, представляющий набор последовательных шагов в игре, как показано на этой диаграмме .

На диаграмме вы увидите, что я начинаю с нуля, и на определенных шагах (но не на на каждом шаге) накапливаются дополнительные баллы.

Я хочу назначить точки узлам, у которых еще нет точек, согласно следующему принципу: всякий раз, когда узел не имеет точек, я хочу назначить ему количество точек, равное точкам, которыми обладают ближайшие предыдущий узел, которому назначены точки. В примере диаграммы шаг 2 будет иметь 0 баллов (:Step {id: 2, points_so_far: 0}), а шаг 4 будет иметь 1 балл (:Step {id: 4, points_so_far: 1}). Обратите внимание, что между узлами, у которых есть оценка, может быть произвольное количество бесчисленных узлов.

Любая помощь в создании соответствующего запроса Cypher будет принята с благодарностью!

Большое спасибо заранее!

1 Ответ

0 голосов
/ 14 января 2019

Вот способ сделать это:

match (s:Step) WHERE not exists(s.points_so_far) 
match (prev:Step)<-[:HAS_PREVIOUS_STEP*]-(s) where exists(prev.points_so_far) 
with s, head(collect(prev)) as prev
SET s.points_so_far = prev.points_so_far

Как это работает?

Сначала найдите все узлы, у которых нет points_so_far

match (s:Step) WHERE not exists(s.points_so_far) 

с этими узлами найдите все предыдущие шаги, которые имеют points_so_far

match (prev:Step)<-[:HAS_PREVIOUS_STEP*]-(s) where exists(prev.points_so_far) 

получить все предыдущие узлы с точками, собрать их в список и оставить только первый встреченный

with s, head(collect(prev)) as prev

установить значение узла со значением предыдущего узла

SET s.points_so_far = prev.points_so_far

Примечание: В этом запросе используется переменная длина пути (* in <-[:HAS_PREVIOUS_STEP*]-), которая имеет некоторые затраты производительности.

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