Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.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 - Fatal编程技术网

Neo4j 提交速度正在放缓

Neo4j 提交速度正在放缓,neo4j,cypher,Neo4j,Cypher,在写入几千条记录后,Neo4j的写入速度会减慢 存在两个索引以加快查询速度。 另外,使用EXPLAIN,我知道每个查询都是一个固定的时间过程 indexOrder = schema.indexFor(ORDER) .on("id") .create(); indexShop = schema.indexFor(SHOP) .on("domain") 这是我使用的查询:

在写入几千条记录后,Neo4j的写入速度会减慢

存在两个索引以加快查询速度。 另外,使用EXPLAIN,我知道每个查询都是一个固定的时间过程

        indexOrder = schema.indexFor(ORDER)
                .on("id")
                .create();
        indexShop = schema.indexFor(SHOP)
                .on("domain")
这是我使用的查询:

 WITH {json} as log 
 WITH log.order as order, log.shop as shop 
 MERGE (s:Shop {domain:shop.domain})
    ON CREATE SET s=shop
 MERGE (s)-[:Scored]->(r:Order {id:order.id})
    ON CREATE SET r=order
以下是我如何将其提交存储到DB:

private void log() {
    try (Transaction tx = graphDb.beginTx()) {
        for (Map map : list) {
            graphDb.execute(query,
                    singletonMap("json", map));

        }
        list = new ArrayList<>();
        tx.success();
    }
}
其他信息:我使用以下配置设置:

            .setConfig(GraphDatabaseSettings.pagecache_memory, "512M")
            .setConfig(GraphDatabaseSettings.string_block_size, "60")
            .setConfig(GraphDatabaseSettings.array_block_size, "300")
如果在一个事务中完成所有操作,则该系统可处理200000个条目,但随后会遇到内存问题

那么,为什么只有5个事务(5k个条目)提交到数据库后,1k个条目/事务方法就停止了呢

我如何解决这个问题

  • 您应该在
    订单
    节点上自行执行
    合并
    ,以允许密码计划者使用
    :订单(id)
    索引。(此外,无论如何,在对路径模式执行
    合并
    之前,您应该
    合并路径模式中的节点,以避免在某些情况下创建重复节点。)通过此更改,您的查询将如下所示(但还不理想):

  • 您应该尽量减少对
    execute()
    的调用次数,因为每个调用都有很多开销。事实上,您可以轻松地进行单个查询来处理1000个项目的整个
    列表。因此,您可以将
    log()
    代码更改为以下内容(我假设
    list
    定义为
    list
    或类似内容):

  • 您应该在
    订单
    节点上自行执行
    合并
    ,以允许密码计划者使用
    :订单(id)
    索引。(此外,无论如何,在对路径模式执行
    合并
    之前,您应该
    合并路径模式中的节点,以避免在某些情况下创建重复节点。)通过此更改,您的查询将如下所示(但还不理想):

  • 您应该尽量减少对
    execute()
    的调用次数,因为每个调用都有很多开销。事实上,您可以轻松地进行单个查询来处理1000个项目的整个
    列表。因此,您可以将
    log()
    代码更改为以下内容(我假设
    list
    定义为
    list
    或类似内容):


  • 是的,太棒了!是的,太棒了!
                .setConfig(GraphDatabaseSettings.pagecache_memory, "512M")
                .setConfig(GraphDatabaseSettings.string_block_size, "60")
                .setConfig(GraphDatabaseSettings.array_block_size, "300")
    
    WITH {json} as log 
    WITH log.order as order, log.shop as shop 
    MERGE (s:Shop {domain:shop.domain})
      ON CREATE SET s=shop
    MERGE (r:Order {id:order.id})
      ON CREATE SET r=order
    MERGE (s)-[:Scored]->(r)
    
    private void log() {
        try (Transaction tx = graphDb.beginTx()) {
            graphDb.execute(query, singletonMap("logList", list));
            list = new ArrayList<Map<String, Object>>();
            tx.success();
        }
    }
    
    UNWIND {logList} as log 
    WITH log.order as order, log.shop as shop 
    MERGE (s:Shop {domain:shop.domain})
      ON CREATE SET s=shop
    MERGE (r:Order {id:order.id})
      ON CREATE SET r=order
    MERGE (s)-[:Scored]->(r)