Я использую следующий класс утилиты для очистки базы данных Neo4j:
public class Neo4jUtils {
final static Logger logger = LoggerFactory.getLogger(Neo4jUtils.class);
private static final int BATCH_SIZE = 1000;
public static void cleanDb(Neo4jTemplate template) {
logger.info("Cleaning database");
long deletedNodesCount = 0;
do {
GraphDatabaseService graphDatabaseService = template.getGraphDatabaseService();
Transaction tx = graphDatabaseService.beginTx();
try {
Result<Map<String, Object>> result = template.query("MATCH (n) WITH n LIMIT " + BATCH_SIZE + " OPTIONAL MATCH (n)-[r]-() DELETE n, r RETURN count(n) as count", null);
deletedNodesCount = (long) result.single().get("count");
tx.success();
logger.info("Deleted " + deletedNodesCount + " nodes...");
} catch (Throwable th) {
logger.error("Error while deleting database", th);
throw th;
} finally {
tx.close();
}
} while (deletedNodesCount > 0);
}
}
Как видите, я ограничил размер пакета до 1000, но в любом случае во время операции удаления первый пакет удаляет ~300000 объектов, а остальные пакеты удаляют ~2000 объектов в каждом пакете.
Не могли бы вы сказать мне, почему у меня такие большие числа в случае использования BATCH_SIZE = 1000;
Как исправить эту функцию, чтобы действительно ограничить размер партии до 1000 узлов?