Neo4j 如何使用Cypher递归更新项目计划图
我指的是这个图表: 当一项任务的持续时间发生变化时,我实际上正在尝试更新项目计划 在图表列表中,整个项目始终从初始活动计算到最后一个活动。在一个多项目的环境中,我不知道起点是什么,也不知道终点。我现在想要的只是更新任何活动的最早开始,这取决于我刚刚更新的任务 我最新的资料如下:Neo4j 如何使用Cypher递归更新项目计划图,neo4j,cypher,Neo4j,Cypher,我指的是这个图表: 当一项任务的持续时间发生变化时,我实际上正在尝试更新项目计划 在图表列表中,整个项目始终从初始活动计算到最后一个活动。在一个多项目的环境中,我不知道起点是什么,也不知道终点。我现在想要的只是更新任何活动的最早开始,这取决于我刚刚更新的任务 我最新的资料如下: MATCH p1=(:Activity {description:'Perform needs analysis'})<-[:REQUIRES*]-(j:Activity) UNWIND nodes(p1) as
MATCH p1=(:Activity {description:'Perform needs analysis'})<-[:REQUIRES*]-(j:Activity)
UNWIND nodes(p1) as task
MATCH (pre:Activity)<-[:REQUIRES]-(task:Activity)
WITH MAX(pre.duration+pre.earliest_start) as updateEF,task
SET task.earliest_start = updateEF
MATCH p1=(:Activity{description:'Perform needs analysis'})这是一个非常有趣的问题
您希望更新距离原始更新节点1步远的节点,然后更新距离2步远的节点(根据需要合并以前更新的值),然后更新距离3步远的节点,依此类推,直到从原始节点可以访问的每个节点都已更新
Cypher planner不会生成执行这种查询/更新模式的代码,在这种模式下,新值会通过路径逐步传播
然而,使用APOC插件有一个解决办法。例如,使用:
调用apoc.periodic.iterate(
“匹配p=(:活动{description:'Perform needs analysis'})仅供参考:与graphgist相比,这种关系是相反的,但语义不同,这不应该是一个问题。这可能是一个关于Neo4j社区网站共享的好问题:我刚刚做了一些测试,效果很好。我会尝试在更大的项目中运行它。ThxAlso,我相信我们会寻找更具可扩展性的东西。它会有用的k,但一个项目中有10万个任务,这可能不是最好的方法。我在社区网站上看到了另一个答案。我的感觉是,计算所有更新的任务,然后全部更新是可行的。我只想确保这是在一次调用neo4J中完成的。
CALL apoc.periodic.iterate(
"MATCH p=(:Activity {description:'Perform needs analysis'})<-[:REQUIRES*]-(task:Activity)
RETURN task ORDER BY LENGTH(p)",
"MATCH (pre:Activity)<-[:REQUIRES]-(task)
WITH MAX(pre.duration+pre.earliest_start) as updateEF, task
SET task.earliest_start = updateEF",
{batchSize:1})