Use Case #01 • Neo4j SafetyGraph

Détection Proactive des Risques de Chute en Hauteur

📊 Catégorie : Travail en Hauteur | Prévention des Chutes | Analyse Prédictive

Question Métier

"Quelles sont les zones de travail en hauteur présentant le plus grand risque de chute au cours des 30 derniers jours, en tenant compte des incidents passés, des permis actifs et de l'absence de formation appropriée des travailleurs ?"

🏗️ Contexte Opérationnel

Type de site : Sites industriels avec opérations en hauteur (construction, maintenance, entrepôts logistiques, installations pétrolières et gazières)

Données sources :

  • Historique des incidents et quasi-accidents (near-miss) en hauteur
  • Permis de travail actifs (chauds, espace clos, travail en hauteur)
  • Certifications et formations des travailleurs (harnais, échafaudages, nacelles)
  • Capteurs IoT : détection de présence en zones dangereuses, conditions météo
  • Données BIM : hauteur des structures, points d'ancrage, zones de protection
  • Inspections d'équipements de protection (EPI, lignes de vie, garde-corps)

Acteurs impliqués :

  • Superviseurs HSE et coordinateurs de sécurité
  • Travailleurs effectuant des opérations en hauteur
  • Gestionnaires de permis et responsables de formation
  • Agents AI de surveillance (RiskAI, PermitAI, InspectAI)

🔷 Schéma du Graphe SafetyGraph

Visualisation des entités et relations utilisées dans cette analyse :

HAS_ZONE OCCURRED_IN APPLIES_TO ASSIGNED_TO USES_EQUIPMENT HAS_CERT INSPECTED Project :Project Zone :Zone ⚠️ workAtHeight Incident :Incident Permit :Permit Worker :Worker Asset :Asset Certification :Cert Inspection :Inspection Légende : Entités principales Conformité Incidents

🔄 Flow d'Analyse de la Requête

1

🎯 Sélection du Projet & Zones

MATCH (proj:Project)-[:HAS_ZONE]->(zone:Zone)

Filtrage: workAtHeight = true
2

📊 Analyse Historique Incidents

Collecte des incidents (chutes, near-miss) sur 30 jours

Score: incidents × 3.0
3

📋 Vérification Permis Actifs

Validation des permis work_at_height valides

Bonus: permis × -0.5
4

👷 Analyse Travailleurs & Formations

Vérification certifications fall_protection, scaffold

Pénalité: non-certifiés × 2.0
5

🛡️ Inspection Équipements Protection

Contrôle harnais, lignes de vie, garde-corps

Pénalité: non-inspectés × 1.5
6

🎲 Calcul Score de Risque Composite

Agrégation pondérée de tous les facteurs

riskScore = (incidents × 3) + (non-cert × 2) + (non-insp × 1.5) - (permits × 0.5)
7

🎯 Classification & Priorisation

Tri des zones par score décroissant

≥15: CRITIQUE ≥10: ÉLEVÉ ≥5: MODÉRÉ

⚙️ Requête Cypher Neo4j Complète

SafetyGraph Query - Work at Height Risk Analysis Cypher
// ═══════════════════════════════════════════════════════════════════════════
// USE CASE #01 : Détection des Risques de Chute en Hauteur
// Objectif : Identifier les zones critiques nécessitant une intervention
// Période : 30 derniers jours | Seuil : hauteur ≥ 2m (OSHA/CNESST)
// ═══════════════════════════════════════════════════════════════════════════

// 🎯 ÉTAPE 1 : SÉLECTION DU CONTEXTE (Project → Zone)
MATCH (proj:Project {id: $projectId})
      -[:HAS_ZONE]->(zone:Zone)
WHERE zone.workAtHeight = true 
  AND zone.height >= $minHeight  // Hauteur minimale de risque

// ─────────────────────────────────────────────────────────────────────────
// 📊 ÉTAPE 2 : ANALYSE HISTORIQUE DES INCIDENTS
// Collecte : 30 derniers jours • Types : fall, near_miss_fall, height_related
// Impact score : incidents × 3.0 (facteur pondération élevé)
// ─────────────────────────────────────────────────────────────────────────
OPTIONAL MATCH (zone)<-[:OCCURRED_IN]-(incident:Incident)
WHERE incident.timestamp >= datetime() - duration({days: $lookbackDays})
  AND incident.category IN ['fall', 'near_miss_fall', 'height_related']
