Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j 如何使用Cypher递归更新项目计划图_Neo4j_Cypher - Fatal编程技术网

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