1

我有以下图表:

(:客户)-[:匹配]->(:客户)

这不限于两个客户但深度不超过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)
4

0 回答 0