Да, вы можете сделать это, но вам нужно itemID
или аналогичный по ваши узлы, чтобы обеспечить их заказ, иначе вы не сможете выполнить общую сумму. Вот как это может работать:
MATCH (f:F)
WITH f
OPTIONAL MATCH (g:F)
WHERE g.itemID<f.itemID
RETURN f.itemID, f.shares, sum(g.shares) + f.shares
ORDER BY f.itemID ASC;
Здесь я предполагаю, что у вас есть itemID
на каждом узле. Это необходимо, потому что, если вы не знаете, какие узлы пришли раньше или меньше других, вы не можете вычислить текущую сумму. Но если у вас есть поле типа itemID, то вы делаете дополнительное необязательное соответствие для всех тех элементов, где itemID меньше, чем тот, на который вы смотрите, а затем вы суммируете эти доли. Это обеспечивает точный общий итог.
Это не очень эффективный запрос, поскольку вы суммируете и продолжаете повторное суммирование. Скажем, у вас 4 узла; первый ничего не суммирует. Вторая сумма одна. Третьи суммы 2 (один во второй раз). Четвертая сумма три (одна в третий раз, вторая во второй раз). Так что это много дополнительной работы.
Что мы здесь делаем, это взломать, чтобы не иметь изменяемой переменной. Если мне нужно было выполнить этот запрос, я обычно делал бы это из java/javascript/python/whatever. Я бы просто получил значение shares
и вычислил текущую сумму за пределами cypher.
Спасибо, что сработали. Реальная проблема заключается в том, что я пытаюсь выполнить алгоритм упаковки bin в neo4j. если я положу текущую логику в моем прикладном уровне, мне нужно сохранить транзакцию открытой по сети, которую я надеялся не делать. – Ryan
Я тестировал 100 000 узлов, и да, производительность ужасна, мне пришлось ее остановить :( – Ryan