// Comprehensive Data Generation Script // This script deletes all existing data, creates JobTypes from the provided list, // generates multiple Job instances for each type, and wires them into different scenarios. // 1. Clean up the database MATCH (n) DETACH DELETE n; // 2. Create Indexes CREATE INDEX ON :JobType(id); CREATE INDEX ON :Job(id); CREATE INDEX ON :Scenario(id); // 3. Create JobType Nodes from the provided examples UNWIND [ {id: 'JOB1', name: '전단면굴착1#제어발파_굴진장3m초과발파'}, {id: 'JOB2', name: '막장면1#시공계획서작성'}, {id: 'JOB3', name: '막장면1#시공측량'}, {id: 'JOB4', name: '막장면1#측점검측'}, {id: 'JOB5', name: '막장면1#암판정시행'}, {id: 'JOB6', name: '막장면1#천공준비'}, {id: 'JOB7', name: '막장면1#막장면천공'}, {id: 'JOB8', name: '막장면1#막장면천공시행'}, {id: 'JOB9', name: '전단면굴착1#발파준비'}, {id: 'JOB10', name: '전단면굴착1#발파작업'}, {id: 'JOB11', name: '전단면굴착1#환기시행'}, {id: 'JOB12', name: '전단면굴착1#측량및마킹'}, {id: 'JOB13', name: '버력1#버력처리'}, {id: 'JOB14', name: '버력1#부석정리'}, {id: 'JOB15', name: '버력1#버력처리준비'}, {id: 'JOB16', name: '버력1#버력처리시행'}, {id: 'JOB17', name: '버력1#부석제거뒷정리'}, {id: 'JOB18', name: '버력1#운반차입환'}, {id: 'JOB19', name: '강섬유보강숏크리트1#본선부설치'}, {id: 'JOB20', name: '강섬유보강숏크리트1#뜬돌제거'}, {id: 'JOB21', name: '강섬유보강숏크리트1#측량및여굴량확인'}, {id: 'JOB22', name: '강섬유보강숏크리트1#Sealing시행'}, {id: 'JOB23', name: '강섬유보강숏크리트1_1#본선부설치'}, {id: 'JOB24', name: '강섬유보강숏크리트1_1#타설준비'}, {id: 'JOB25', name: '강섬유보강숏크리트1_1#바닥정리및면정리'}, {id: 'JOB26', name: '강섬유보강숏크리트1_1#뿜어붙이기'}, {id: 'JOB27', name: '강섬유보강숏크리트1_1#잔재제거'}, {id: 'JOB28', name: '강섬유보강숏크리트1_1#장비점검'}, {id: 'JOB29', name: '전단면굴착2#제어발파_굴진장3m초과발파'} ] AS jt CREATE (:JobType {id: jt.id, name: jt.name, base_duration: 10 + toInteger(substring(jt.id, 3)), base_cost: 100 + (10 * toInteger(substring(jt.id, 3)))}); // 4. Create PRECEDES relationships between JobTypes (The "Absolute Rules") UNWIND [ {from: 'JOB2', to: 'JOB3'}, {from: 'JOB3', to: 'JOB4'}, {from: 'JOB4', to: 'JOB5'}, {from: 'JOB5', to: 'JOB6'}, {from: 'JOB6', to: 'JOB7'}, {from: 'JOB7', to: 'JOB8'}, {from: 'JOB8', to: 'JOB9'}, {from: 'JOB9', to: 'JOB10'}, {from: 'JOB10', to: 'JOB11'}, {from: 'JOB11', to: 'JOB12'}, {from: 'JOB12', to: 'JOB13'}, {from: 'JOB12', to: 'JOB14'}, // Fork {from: 'JOB14', to: 'JOB15'}, {from: 'JOB15', to: 'JOB16'}, {from: 'JOB16', to: 'JOB17'}, {from: 'JOB17', to: 'JOB18'}, {from: 'JOB18', to: 'JOB19'}, {from: 'JOB18', to: 'JOB20'}, // Fork {from: 'JOB20', to: 'JOB21'}, {from: 'JOB21', to: 'JOB22'}, {from: 'JOB22', to: 'JOB23'}, {from: 'JOB22', to: 'JOB24'}, // Fork {from: 'JOB24', to: 'JOB25'}, {from: 'JOB25', to: 'JOB26'}, {from: 'JOB26', to: 'JOB27'}, {from: 'JOB27', to: 'JOB28'}, {from: 'JOB28', to: 'JOB29'} ] AS rel MATCH (from:JobType {id: rel.from}), (to:JobType {id: rel.to}) CREATE (from)-[:PRECEDES]->(to); // 5. Generate Job Instances (e.g., 2 instances per JobType) MATCH (jt:JobType) UNWIND range(1, 2) AS i CREATE (:Job { id: jt.id + '-' + i, name: jt.name + ' (Instance ' + i + ')', base_duration: jt.base_duration, base_cost: jt.base_cost })-[:IS_A]->(jt); // 6. Create Scenarios // Scenario A: Simple Linear Process (Always use instance 1) CREATE (:Scenario {id: 'linear-process', description: '단순 순차 공정 시나리오'}); MATCH (from_jt:JobType)-[:PRECEDES]->(to_jt:JobType) MATCH (from_j:Job {id: from_jt.id + '-1'}), (to_j:Job {id: to_jt.id + '-1'}) CREATE (from_j)-[:PRECEDES {scenario: 'linear-process'}]->(to_j); // Scenario B: Parallel Process (Use instance 2 and model forks) CREATE (:Scenario {id: 'parallel-process', description: '병렬 공정 시나리오'}); MATCH (from_jt:JobType)-[:PRECEDES]->(to_jt:JobType) MATCH (from_j:Job {id: from_jt.id + '-2'}), (to_j:Job {id: to_jt.id + '-2'}) CREATE (from_j)-[:PRECEDES {scenario: 'parallel-process'}]->(to_j); // Add a specific modification for a scenario to test delta logic CREATE (:Scenario {id: 'what-if-parallel', description: '병렬 공정 중 JOB16 지연 가정'})-[:MODIFIES {new_duration: 99}]->(:Job {id: 'JOB16-2'});