Я взял на себя смелость переосмыслить ваши требования, поэтому здесь есть некоторые предположения, которые вы должны подтвердить, чтобы это было действительным.
Я предполагаю, что вы ищете на человекаПо крайней мере один набор из 2 фильмов, которые были опубликованы в течение 30 дней друг от друга (в противном случае вы не ожидали бы записей Боба в своих результатах).
Я также предполагаю, что вы хотели, чтобы фильм X опубликовалбыть 2016-03-09
вместо 2018-03-09
в противном случае это не должно быть в ожидаемых результатах.
С этими допущениями, этот запрос должен выполнить трюк:
MATCH (p:Person)-[:ACTED_IN]->(m:Movie)
WITH p, m
ORDER BY m.publish_date
WITH p, collect(m) as movies, collect(m.publish_date) as dates
UNWIND range(0, size(movies)-2) as index
WITH p, movies, dates, index
WHERE duration.inDays(dates[index], dates[index+1]).days <= 30
UNWIND [movies[index], movies[index+1]] as movieInRange
RETURN DISTINCT p, movieInRange
ORDER BY p.name DESC
Мы UNWIND диапазон отОт 0 до 2 меньше, чем размер списка фильмов на человека, чтобы мы могли выполнить индексацию в списках (мы будем оценивать даты фильмов в парах, чтобы мы могли провести сравнение).
Для смежных пар, опубликованных в течение 30 дней друг от друга, мы УВЕЛИЧИВАЕМ коллекцию смежных фильмов, чтобы оба фильма находились под одной и той же переменной, затем мы возвращаем отсортированные значения DISTINCT (поскольку один и тот же фильм можетпроисходят дважды, в течение 30 дней после фильма до и после.