2017-09-22 283 views
0

☼你好!Neo4j:創建一個遞歸查詢/函數

我想要得到一個活動列表的關鍵路徑,但通過Neo4j。

爲此,我需要最早的時間(開始和結束)。活動的最早開始等於其前任的最早開始,依此類推。

我已經有一些「工作」。但我的問題是,我只需要「回想起功能」。我可以用手往下走,但我不能這樣做下去......

Activity List

這裏是我的代碼:

// LEVEL 1 
/****** collect (start.successors) as startSucessors *****/ 
MATCH (project:Project)-[:CONTAINS]->(:Activity{tag:'Start'})-[s:ENABLES]->(:Activity) 
WHERE ID(project)=toInteger(322) 
WITH collect(endNode(s)) AS startSuccessors 
    /**** foreach node in startSucessors ****/ 
    UNWIND startSuccessors AS node 
    /**** collect (node.predecessors) as nodePredecessors ****/ 
     MATCH (activity:Activity)-[p:ENABLES]->(node) 
     WITH collect(startNode(p)) AS nodePredecessors, node, startSuccessors 
      /**** foreach activity in nodePredecessors ****/ 
      UNWIND nodePredecessors AS activity 
       /**** IF (node.ES is null OR node.ES < activity.EF) ****/ 
       WITH node, activity, startSuccessors,(node.ES = 0) AS cond1, (node.ES < activity.EF) AS cond2 
       MERGE (activity)-[:ENABLES]->(node) 
       ON MATCH SET node.ES = 
        CASE 
        /**if**/ WHEN cond1 OR cond2 
        /**node.ES = activity.EF**/ THEN activity.EF 
         END 
       ON MATCH SET node.EF = node.ES + node.ET 
    // LEVEL 2 
    /**T.O.D.O. : loop for each node in startSuccessors and their nodes **/ 
    WITH startSuccessors 
    UNWIND startSuccessors AS node 
     MERGE (node)-[s2:ENABLES]->(successor:Activity) 
     WITH collect(successor) AS nodeSuccessors,node 
     UNWIND nodeSuccessors AS successor 
      CREATE UNIQUE (act:Activity)-[p2:ENABLES]->(successor) 
      WITH successor, node,act, (successor.ES = 0) AS cond3, (successor.ES < act.EF) AS cond4 
      MERGE (act)-[p2:ENABLES]->(successor) 
      ON MATCH SET successor.ES = 
        CASE 
        /**if**/ WHEN cond3 OR cond4 
        /**node.ES = activity.EF**/ THEN act.EF 
         END 
       ON MATCH SET successor.EF = successor.ES + successor.ET 

下面是結果 Earliest Times Query Result

第二個問題是,如果我重新運行查詢,ES和EF屬性消失...(在下面證明)

Problem when rerunning the query

要修復這個問題,我必須運行此查詢:

MATCH (p:Project) WHERE ID(p)=322 
MATCH (p)-[:CONTAINS]->(one:Activity{tag:'one'}),(p)-[:CONTAINS]->(zrht:Activity{tag:'zrht'}),(p)-[:CONTAINS]->(ore:Activity{tag:'ore'}),(p)-[:CONTAINS]->(bam:Activity{tag:'bam'}),(p)-[:CONTAINS]->(two:Activity{tag:'two'}) 
SET one.EF = 0,one.ES = 0,one.LF=0,one.LS=0,zrht.EF = 0,zrht.ES = 0,zrht.LF=0,zrht.LS=0,ore.EF = 0,ore.ES = 0,ore.LF=0,ore.LS=0,bam.EF = 0,bam.ES = 0,bam.LF=0,bam.LS=0,two.EF = 0,two.ES = 0,two.LF=0,two.LS=0 

javascript code達到了我想要做的。

非常感謝您的幫助。

回答