Neo4j cypher查询更新节点需要很长时间

时间:2017-08-10 16:18:49

标签: performance neo4j cypher database-performance neo4j-apoc

我的图表包含以下内容:

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

这不仅限于两个客户,但深度不超过5.还存在以下情况:

(:顾客) - [:匹配] - >(:AuditCustomer)

有一个标签:Master需要根据某些条件添加到匹配集中的一个客户节点。

因此,我的查询需要找到所有匹配客户的集合,其中没有标签主,并将该标签添加到集合中的一个节点。有大量的客户节点并且一次性完成所有操作会导致数据库变得非常慢。

我试图使用apoc.periodic.com发送:

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})

然而,即使limit参数设置为1,这仍会导致数据库变得非常慢。我读到apoc.periodic.commit是一个阻塞过程,所以这可能会导致问题。有没有办法做到这一点,资源不是那么密集,DB可以在运行时继续处理其他事务?

查询中最慢的部分是初始匹配:

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)

0 个答案:

没有答案