Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j批量删除_Neo4j_Cypher_Spring Data Neo4j_Graph Databases - Fatal编程技术网

Neo4j批量删除

Neo4j批量删除,neo4j,cypher,spring-data-neo4j,graph-databases,Neo4j,Cypher,Spring Data Neo4j,Graph Databases,我使用以下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.inf

我使用以下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);
    }

}
公共类Neo4jUtils{
最终静态记录器=LoggerFactory.getLogger(Neo4jUtils.class);
私有静态最终整数批大小=1000;
公共静态void cleanDb(Neo4jTemplate模板){
logger.info(“清理数据库”);
长DeletedNodeCount=0;
做{
GraphDatabaseService GraphDatabaseService=template.getGraphDatabaseService();
事务tx=graphDatabaseService.beginTx();
试一试{
Result Result=template.query(“使用n个限制匹配(n)+批量大小+”可选匹配(n)-[r]()删除n,r将计数(n)返回为计数”,null);
DeletedNodeCount=(长)result.single().get(“count”);
成功();
logger.info(“已删除”+DeletedNodeCount+“节点…”);
}捕获(可丢弃){
logger.error(“删除数据库时出错”,th);
掷骰子;
}最后{
tx.close();
}
}而(deletedNodeCount>0);
}
}
如您所见,我将批大小限制为1000,但无论如何,在删除操作期间,第一批删除约300000个实体,其余批删除每个批中约2000个实体


你能告诉我为什么在使用
BATCH\u SIZE=1000的情况下会有这么大的数字吗如何修复此函数以将批处理大小真正限制为1000个节点?

可能会重复计算节点,因为您与它们有多个关系。您的查询确实应该删除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