【问题标题】:Effectively clear Neo4j database有效清除 Neo4j 数据库
【发布时间】:2015-07-25 08:33:55
【问题描述】:

这是我之前的问题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 数据库更容错?在生产环境中出现第一个错误(例如停电事件)后,我将丢失所有数据..

【问题讨论】:

    标签: neo4j cypher spring-data-neo4j


    【解决方案1】:

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

    密码查询:

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

    在你的应用程序中你这样做:

    while return_value > 0:
        run_delete_query()      
    

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

    【讨论】:

    • 感谢您的回答。应用程序也挂起此查询 - Result> result = template.query("MATCH (n) WITH n LIMIT 1000 OPTIONAL MATCH (n)-[r]-() DELETE n, r RETURN count (n)", null);如您所见,我将 LIMIT 甚至降低到了 1000
    • 好的,试试 5 看看是不是内存问题。
    • 好的,它是否适用于 Neo4j Web 界面中的 Cypher 查询?
    • 它在 Neo4j Web 界面中工作 - 删除了 344205 个节点,删除了 988809 个关系,语句在 45721 毫秒内执行。
    • 此查询(限制为 1000)“匹配(n)与 n 限制 1000 可选匹配(n)-[r]-()删除 n,r 返回计数(n)”适用于 -Xmx512m在 Neo4j Web 界面中......即使使用 -Xmx4g 也无法完全删除
    猜你喜欢
    • 2015-10-14
    • 2014-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-08
    相关资源
    最近更新 更多