有效清除Neo4j数据库

时间:2015-07-25 08:33:56

标签: neo4j cypher spring-data-neo4j

这是我之前的问题Clear Neo4j Embedded database

现在我明白我不需要关闭数据库,我只需要擦除这个数据库中的所有数据。

我使用以下方法:

public static void cleanDb(Neo4jTemplate template) {
    template.query("MATCH (n) OPTIONAL MATCH (n)-[r]-() DELETE n,r", null);
}

但它在大型数据集上无法正常工作。

另外,使用新版本的Spring Data Neo4j,我无法使用Neo4jHelper.cleanDb(db);

有没有办法在没有数据库关闭/删除的情况下正确有效地清理数据库状态?

已更新

我已经使用cleanDb方法

实现了以下util类
public class Neo4jUtils {

    final static Logger logger = LoggerFactory.getLogger(Neo4jUtils.class);

    private static final int BATCH_SIZE = 10;

    public static void cleanDb(Neo4jTemplate template) {
        logger.info("Cleaning database");

        long count = 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);
                count = (long) result.single().get("count");
                tx.success();
                logger.info("count: " + count);
            } catch (Throwable th) {
                logger.error("Error while deleting database", th);
                throw th;
            } finally {
                tx.close();
            }
        } while (count > 0);

    }

}

现在它挂起了线:

tx.close();

如何修复它,我做错了什么?

此外,经过多次实验后,我注意到我可以在工作应用程序上多次清理数据库。在应用程序重新启动后立即(我从控制台终止应用程序进程)cleanDb方法停止处理此现有数据库并挂起。

在messages.log中没有问题,一切看起来都很好:

2015-07-25 23:06:59.285+0000 INFO  [o.n.k.EmbeddedGraphDatabase]: Database is now ready

我不知道会出现什么问题。请帮助解决这个问题。

我用:

neo4j version 2.2.3
lucene version 3.6.2
spring-data-neo4j version 3.4.0.M1

重要更新

我注意到如果在终止我的应用程序之前使用 graphDatabaseService.shutdown(); 方法,一切正常.. 否则数据库会被销毁(Neo4j服务器也是挂起这个损坏的数据库)。

有什么方法可以让Neo4j Embedded数据库更具容错能力?在生产环境中出现第一个错误(例如停电事件)后,我将丢失所有数据。

1 个答案:

答案 0 :(得分:0)

我不知道Spring Data是如何工作的,但一般来说你应该尝试批量删除节点/关系。

Cypher查询:

MATCH (n)
WITH n LIMIT 10000
OPTIONAL MATCH (n)-[r]-()
DELETE n, r
RETURN count(n)

在您的应用程序中,您可以:

while return_value > 0:
    run_delete_query()      

根据您的记忆,您当然可以增加LIMIT