WITH zone, 
     count(incident) AS incidentCount,
     collect(incident.severity) AS severities

// ─────────────────────────────────────────────────────────────────────────
// 📋 ÉTAPE 3 : VÉRIFICATION CONFORMITÉ DES PERMIS
// Statuts valides : active, pending • Expiration vérifiée
// Impact score : -0.5 par permis actif (facteur de protection)
// ─────────────────────────────────────────────────────────────────────────
OPTIONAL MATCH (zone)<-[:APPLIES_TO]-(permit:Permit)
WHERE permit.status IN ['active', 'pending']
  AND permit.type IN ['work_at_height', 'hot_work_elevated']
  AND permit.expiryDate > datetime()
WITH zone, incidentCount, severities,
     count(permit) AS activePermits,
     collect(permit) AS permits

// ─────────────────────────────────────────────────────────────────────────
// 👷 ÉTAPE 4 : ANALYSE DES COMPÉTENCES TRAVAILLEURS
// Certifications requises : fall_protection, scaffold, aerial_lift
// Impact score : +2.0 par travailleur NON certifié (pénalité)
// ─────────────────────────────────────────────────────────────────────────
OPTIONAL MATCH (zone)<-[:ASSIGNED_TO]-(worker:Worker)
WHERE worker.status = 'active'

OPTIONAL MATCH (worker)-[:HAS_CERTIFICATION]->(cert:Certification)
WHERE cert.type IN ['fall_protection', 'scaffold', 'aerial_lift']
  AND cert.expiryDate > datetime()

WITH zone, incidentCount, severities, activePermits, permits,
     count(DISTINCT worker) AS totalWorkers,
     count(DISTINCT cert) AS certifiedWorkers

// ─────────────────────────────────────────────────────────────────────────
// 🛡️ ÉTAPE 5 : INSPECTION DES ÉQUIPEMENTS DE PROTECTION
// Types EPI : fall_protection, harness, lifeline, guardrail
// Impact score : +1.5 par équipement NON inspecté récemment
// ─────────────────────────────────────────────────────────────────────────
OPTIONAL MATCH (zone)-[:USES_EQUIPMENT]->(equip:Asset)
WHERE equip.category IN ['fall_protection', 'harness', 'lifeline', 'guardrail']

OPTIONAL MATCH (equip)<-[:INSPECTED]-(inspection:Inspection)
WHERE inspection.timestamp >= datetime() - duration({days: 30})
WITH zone, incidentCount, severities, activePermits, permits,
     totalWorkers, certifiedWorkers,
     count(DISTINCT equip) AS totalEquipment,
     count(DISTINCT inspection) AS inspectedEquipment

// ─────────────────────────────────────────────────────────────────────────
// 🎲 ÉTAPE 6 : CALCUL DU SCORE DE RISQUE COMPOSITE
// Formule algorithmique pondérée :
//   • Incidents passés          : × 3.0  (forte corrélation risque)
//   • Travailleurs non certifiés: × 2.0  (compétence insuffisante)
//   • Équipements non inspectés : × 1.5  (défaillance matérielle)
//   • Permis actifs conformes   : × -0.5 (facteur de contrôle)
// ─────────────────────────────────────────────────────────────────────────
WITH zone, incidentCount, severities, activePermits, 
     totalWorkers, certifiedWorkers, totalEquipment, inspectedEquipment,
     // 🧮 Application de la formule
     (incidentCount * 3.0) + 
     ((totalWorkers - certifiedWorkers) * 2.0) +
     ((totalEquipment - inspectedEquipment) * 1.5) -
     (activePermits * 0.5) AS riskScore

WHERE riskScore >= $riskThreshold  // ⚠️ Filtre seuil d'alerte

