У меня есть график, где некоторые узлы были созданы из-за ошибки в приложении.
Я хочу удалить эти узлы (они представляют собой журнал), но я не могу понять, как выполнить цикл по узлам.
Я не знаю, как получить доступ к узлам в наборе путей, и мне нужно это сделать, чтобы сравнить один узел с другим.
match (o:Order{id:123})
match (o)-[:STATUS_CHANGE*]->(l:Log)-[:STATUS]->(os:OrderStatus)
with collect((l:Log)-[:STATUS]->(os:OrderStatus)) as logs
Я хочу получить доступ к каждому из узлов в путях, чтобы выполнить сравнение. Обычно для каждого Ордена 5 или 6 из (l) - [: STATUS] -> (os).
Как я могу получить доступ к узлам (l) и (os) каждого пути, чтобы выполнить сравнения между их свойствами?
Например, если бы у меня была эта коллекция путей в одном из Орденов:
(log1) - [: STATUS] -> (os1)
(log2) - [: STATUS] -> (os2)
(log3) - [: STATUS] -> (OS3)
(log4) - [: STATUS] -> (os2) <- это ошибка </p>
(log5) - [: STATUS] -> (OS4)
Итак, из вышеупомянутой коллекции путей я бы хотел отменить удаление (log4), поскольку узел (os2) ниже предыдущего (os3) и должен быть больше.
И после этого я хочу прикрепить (log3) к (log5)
ПРИМЕЧАНИЕ. Каждый из узлов (os) имеет идентификатор, представляющий «статус», и имеет значение от 1 до 5. Кроме того, узлы (log) упорядочены по созданному дате и времени.
Есть идеи, как это сделать? Заранее спасибо, ребята!
EDIT
Я не упомянул некоторые другие сценарии, которые у меня были. Это один из них:
Основываясь на ответе @cybersam, я узнал, как это сделать.
Мне пришлось выполнить 2 отдельных запроса, чтобы заставить его работать, но принцип тот же и следующий:
Создание новых отношений:
MATCH(o:Order)-[:STATUS_CHANGE*]->(l:Log)-[:STATUS]->(os:OrderStatus)
WHERE SIZE((o)-[:STATUS_CHANGE*]->()-[:STATUS]->(os)) >= 1
WITH o, os, COLLECT(l)[0] AS keep
WITH o, collect(keep) AS k
FOREACH(i IN range(0,size(k)-1) |
FOREACH(a IN [k[i]] |
FOREACH(b IN [k[i+1]] |
FOREACH(c IN CASE WHEN b IS NOT NULL THEN [1] END | MERGE (a)-[:STATUS_CHANGE]->(b) ))));
Удалить превышенные узлы:
MATCH(o:Order)-[:STATUS_CHANGE*]->(l:Log)-[:STATUS]->(os:OrderStatus)
WHERE (os)<-[:STATUS]-()-[:STATUS_CHANGE*]->(l)-[:STATUS]->(os)
WITH o, os, COLLECT(l) AS exceed
UNWIND exceed AS del
detach delete del;
Этот запрос работал для каждого сценария.