Лучше всего было бы установить плагин APOC для Neo4j, чтобы вы могли использовать функцию UUID apoc.create.uuid()
в Cypher.(чтобы его можно было сгенерировать и назначить в одной и той же транзакции)
Чтобы создать 1 uuid на раздел, вам потребуется использовать WITH для хранения uuid во временной переменной.Он будет выполняться для каждой строки, поэтому вам нужно сделать это, как только у вас будет один раздел
USING PERIODIC COMMIT 5000 // commit every 5k changes
MATCH (n)
WITH DISTINCT n.partition as p // will exclude null
WITH p, apoc.create.uuid() as uuid // create reusable uuid
// now just match and assign
MATCH (n)
WHERE n.partition = p
SET n.uuid = uuid
или, как предложил InverseFalcon
MATCH (n)
WHERE exists(n.partition) // to filter out nulls
WITH n.partition as p, collect(n) as nodes // collect nodes so each row is 1 partition, and it's nodes
WITH p, nodes, apoc.create.uuid() as uuid // create reusable uuid
FOREACH (n in nodes | SET n.uuid = uuid) // assign uuid to each node in collection
Первый запрос более удобен для периодической фиксации, посколькуему не нужно загружать все в память, чтобы начать выполнять задания.Однако без оператора perodic commit он, в конечном счете, загрузит все в память, поскольку он должен удерживать его для журнала транзакций.Как только он достигает точки фиксации, он может очистить журнал транзакций, чтобы уменьшить использование памяти.
Если ваш набор данных не слишком большой, второй запрос должен быть быстрее, потому что, сохраняя все в памяти после сканирования первого узла, ему не нужно запускать сканирование другого узла, чтобы найти все узлы,Периодическая фиксация здесь не поможет, потому что если вы взорвете кучу, это почти наверняка произойдет во время начальной фазы сканирования / сбора.