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