有人可以推荐一个更有效的密码查询来执行以下功能

问题描述 投票:0回答:1

我当前正在使用以下查询从 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 分钟。有更好的方法来扩展这个吗?

neo4j cypher neo4jclient
1个回答
0
投票

您的谓词不允许索引查找,因此这是进行标签扫描。

问题在于您的 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,并且对于每个节点,它将检查列表中的所有地图条件,一旦找到一个,它将接受删除该节点并继续到下一个。

© www.soinside.com 2019 - 2024. All rights reserved.