// ─────────────────────────────────────────────────────────────────────────
// 🎯 ÉTAPE 7 : STRUCTURATION ET TRI DES RÉSULTATS
// Classification : CRITIQUE (≥15) | ÉLEVÉ (≥10) | MODÉRÉ (≥5) | FAIBLE (<5)
// Tri : Score décroissant pour priorisation des interventions
// ─────────────────────────────────────────────────────────────────────────
RETURN 
  // 📍 Identification de la zone
  zone.id AS zoneId,
  zone.name AS zoneName,
  zone.height AS heightMeters,
  zone.location AS coordinates,
  
  // 📊 Métriques de risque agrégées
  round(riskScore, 2) AS riskScore,
  incidentCount,
  size([s IN severities WHERE s = 'critical']) AS criticalIncidents,
  
  // 👷 Taux de conformité formation
  totalWorkers,
  certifiedWorkers,
  round((toFloat(certifiedWorkers) / totalWorkers * 100.0), 1) AS certificationRate,
  
  // 🛡️ État des équipements protection
  totalEquipment,
  inspectedEquipment,
  (totalEquipment - inspectedEquipment) AS overdueInspections,
  
  // 📋 Couverture permis
  activePermits,
  
  // ⚠️ Classification intelligente du risque
  CASE
    WHEN riskScore >= 15 THEN 'CRITIQUE'     // 🔴 Intervention immédiate
    WHEN riskScore >= 10 THEN 'ÉLEVÉ'        // 🟠 Priorisation haute
    WHEN riskScore >= 5 THEN 'MODÉRÉ'       // 🟡 Surveillance renforcée
    ELSE 'FAIBLE'                     // 🟢 Contrôle standard
  END AS riskLevel,
  
  // ⏰ Horodatage de l'analyse
  datetime() AS analysisTimestamp

// 🎯 Tri et limitation pour dashboards
ORDER BY riskScore DESC
LIMIT $maxResults

// ═══════════════════════════════════════════════════════════════════════════
// 📌 RÉSULTAT : Top zones à risque triées par score décroissant
// 🔄 FRÉQUENCE : Exécution recommandée toutes les 5-15 minutes
// 🤖 AGENTS CIBLES : RiskAI, PermitAI, InspectAI
// ═══════════════════════════════════════════════════════════════════════════

🎛️ Paramètres Clés

$projectId
Type: String
Exemple: "PROJ-2025-MTL-001"
Identifiant unique du projet ou site industriel
$minHeight
Type: Float
Unité: Mètres
Valeur par défaut: 2.0
Hauteur minimale considérée comme risque (OSHA: 6 ft / 1.8m, CNESST: 2m)
$lookbackDays
Type: Integer
Unité: Jours
Valeur par défaut: 30
Période d'analyse historique des incidents
$riskThreshold
Type: Float
Valeur par défaut: 5.0
Score minimum pour déclencher une alerte
$maxResults
Type: Integer
Valeur par défaut: 20
Nombre maximum de zones critiques à retourner

📤 Sortie Attendue & Exemple de Résultat

Structure des Données Retournées

  • zoneId / zoneName : Identifiant et nom de la zone à risque
  • heightMeters : Hauteur de travail (en mètres)
  • riskScore : Score de risque composite (0-100+)
  • riskLevel : Classification (CRITIQUE / ÉLEVÉ / MODÉRÉ / FAIBLE)
  • incidentCount : Nombre d'incidents historiques
  • criticalIncidents : Nombre d'incidents critiques/graves
  • certificationRate : Pourcentage de travailleurs certifiés (%)
  • overdueInspections : Nombre d'équipements sans inspection récente
  • activePermits : Nombre de permis valides en cours

📋 Exemple de Résultat JSON

Exemple de sortie pour zone critique JSON
{
  "zoneId": "ZONE-MTL-A3-ROOF",
  "zoneName": "Toiture Bâtiment A3 - Section Nord",
  "heightMeters": 18.5,
  "coordinates": {
    "lat": 45.5017,
    "lon": -73.5673
  },
  
  // 🎲 Métriques de risque calculées
  "riskScore": 22.5,
  "riskLevel": "CRITIQUE",  // 🔴 Intervention immédiate requise
  
  // 📊 Historique incidents
  "incidentCount": 4,         // 4 incidents × 3.0 = 12 points
  "criticalIncidents": 2,  // Dont 2 graves
  
  // 👷 Conformité formation
  "totalWorkers": 12,
  "certifiedWorkers": 7,
  "certificationRate": 58.3,  // ⚠️ Sous le seuil recommandé (80%)
  // 5 non-certifiés × 2.0 = 10 points
  
  // 🛡️ État équipements
  "totalEquipment": 8,
  "inspectedEquipment": 8,
  "overdueInspections": 0,  // ✅ Tous inspectés
  
  // 📋 Permis conformité
  "activePermits": 1,       // 1 permis × -0.5 = -0.5 points
  
  "analysisTimestamp": "2025-11-04T14:32:15Z"
}

