如何使用 Neo4j Cypher APOC 并行处理

Chr*_*ens 5 parallel-processing neo4j cypher neo4j-apoc

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

现在我们正在使用:

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
Run Code Online (Sandbox Code Playgroud)

似乎有几个选项可以并行化/优化它,但所有的文档都相当糟糕。

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

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

CALL apoc.cypher.runMany('cypher;\nstatements;',{params},{config})
Run Code Online (Sandbox Code Playgroud)

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

CALL apoc.cypher.mapParallel(fragment, params, list-to-parallelize) yield value
Run Code Online (Sandbox Code Playgroud)

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

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

apoc.cypher.mapParallel(fragment :: STRING?, params :: MAP?, list :: LIST? OF ANY?) :: (value :: MAP?)
Run Code Online (Sandbox Code Playgroud)

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?)
Run Code Online (Sandbox Code Playgroud)

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?)
Run Code Online (Sandbox Code Playgroud)

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