此查询的执行计划包含 Eager 运算符,它强制所有相关数据在继续之前在主内存中具体化

The execution plan for this query contains the Eager operator, which forces all dependent data to be materialized in main memory before proceeding

我是 运行 Neo4j 中的这段代码:

//Creates an edge labeled "Mentioned". 
LOAD CSV FROM "file:///datafile.csv" AS row 
MERGE (u:ChatItem {id: toInteger(row[0])}) 
MERGE (t:User {id: toInteger(row[1])})
MERGE (u)-[:Mentioned{timeStamp: toInteger(row[2])}]->(c) 
//userid, userid, timestamp

我收到了这个警告: 此查询的执行计划包含 Eager 运算符,它强制 在继续之前,所有相关数据都将在主内存中具体化

在执行计划所在的查询中对大型数据集使用 LOAD CSV 包含 Eager 运算符可能会消耗大量内存并且是 可能表现不佳。请参阅 Eager 运算符上的 Neo4j 手册条目 有关如何避免问题的更多信息和提示。

这里是数据集的概述:

6824,1847,1464235815.0
6865,789,1464239415.0
6906,518,1464243003.0
6934,240,1464243031.0
6968,1482,1464244803.0
6976,1792,1464244811.0
6983,767,1464244818.0

这是什么意思,我该怎么办?

这是因为您正在创建(或不创建)节点,然后在它们之间创建(或不创建)关系。

在单个 Cypher 语句中,Neo4j 必须隔离影响进一步匹配的更改,例如当您创建带有标签的节点时,这些节点突然被后来的 MATCH 或 MERGE 操作匹配。

这就是你进行 eager 手术的原因。

要避免它,您可以:

  • 将关系上的 MERGE 更改为 CREATE(如果可能的话)
  • 有 2 个脚本:一个创建节点,一个只创建关系(MATCH、MATCH、MERGE 查询类型)