我当前正在使用以下查询从 Neo4j 图形数据库中删除一批节点:
String cypherCascadeDel= "UNWIND $conditions AS cond " +
"MATCH (node:" + tableName + ") " +
"WHERE ALL(key IN keys(cond) WHERE node[key] = cond[key])"+
"DETACH DELETE node";
其中条件是
type<String,Object>
的地图列表。该列表最多可以包含 100 万个条目,每个映射最多可以包含 5 个键值对。
此查询需要很长时间才能运行 - 100,000 个条目大约需要 15-20 分钟。有更好的方法来扩展这个吗?
您的谓词不允许索引查找,因此这是进行标签扫描。
问题在于您的 UNWIND 生成行,并且 Cypher 中的操作按行执行。
因此,对于 100k 个条目,您的 UNWIND 会生成 100k 行,因此 MATCH 被调用 100k 次,从而导致 100k NodeByLabelScan 执行。
相反,您可能想改变您的方法,省略 UNWIND 并尝试这个。
...
WHERE ANY(map IN $conditions WHERE ALL(key IN keys(map) WHERE node[key] = map[key]))
...
这应该将其保留为单个 NodeByLabelScan,并且对于每个节点,它将检查列表中的所有地图条件,一旦找到一个,它将接受删除该节点并继续到下一个。