我有以下图表:
(:客户)-[:匹配]->(:客户)
这不限于两个客户但深度不超过5个。以下还存在:
(:Customer)-[:MATCHES]->(:AuditCustomer)
有一个标签 :Master 需要根据某些条件添加到匹配集中的一个客户节点。
因此,我的查询需要找到所有匹配客户的集合,其中没有标签主标签,并将该标签添加到集合中的一个节点。有大量客户节点,一次性完成所有操作会导致数据库变得非常慢。
我曾尝试使用 apoc.periodic.commit 来做到这一点:
CALL apoc.periodic.commit("MATCH (c:Customer)
WHERE NOT c:Master AND NOT (c)-[:MATCHES*0..5]-(:Master) WITH c limit {limit}
CALL apoc.path.expand(c, 'MATCHES', '+Customer', 0, -1)
YIELD path UNWIND NODES(path) AS nodes WITH c,nodes
order by nodes:Searchable desc, nodes.createdTimestamp asc
with c, head(collect(distinct nodes)) as collectedNodes
set collectedNodes:Master
return count(collectedNodes)", {limit:100})
但是,即使将限制参数设置为 1,这仍然会导致数据库变得非常慢。我读到 apoc.periodic.commit 是一个阻塞进程,所以这可能会导致问题。有没有一种方法可以不占用大量资源,并且数据库可以在运行时继续处理其他事务?
查询中最慢的部分是初始匹配:
MATCH (c:Customer)
WHERE NOT c:Master AND NOT (c)-[:MATCHES*0..5]-(:Master) WITH c limit {limit}
这大约需要 3.5 秒,整个查询大约需要 4 秒。限制 1 和限制 20 之间几乎没有区别。也许如果有办法重写它以使其更快,它可能是一个更好的方法?
此外,如果它有任何用处,以下返回 ~70K
MATCH (c:Customer)
WHERE NOT c:Master AND NOT (c)-[:MATCHES*0..5]-(:Master)
RETURN COUNT(c)