首页 > 解决方案 > 如何使用 Neo4j Cypher APOC 并行处理

问题描述

我们有很多 (n1:EffortUser)-[r1:EFFORT]->(n2:EffortObject) 需要按日和周统计,即有多少 EffortObject:Email 发送了 EffortUser。如果您有很多用户和电子邮件,这可能需要相当长的时间,所以我们希望并行化此查询。

现在我们正在使用:

match(n1:EffortUser)-[r1:EFFORT]-(n2:EffortObject) 
where r1.Effort = 'yes' and r1.TimeEvent>='2017-01-01' and r1.TimeEvent<='2017-12-31'
return distinct n1.Name as User, date(datetime(r1.TimeEvent)) as date, count(distinct r1.IdUnique) as count
order by user, date

似乎有一些选项可以并行化/优化它,但所有的文档都很少。

我做了一些研究,发现了以下 APOC 函数,但尽我所能,我无法让它们工作(而且我在 Stackoverflow 上也找不到很多东西)。以下哪个选项是最好的,包括。使用上述示例代码的示例?这让我发疯。我们有 4 个内核和 32 GB 内存,所以它应该运行得很快,但我就是无法让它工作。

https://neo4j.com/docs/labs/apoc/current/cypher-execution/

CALL apoc.cypher.runMany('cypher;\nstatements;',{params},{config})

运行每个分号分隔的语句并返回摘要 - 目前没有模式操作

CALL apoc.cypher.mapParallel(fragment, params, list-to-parallelize) yield value

并行批处理执行片段,并将列表段分配给_

https://neo4j.com/docs/labs/apoc/current/cypher-execution/running-cypher/

apoc.cypher.mapParallel(fragment :: STRING?, params :: MAP?, list :: LIST? OF ANY?) :: (value :: MAP?)

apoc.cypher.mapParallel(fragment, params, list-to-parallelize) yield value - 以并行批次执行片段,并将列表段分配给_

apoc.cypher.mapParallel2(fragment :: STRING?, params :: MAP?, list :: LIST? OF ANY?, partitions :: INTEGER?, timeout = 10 :: INTEGER?) :: (value :: MAP?)

apoc.cypher.mapParallel2(fragment, params, list-to-parallelize) yield value - 以并行批次执行片段,并将列表段分配给_

apoc.cypher.parallel(fragment :: STRING?, params :: MAP?, parallelizeOn :: STRING?) :: (value :: MAP?)

apoc.cypher.parallel2(fragment :: STRING?, params :: MAP?, parallelizeOn :: STRING?) :: (value :: MAP?)

apoc.cypher.runMany(cypher :: STRING?, params :: MAP?, config = {} :: MAP?) :: (row :: INTEGER?, result :: MAP?)

apoc.cypher.runMany('cypher;\nstatements;',{params},[{statistics:true,timeout:10}]) - 运行每个分号分隔的语句并返回摘要 - 目前没有模式操作

标签: neo4jparallel-processingcypherneo4j-apoc

解决方案


推荐阅读