Разделение операции обновления на куски с коммитами - PullRequest
0 голосов
/ 04 мая 2018

Я запускаю процесс, действующий по возвращенному списку, подобному этому

MATCH p=(Item{name:'x'})-[r:RELATED_TO]->(w:item) 
where r.relatedness > 0.25
[PERFORM CALCS AND UPDATE w]

Первоначальный MATCH возвращает только около 100 узлов, но шаг выполнения вычислений - это операция n ^ 2 с достаточно большим n. Каждый шаг [PERFORM...] может быть выполнен независимо. Все это может занять один день, чтобы бежать.

Я бы хотел разбить это так, чтобы оно фиксировалось после каждого [PERFORM... ] шага. Таким образом, в случае сбоя, я могу начать с того места, где остановился.

На сервере SQL я мог бы сохранить результаты начального MATCH в таблице и работать с ним, используя CURSOR, отмечая завершенные строки по мере того, как я шел

Как я могу сделать что-то аналогичное в Neo4J?

1 Ответ

0 голосов
/ 04 мая 2018

Как концепция:

1) Сохранить результат первого запроса:

WITH 'x' as itemName
MERGE (T:SavedQueryResult {name: itemName})
WITH itemName, T
MATCH (:item {name: itemName})-[r:RELATED_TO]->(w:item) WHERE r.relatedness > 0.25
MERGE (I:SavedID {id: ID(w), processed: false})
MERGE (T)-[:hasResult]->(I)

2) И выполнить последовательность запросов:

WITH 'x' as itemName
MATCH (T:SavedQueryResult {name: itemName})-[:hasResult]->(I:SavedID {processed: false})
MATCH (w:item) WHERE ID(w) = I.id
[PERFORM CALCS AND UPDATE w]
SET I.processed = true

3) Для обработки сохраненных результатов вы можете использовать apoc.periodic.commit из APOC library.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...