Use Case #02 • Neo4j SafetyGraph

Surveillance Intelligente des Espaces Confinés

🚨 Catégorie : Espaces Confinés | Surveillance Atmosphérique | Gestion des Permis d'Entrée

Question Métier

"Quels espaces confinés présentent des conditions atmosphériques dangereuses en temps réel, avec des permis d'entrée actifs, et quels sont les travailleurs actuellement à l'intérieur nécessitant une surveillance prioritaire ou une évacuation immédiate ?"

🏭 Contexte Opérationnel

Type de site : Sites avec espaces confinés (réservoirs, silos, citernes, égouts, tunnels, cuves, tranchées profondes, pipelines)

Données sources :

  • Capteurs atmosphériques IoT temps réel (O₂, CO, H₂S, CH₄, LEL/UEL)
  • Permis d'entrée en espace confiné (Entry Permits)
  • Présence et localisation des travailleurs (badges RFID, géolocalisation)
  • Équipements de ventilation et surveillance (status, débits d'air)
  • Historique d'incidents en espaces confinés
  • Certifications et formations spécifiques (rescue, gas detection, SCBA)
  • Équipes de secours et sauvetage (disponibilité, proximité)

Acteurs impliqués :

  • Superviseurs d'entrée (Entry Supervisors) et surveillants (Attendants)
  • Travailleurs autorisés (Authorized Entrants)
  • Équipes de secours en espace confiné (Rescue Teams)
  • Gestionnaires de permis et coordinateurs HSE
  • Agents AI de surveillance (AtmosphereAI, PermitAI, RescueAI)

🔷 Schéma du Graphe SafetyGraph

Visualisation des entités et relations pour la surveillance des espaces confinés :

HAS_SPACE REQUIRES_PERMIT OCCUPIED_BY MONITORED_BY HAS_VENTILATION READS CERTIFIED RESCUE_BY Project :Project Confined Space :ConfinedSpace Entry Permit Worker :Worker Sensor :Sensor Ventilation :Asset Reading :Reading Certification :Cert Rescue Team Légende : Espaces & Alertes Permis & Secours Surveillance IoT

🔄 Flow d'Analyse de la Requête

1

🎯 Identification Espaces Confinés

MATCH (proj:Project)-[:HAS_SPACE]->(cs:ConfinedSpace)

Filtrage: type = 'confined', status = 'active'
2

📊 Analyse Atmosphérique Temps Réel

Collecte lectures capteurs IoT (O₂, CO, H₂S, LEL) - 15 dernières minutes

Alerte: O₂ < 19.5% ou gaz toxiques > seuils OSHA
3

📋 Vérification Permis d'Entrée Actifs

Validation permis confined_space_entry avec expirations

Status: active + non expiré
4

👷 Détection Présence Travailleurs

Identification workers INSIDE espaces via RFID/GPS

Priorité: travailleurs exposés conditions dangereuses
5

🛡️ Vérification Équipements Protection

Status ventilation, détecteurs gaz, équipements secours

Défaillance ventilation = risque amplifié
6

🚨 Calcul Criticité & Classification

Évaluation multi-factorielle du danger immédiat

criticalityScore = (atmosAlerts × 5) + (workersInside × 3) + (ventFailure × 4) + (noPermit × 2)
7

🎯 Priorisation Actions & Alertes

Génération protocoles évacuation et notifications urgentes

≥20: ÉVACUATION IMMÉDIATE ≥12: SURVEILLANCE CRITIQUE ≥6: ATTENTION

⚙️ Requête Cypher Neo4j Complète

SafetyGraph Query - Confined Space Atmospheric Monitoring Cypher
// ═══════════════════════════════════════════════════════════════════════════
// USE CASE #02 : Surveillance Intelligente Espaces Confinés
// Objectif : Détecter conditions atmosphériques dangereuses temps réel
// Criticité : MAXIMALE - Risque asphyxie, intoxication, explosion
// Normes : OSHA 1910.146 | CNESST Art. 297-310 | CSA Z1006
// ═══════════════════════════════════════════════════════════════════════════

// 🎯 ÉTAPE 1 : IDENTIFICATION DES ESPACES CONFINÉS ACTIFS
MATCH (proj:Project {id: $projectId})
      -[:HAS_SPACE]->(cs:ConfinedSpace)
WHERE cs.status = 'active'
  AND cs.requiresPermit = true

// ─────────────────────────────────────────────────────────────────────────
// 📊 ÉTAPE 2 : ANALYSE ATMOSPHÉRIQUE TEMPS RÉEL (IoT)
// Paramètres critiques surveillés :
//   • O₂ (oxygène)        : 19.5% - 23.5% (OSHA range sécuritaire)
//   • CO (monoxyde)       : < 35 ppm (TWA 8h)
//   • H₂S (sulfure hydrog): < 10 ppm (ceiling limit)
//   • LEL (explosivité)   : < 10% (Lower Explosive Limit)
//   • CH₄ (méthane)       : < 5% volume
// ─────────────────────────────────────────────────────────────────────────
OPTIONAL MATCH (cs)-[:MONITORED_BY]->(sensor:Sensor)
               -[:READS]->(reading:Reading)
WHERE sensor.category IN ['atmospheric', 'gas_detector', 'oxygen_monitor']
  AND reading.timestamp >= datetime() - duration({minutes: $recentMinutes})  // Default: 15 min

// 🚨 Détection des conditions dangereuses
WITH cs, sensor,
     collect(reading) AS readings,
     
     // Compteurs d'alertes atmosphériques
     size([r IN collect(reading) 
          WHERE r.gasType = 'O2' AND (r.value < 19.5 OR r.value > 23.5)]) AS oxygenAlerts,
     
     size([r IN collect(reading) 
          WHERE r.gasType = 'CO' AND r.value > 35]) AS coAlerts,
     
     size([r IN collect(reading) 
          WHERE r.gasType = 'H2S' AND r.value > 10]) AS h2sAlerts,
     
     size([r IN collect(reading) 
          WHERE r.gasType = 'LEL' AND r.value > 10]) AS lelAlerts,
     
     // Agrégation totale des alertes atmosphériques
     size([r IN collect(reading) 
          WHERE (r.gasType = 'O2' AND (r.value < 19.5 OR r.value > 23.5))
             OR (r.gasType = 'CO' AND r.value > 35)
             OR (r.gasType = 'H2S' AND r.value > 10)
             OR (r.gasType = 'LEL' AND r.value > 10)]) AS totalAtmosAlerts

// ─────────────────────────────────────────────────────────────────────────
// 📋 ÉTAPE 3 : VÉRIFICATION PERMIS D'ENTRÉE EN ESPACE CONFINÉ
// Conformité : Permis valide + non expiré + autorisations à jour
// ─────────────────────────────────────────────────────────────────────────
OPTIONAL MATCH (cs)<-[:APPLIES_TO]-(permit:EntryPermit)
WHERE permit.type = 'confined_space_entry'
  AND permit.status = 'active'
  AND permit.expiryTime > datetime()

WITH cs, readings, oxygenAlerts, coAlerts, h2sAlerts, lelAlerts, totalAtmosAlerts,
     count(permit) AS validPermits,
     collect(permit) AS permits

// ─────────────────────────────────────────────────────────────────────────
// 👷 ÉTAPE 4 : DÉTECTION PRÉSENCE & LOCALISATION TRAVAILLEURS
// Tracking : RFID badges, GPS, systèmes d'accès (entry/exit logs)
// ─────────────────────────────────────────────────────────────────────────
OPTIONAL MATCH (cs)<-[:CURRENTLY_IN]-(worker:Worker)
WHERE worker.status = 'active'
  AND worker.lastSeen >= datetime() - duration({minutes: 10})  // Présence récente

// Vérification certifications confined space
OPTIONAL MATCH (worker)-[:HAS_CERTIFICATION]->(cert:Certification)
WHERE cert.type IN ['confined_space_entry', 'gas_detection', 'rescue', 'SCBA']
  AND cert.expiryDate > datetime()

WITH cs, readings, oxygenAlerts, coAlerts, h2sAlerts, lelAlerts, 
     totalAtmosAlerts, validPermits, permits,
     count(DISTINCT worker) AS workersInside,
     collect(DISTINCT worker) AS workerList,
     count(DISTINCT cert) AS certifiedCount

// ─────────────────────────────────────────────────────────────────────────
// 🛡️ ÉTAPE 5 : VÉRIFICATION ÉQUIPEMENTS VENTILATION & SECOURS
// Systèmes critiques : Ventilation forcée, détecteurs portatifs, SCBA
// ─────────────────────────────────────────────────────────────────────────
OPTIONAL MATCH (cs)-[:HAS_VENTILATION]->(vent:Asset)
WHERE vent.category IN ['ventilation', 'air_mover', 'blower']

OPTIONAL MATCH (cs)-[:ASSIGNED_RESCUE]->(rescue:RescueTeam)
WHERE rescue.status = 'available'
  AND rescue.responseTime <= $maxResponseMinutes  // Default: 4 minutes (OSHA)

WITH cs, readings, oxygenAlerts, coAlerts, h2sAlerts, lelAlerts,
     totalAtmosAlerts, validPermits, workersInside, workerList, certifiedCount,
     count(vent) AS ventilationUnits,
     size([v IN collect(vent) WHERE v.status = 'operational']) AS operationalVent,
     count(rescue) AS rescueTeamsAvailable

// ─────────────────────────────────────────────────────────────────────────
// 🚨 ÉTAPE 6 : CALCUL DU SCORE DE CRITICITÉ MULTI-FACTORIEL
// Algorithme pondéré basé sur :
//   • Alertes atmosphériques    : × 5.0  (danger mortel immédiat)
//   • Travailleurs exposés       : × 3.0  (vies en danger)
//   • Défaillance ventilation    : × 4.0  (aggravation rapide)
//   • Absence permis valide      : × 2.0  (non-conformité critique)
//   • Absence équipe secours     : × 2.5  (capacité rescue compromise)
// ─────────────────────────────────────────────────────────────────────────
WITH cs, readings, oxygenAlerts, coAlerts, h2sAlerts, lelAlerts,
     totalAtmosAlerts, validPermits, workersInside, workerList,
     ventilationUnits, operationalVent, rescueTeamsAvailable,
     
     // 🧮 Calcul score de criticité
     (totalAtmosAlerts * 5.0) +
     (workersInside * 3.0) +
     (CASE WHEN operationalVent = 0 THEN 4.0 ELSE 0 END) +
     (CASE WHEN validPermits = 0 THEN 2.0 ELSE 0 END) +
     (CASE WHEN rescueTeamsAvailable = 0 THEN 2.5 ELSE 0 END) 
     AS criticalityScore

WHERE criticalityScore >= $minCriticalityThreshold  // Default: 5.0

// ─────────────────────────────────────────────────────────────────────────
// 🎯 ÉTAPE 7 : STRUCTURATION ET PRIORISATION DES RÉSULTATS
// Classification urgence : IMMÉDIATE (≥20) | CRITIQUE (≥12) | ÉLEVÉE (≥6)
// ─────────────────────────────────────────────────────────────────────────
RETURN
  // 📍 Identification espace confiné
  cs.id AS spaceId,
  cs.name AS spaceName,
  cs.type AS spaceType,  // tank, silo, sewer, vault, etc.
  cs.volume AS volumeCubicMeters,
  cs.location AS coordinates,
  
  // 🚨 Score et classification urgence
  round(criticalityScore, 2) AS criticalityScore,
  CASE
    WHEN criticalityScore >= 20 THEN 'IMMÉDIATE'    // 🔴 Évacuation NOW
    WHEN criticalityScore >= 12 THEN 'CRITIQUE'     // 🟠 Surveillance max
    WHEN criticalityScore >= 6 THEN 'ÉLEVÉE'       // 🟡 Attention soutenue
    ELSE 'ATTENTION'                          // 🔵 Monitoring standard
  END AS urgencyLevel,
  
  // 📊 Détails alertes atmosphériques
  totalAtmosAlerts,
  oxygenAlerts AS oxygenDeficiency,
  coAlerts AS carbonMonoxideAlerts,
  h2sAlerts AS hydrogenSulfideAlerts,
  lelAlerts AS explosiveAtmosphereAlerts,
  
  // 👷 Personnel exposé
  workersInside,
  [w IN workerList | {
    id: w.id, 
    name: w.name, 
    entryTime: w.entryTimestamp,
    durationInside: duration.between(w.entryTimestamp, datetime()).minutes
  }] AS workersAtRisk,
  
  // 📋 Conformité permis
  validPermits,
  CASE WHEN validPermits > 0 THEN true ELSE false END AS hasValidPermit,
  
  // 🛡️ État systèmes protection
  ventilationUnits,
  operationalVent,
  CASE WHEN operationalVent > 0 THEN true ELSE false END AS ventilationOperational,
  rescueTeamsAvailable,
  
  // ⏰ Horodatage analyse
  datetime() AS analysisTimestamp,
  
  // 🎯 Actions recommandées immédiates
  CASE
    WHEN criticalityScore >= 20 THEN ['ÉVACUATION IMMÉDIATE', 'ALERTER RESCUE TEAM', 'BLOQUER ACCÈS']
    WHEN criticalityScore >= 12 THEN ['SURVEILLANCE CONTINUE', 'PRÉPA ÉVACUATION', 'VENTILATION MAX']
    WHEN criticalityScore >= 6 THEN ['INTENSIFIER MONITORING', 'VÉRIFIER ÉQUIPEMENTS', 'BRIEFING SÉCURITÉ']
    ELSE ['CONTINUER SURVEILLANCE', 'LOGS ATMOSPHÉRIQUES']
  END AS recommendedActions

// 🎯 Tri par criticité décroissante
ORDER BY criticalityScore DESC, workersInside DESC
LIMIT $maxResults

// ═══════════════════════════════════════════════════════════════════════════
// 📌 RÉSULTAT : Espaces confinés critiques nécessitant intervention immédiate
// 🔄 FRÉQUENCE : Exécution en temps réel (1-2 minutes) ou déclenchée par IoT
// 🤖 AGENTS CIBLES : AtmosphereAI, RescueAI, PermitAI, EmergencyAI
// 📡 INTÉGRATIONS : Systèmes d'alarme, protocoles évacuation, dispatch secours
// ═══════════════════════════════════════════════════════════════════════════

🎛️ Paramètres Clés

$projectId
Type: String
Exemple: "PROJ-2025-REFINERY-001"
Identifiant unique du projet ou site industriel
$recentMinutes
Type: Integer
Unité: Minutes
Valeur par défaut: 15
Fenêtre temporelle pour lectures capteurs (temps réel)
$maxResponseMinutes
Type: Integer
Unité: Minutes
Valeur par défaut: 4
Temps de réponse maximal équipe secours (OSHA 1910.146)
$minCriticalityThreshold
Type: Float
Valeur par défaut: 5.0
Score minimum pour déclencher une alerte
$maxResults
Type: Integer
Valeur par défaut: 50
Nombre maximum d'espaces critiques à retourner
Seuils Atmosphériques
O₂: 19.5% - 23.5% (OSHA)
CO: < 35 ppm (TWA 8h)
H₂S: < 10 ppm (ceiling)
LEL: < 10% (explosivité)
CH₄: < 5% volume

📤 Sortie Attendue & Exemple de Résultat

Structure des Données Retournées

  • spaceId / spaceName / spaceType : Identification complète de l'espace confiné
  • criticalityScore : Score de criticité multi-factoriel (0-50+)
  • urgencyLevel : Classification (IMMÉDIATE / CRITIQUE / ÉLEVÉE / ATTENTION)
  • totalAtmosAlerts : Nombre total d'alertes atmosphériques actives
  • oxygenDeficiency / coAlerts / h2sAlerts / lelAlerts : Détail par type de gaz
  • workersInside / workersAtRisk : Personnel exposé avec durée d'exposition
  • hasValidPermit : Conformité permis d'entrée (boolean)
  • ventilationOperational : État des systèmes de ventilation
  • rescueTeamsAvailable : Nombre d'équipes de secours disponibles
  • recommendedActions : Actions immédiates à entreprendre

📋 Exemple de Résultat JSON - Situation CRITIQUE

Alerte espace confiné : déficience oxygène + H₂S détecté JSON
{
  "spaceId": "CS-TANK-402-WEST",
  "spaceName": "Réservoir 402 - Section Ouest",
  "spaceType": "storage_tank",
  "volumeCubicMeters": 150,
  "coordinates": { "lat": 45.5234, "lon": -73.5987 },
  
  // 🚨 CRITICITÉ MAXIMALE
  "criticalityScore": 26.5,
  "urgencyLevel": "IMMÉDIATE",  // 🔴 ÉVACUATION REQUISE
  
  // 📊 Alertes atmosphériques (4 alertes × 5.0 = 20 pts)
  "totalAtmosAlerts": 4,
  "oxygenDeficiency": 2,       // ⚠️ O₂ = 17.8% (< 19.5%)
  "carbonMonoxideAlerts": 0,
  "hydrogenSulfideAlerts": 2,  // ☠️ H₂S = 18 ppm (> 10 ppm)
  "explosiveAtmosphereAlerts": 0,
  
  // 👷 Personnel en danger (2 workers × 3.0 = 6 pts)
  "workersInside": 2,
  "workersAtRisk": [
    {
      "id": "W-4527",
      "name": "Jean Tremblay",
      "entryTime": "2025-11-04T14:15:00Z",
      "durationInside": 22  // minutes - LIMITE DÉPASSÉE
    },
    {
      "id": "W-3891",
      "name": "Marc Leblanc",
      "entryTime": "2025-11-04T14:15:00Z",
      "durationInside": 22
    }
  ],
  
  // 📋 Conformité permis (0 pts - permis valide présent)
  "validPermits": 1,
  "hasValidPermit": true,
  
  // 🛡️ Systèmes protection (ventilation OK = 0 pts)
  "ventilationUnits": 2,
  "operationalVent": 2,
  "ventilationOperational": true,
  "rescueTeamsAvailable": 1,  // ✅ Équipe prête
  
  "analysisTimestamp": "2025-11-04T14:37:12Z",
  
  // 🎯 ACTIONS IMMÉDIATES
  "recommendedActions": [
    "ÉVACUATION IMMÉDIATE",
    "ALERTER RESCUE TEAM",
    "BLOQUER ACCÈS"
  ]
}

// 🧮 Calcul du score de criticité :
// (4 alertes × 5.0) + (2 workers × 3.0) + (0 × 4.0) + (0 × 2.0) + (0 × 2.5)
// = 20.0 + 6.0 + 0 + 0 + 0 = 26.5 → IMMÉDIATE ⚠️⚠️⚠️

🎯 Utilisation opérationnelle :

  • Alertes temps réel IoT : Déclenchement automatique protocoles évacuation via capteurs atmosphériques
  • Dashboard Emergency Response : Visualisation carte thermique dangers + localisation travailleurs
  • Dispatch équipes secours : Activation automatique rescue teams avec briefing situation
  • Blocage d'accès : Verrouillage électronique entrées espaces confinés critiques
  • Communication d'urgence : Notifications push superviseurs + alarmes sonores sur site
  • Traçabilité réglementaire : Logs complets pour audits OSHA 1910.146 / CNESST

⚙️ Matrice d'Urgence & Protocoles

🔴 IMMÉDIATE
Score ≥ 20
Protocole d'évacuation : Évacuation immédiate • Activation rescue team • Blocage accès • Ventilation maximale • Notification autorités
⏰ Action : MAINTENANT
🟠 CRITIQUE
12 ≤ Score < 20
Surveillance maximale : Monitoring continu O₂/toxiques • Préparation évacuation • Rescue team en alerte • Limitation temps exposition
⏰ Délai : < 5 minutes
🟡 ÉLEVÉE
6 ≤ Score < 12
Surveillance renforcée : Vérification équipements • Tests atmosphériques accélérés • Briefing sécurité • Validation permis
⏰ Délai : < 15 minutes
🔵 ATTENTION
Score < 6
Monitoring standard : Tests atmosphériques horaires • Logs conformité • Communications radio actives
⏰ Délai : Standard

📋 Normes & Références Réglementaires

OSHA 1910.146 - Permit-Required Confined Spaces CNESST Art. 297-310 - Espaces Clos CSA Z1006:16 - Confined Space Management NIOSH Pub. 80-106 - Confined Space Entry ANSI Z117.1 - Confined Space Safety ISO 45001:2018 - Hazard Identification NFPA 350 - Confined Space Operations API RP 2217A - Confined Space Entry 29 CFR 1910.134 - Respiratory Protection

Références techniques clés :

  • OSHA 1910.146(c)(5) : Conditions atmosphériques acceptables - O₂ 19.5-23.5%, gaz inflammables <10% LEL, toxiques sous PEL
  • CNESST Art. 297 : Définition espace clos au Québec - espace non conçu pour occupation humaine continue
  • CSA Z1006 Clause 6.3 : Programme de gestion des espaces clos incluant permis, formation, surveillance atmosphérique
  • OSHA 1910.146(k) : Services de secours requis avec capacité de réponse < 4 minutes pour extraction
  • NIOSH Pub. 80-106 : Guide technique surveillance atmosphérique continue et calibration détecteurs multi-gaz
  • API RP 2217A Section 8 : Procédures test atmosphérique pré-entrée et monitoring continu industrie pétrolière

🤖 Intégration AgenticX5 Framework

🌡️

AtmosphereAI - Agent de Surveillance Atmosphérique Intelligente

Rôle principal : AtmosphereAI analyse en temps réel les flux de données IoT des capteurs atmosphériques (O₂, CO, H₂S, LEL, CH₄). Il corrèle les lectures avec les modèles prédictifs de diffusion de gaz et déclenche des alertes graduées selon les seuils OSHA/CNESST.

Capacités clés :

  • Détection anomalies atmosphériques en <5 secondes via ML (isolation forests)
  • Prédiction dégradation conditions basée sur tendances historiques
  • Corrélation multi-capteurs pour éliminer faux positifs
  • Activation protocoles évacuation automatisés si criticalityScore ≥ 20
🚨

RescueAI - Agent de Coordination Secours d'Urgence

Exploite les résultats de cette requête pour orchestrer les opérations de sauvetage. En cas d'urgence (IMMÉDIATE), RescueAI active automatiquement les rescue teams, génère briefings tactiques avec layout 3D de l'espace et conditions atmosphériques, et coordonne les équipements SCBA/extraction.

📋

PermitAI - Agent de Gestion Dynamique des Permis

Utilise le criticalityScore pour ajuster dynamiquement les conditions des permis d'entrée. Si score > 12, PermitAI suspend automatiquement les nouveaux permis, réduit les durées autorisées et impose tests atmosphériques plus fréquents (toutes les 10 min vs 30 min standard).

SafetyGraph™ • Neo4j Knowledge Graph for Industrial Safety Intelligence
Powered by AgenticX5 Framework | OSHA 1910.146 Compliant | CSA Z1006:16 Certified