// 🧮 Calcul détaillé du score :
// riskScore = (4 × 3.0) + (5 × 2.0) + (0 × 1.5) - (1 × 0.5)
//           = 12.0 + 10.0 + 0.0 - 0.5
//           = 22.5 → CRITIQUE ⚠️

🎯 Utilisation opérationnelle :

  • Alertes temps réel : Notifications push vers superviseurs HSE et RiskAI lorsque riskScore > seuil critique
  • Dashboard Safety Intelligence : Visualisation cartographique des zones rouges avec heatmaps
  • Planification interventions : Priorisation automatique des inspections et formations
  • Rapports conformité : Génération automatique de rapports OSHA 300/CNESST pour audits
  • Analyse prédictive : Alimentation de modèles ML pour prévision de chutes (TensorFlow/PyTorch)

⚙️ Matrice de Seuils & Actions

🔴 CRITIQUE
Score ≥ 15
Actions immédiates : Arrêt des travaux • Inspection d'urgence • Formation obligatoire • Révision permis
⏰ Délai : < 2 heures
🟠 ÉLEVÉ
10 ≤ Score < 15
Actions prioritaires : Supervision renforcée • Audit EPI • Plan de mitigation • Briefing sécurité
⏰ Délai : < 24 heures
🟡 MODÉRÉ
5 ≤ Score < 10
Actions préventives : Surveillance hebdomadaire • Vérification certifications • Rappels procédures
⏰ Délai : < 7 jours
🟢 FAIBLE
Score < 5
Maintenance standard : Contrôles mensuels • Audits trimestriels • Formation continue
⏰ Délai : Standard

📋 Normes & Références Réglementaires

OSHA 1926 Subpart M - Fall Protection CNESST - RSST Art. 26.1 à 26.5 ISO 45001:2018 - OH&S Management CSA Z259 Series - Fall Protection ANSI Z359 - Fall Protection Code EU Directive 2001/45/EC - Work at Height NIOSH Alert 2000-108 - Falls ISO 12100:2010 - Risk Assessment NFPA 70E - Elevated Work Electrical Safety

Références clés :

  • OSHA 1926.501(b) : Systèmes de protection contre les chutes requis pour travaux > 6 pieds (1.8m)
  • CNESST Art. 26.4 : Formation obligatoire pour travaux en hauteur de 3m+ au Québec
  • ISO 45001 Clause 6.1.2 : Identification des dangers et évaluation des risques SST
  • CSA Z259.16-15 : Conception et exigences des systèmes personnels de protection contre les chutes
  • ANSI Z359.2-2017 : Minimum requirements for a managed fall protection program

🤖 Intégration AgenticX5 Framework

🎯

RiskAI - Agent d'Analyse Prédictive des Risques

Rôle principal : RiskAI exploite cette requête Cypher en temps réel pour surveiller en continu les zones de travail en hauteur. Il déclenche des alertes proactives lorsque le score de risque franchit les seuils critiques (>15) ou élevés (>10).

Capacités clés :

  • Surveillance 24/7 avec refresh toutes les 5 minutes
  • Corrélation multi-sources (incidents + formations + équipements)
  • Génération automatique de playbooks d'intervention
  • Escalade vers superviseurs et PermitAI pour blocage de permis non-conformes
📋

PermitAI - Agent de Gestion Intelligente des Permis

Utilise les résultats pour valider la conformité des permis de travail en hauteur avant approbation. Bloque automatiquement l'émission de nouveaux permis si zone classée CRITIQUE sans plan de mitigation documenté.

🔍

InspectAI - Agent d'Inspection Prédictive

Priorise les inspections d'équipements de protection (harnais, lignes de vie) dans les zones à haut riskScore. Génère automatiquement des ordres d'inspection avec fréquence adaptative selon le niveau de risque.

SafetyGraph™ • Neo4j Knowledge Graph for Industrial Safety Intelligence
Powered by AgenticX5 Framework | ISO 45001:2018 Compliant