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