Пакетно изтриване на Neo4j

Използвам следния клас util за почистване на база данни 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, но така или иначе по време на операцията по изтриване първата партида изтрива ~300 000 обекта, а останалите партиди изтриват ~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