Когда мне приходилось наматывать что-то подобное, я добавлял столбец dateUpdated в свою базу данных, чтобы сделать это очевидным при обновлении.Затем вы можете просмотреть список дочерних узлов, чтобы убедиться, что дочерний элемент всегда обновлялся после его родительского элемента.Я предполагаю:
- У вас всегда есть DAG
- Топология не меняется
тогда вы можете один раз разбить графикв непересекающиеся сегменты (один раз), внутри каждого сегмента - соберите все корни в кучу и обработайте каждый корень и его дочерние элементы, обновив столбец dataUpdated по мере необходимости обновления узла.
Если вы хотитесохраняйте полную историю, делайте INSERT, когда вы «обновляете» dateUpdated (скопируйте все, что не изменилось, установите dateUpdated = NOW.) Если вы хотите представлять только текущее обработанное состояние, выполните UPDATE.
Одна из проблем, связанных с выполнением UPDATE, заключается в том, что если у вас есть другие процессы, читающие эти данные, у вас может быть состояние гонки, при котором вы обновляете родителя, читаете неотобновленный потомок и получаете устаревшее значение.Другой подход заключается в том, что вы фактически не возвращаете значение до тех пор, пока все дочерние элементы не обновят времена, превышающие их родительские значения (или какие-либо входные данные в вашей функции.) Если вы выполняете INSERT, то дочерние узлы не будут существовать, пока ониобрабатываются, но вам придется обрабатывать случай, когда вы запрашиваете узел, который не существует из-за перестроения, в отличие от случая, когда вы запрашиваете узел, который просто не существует.
Еслиизменения топологии, тогда вам, вероятно, потребуется применить ограничение DAG, а затем выполнять разбиение каждый раз.
Итак, я думаю, что этот вид зависит от того, какую историю вы хотите сохранить (полная история или история предварительно вычисленных значений) и как топология вашего графа меняется со временем.
Ядовольно хорошо в трех из четырех добавленных тэгов, но я ничего не знаю о neo4j, так что извините, если там уже есть структура данных для этого.Также всегда кажется, что должна быть какая-то система баз данных, которая может хранить данные по мере их изменения при разных ревизиях, но я всегда использую dateUpdated с MySQL ...