2017-09-22 1 views
0

☼ Bonjour!Neo4j: crée une requête/fonction récursive

Je veux obtenir le chemin critique d'une liste d'activités, mais à travers Neo4j.

Pour cela, j'ai besoin des temps les plus anciens (début et fin). Le début le plus tôt d'une activité est égal à la plus grande finalité la plus ancienne de ses prédécesseurs, et ainsi de suite.

J'avais déjà quelque chose qui "fonctionnait". Mais mon problème est que j'ai juste besoin de "rappeler la fonction". Je peux par la main, mais je ne peux pas le faire indéfiniment ...

Le Activity List

Voici mon code:

// 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 

Voici le résultat Earliest Times Query Result

Le deuxième problème est que si je réexécute la requête, les propriétés ES et EF disparaissent ... (prouver ci-dessous)

Problem when rerunning the query

Pour réparer cela, je dois exécuter cette requête:

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 

Ce javascript code atteint ce que je veux faire.

Merci beaucoup pour votre aide.

Répondre

1

☼ J'ai finalement trouvé ce que je cherchais: Project Management with Neo4j

dans l'espoir qu'il aidera les autres à trouver un moyen plus rapide;)