簡體   English   中英

如何使用 Cypher 遞歸更新項目計划圖

[英]How to recursively update a Project Planning Graph with Cypher

我指的是這個graphgist: https ://neo4j.com/graphgist/project-management 當一項任務的持續時間發生變化時,我實際上是在嘗試更新項目計划。

在GraphGist中,整個項目總是從初始活動到最后一個活動計算。 在我不知道起點是什么,也不知道終點是什么的多項目環境中,這對我來說不是很好。 我現在想要的只是更新任何依賴於我剛剛更新的任務的活動的最早開始時間。

我的最新情況如下:

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

目的是獲取依賴於我剛剛更新的任務的項目中的所有路徑(在這種情況下:“執行需求分析”),也在路徑的每一步我檢查是否有其他依賴項將覆蓋我的持續時間更新。

所以,當然它只適用於直接連接。

如果我有 A<-[:requires]-B<-[:requires]-C 如果我增加持續時間 A,我相信它會根據 A 更新 B,但是然后在更新 B 持續時間之前用 B 的持續時間計算 C .

我怎樣才能使這個遞歸? 也許使用減少?

(仍在搜索中...)

這是一個非常有趣的問題。

您想要更新距離最初更新的節點 1 步的節點,然后更新距離 2 步的節點(適當地合並先前更新的值),然后再更新 3 步,依此類推,直到每個節點都可以從原始節點到達節點已更新。

Cypher 規划器不會生成執行這種查詢/更新模式的代碼,其中新值通過路徑逐步傳播。

但是,有一個使用 APOC 插件的解決方法。 例如,使用apoc.periodic.iterate

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

傳遞給過程的第一個 Cypher 語句生成task節點,按與原始節點的距離排序。 第二個 Cypher 語句獲取每個taskpre節點,並為該task設置適當的earliest_start值。 batchSize:1選項告訴過程在其自己的事務中執行第二個語句的每次迭代,以便后續迭代將看到更新的值。

注意:如果可以在不同距離多次遇到相同的task ,您必須確定這種方法是否適合您。 此外,您不能同時將其他操作寫入數據庫,因為這可能導致結果不一致。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM