Пакетное удаление Neo4j

Я использую следующий класс утилиты для очистки базы данных 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 узлов?


person alexanoid    schedule 05.08.2015    source источник


Ответы (1)


Вероятно, это двойной подсчет узлов, потому что у вас есть несколько отношений с ними. Ваш запрос действительно должен удалить 1000 узлов, но вы возвращаете количество комбинаций (n, r).

Ты мог бы:

Измените свой запрос, чтобы напечатать уникальные узлы:

MATCH (n) WITH n LIMIT 1000 OPTIONAL MATCH (n)-[r]-() DELETE n, r RETURN count(DISTINCT n) as count

Или распечатайте количество узлов, оставшихся после каждого удаления, и проверьте, не меньше ли оно на 1000, чем раньше.

MATCH (n) RETURN count(n) as count
person ilinca    schedule 06.08.2015