Это можно сделать в Cypher, но код может быть немного пугающим: -).
Например, этот запрос:
WITH [1,2,3,4,5,6,7,8,9] AS input
RETURN REDUCE(s = {sum:0, res:[]}, x IN input | CASE
WHEN s.sum + x > 8 THEN CASE
WHEN s.sum = 0 THEN {sum:0, res:s.res+[[x]]}
ELSE {sum:0, res:s.res[..-1]+[s.res[-1]+x]} END
ELSE CASE
WHEN s.sum = 0 THEN {sum:s.sum+x, res:s.res+[[x]]}
ELSE {sum:s.sum+x, res:s.res[..-1]+[s.res[-1]+[x]]} END
END
).res AS result
дает такой результат:
╒═══════════════════════════╕
│"result" │
╞═══════════════════════════╡
│[[1,2,3,4],[5,6],[7,8],[9]]│
└───────────────────────────┘
Примечание: в приведенном выше запросе последний подсписок всегда будет содержать остаток от входного списка, и его сумма не обязательно будет превышать 8. Если сумма последнего подсписка также должна превышать 8, тоэтот модифицированный запрос:
WITH [1,2,3,4,5,6,7,8,8] AS input, 8 AS bound
WITH bound, REDUCE(s = {sum:0, res:[]}, x IN input | CASE
WHEN s.sum + x > bound THEN CASE
WHEN s.sum = 0 THEN {sum:0, res:s.res+[[x]]}
ELSE {sum:0, res:s.res[..-1]+[s.res[-1]+x]} END
ELSE CASE
WHEN s.sum = 0 THEN {sum:s.sum+x, res:s.res+[[x]]}
ELSE {sum:s.sum+x, res:s.res[..-1]+[s.res[-1]+[x]]} END
END
).res AS res
RETURN CASE
WHEN REDUCE(t=0, y IN res[-1] | t+y) > bound THEN res
ELSE res[..-1] END AS result
дает такой результат:
╒═══════════════════════╕
│"result" │
╞═══════════════════════╡
│[[1,2,3,4],[5,6],[7,8]]│
└───────────────────────┘