Safety Graph

Visualisation Interactive de Graphes de Connaissances pour la Prévention SST
Propulsé par D3.js, Neo4j et Cypher

Données 100% Dépersonnalisées - Conformité C-25

Visualisations Interactives de Résultats Cypher

Exemple 1: Corrélation Risques-Incidents-Procédures

Cette visualisation représente les résultats d'une requête Cypher complexe identifiant les corrélations entre risques critiques, incidents survenus et procédures de mitigation. Survolez les nœuds pour voir les détails, cliquez pour épingler, et glissez pour réorganiser.

REQUÊTE CYPHER CORRESPONDANTE
MATCH (r:Risque {niveau: 'Critique'})<-[:CONCERNE]-(inc:Incident)
MATCH (r)<-[:MITIGUE]-(proc:Procedure)
WHERE inc.date >= date('2024-01-01')
RETURN r, inc, proc, 
       COUNT(inc) as nb_incidents
ORDER BY nb_incidents DESC
LIMIT 20
Risque Critique
Incident
Procédure
Zone
12
Risques Identifiés
47
Incidents Corrélés
23
Procédures Actives
8
Zones à Risque

Exemple 2: Réseau de Compétences-Rôles-Risques

Mapping des compétences requises par rôle professionnel et leur couverture des risques identifiés. Les arêtes épaisses indiquent des relations fortes, tandis que la taille des nœuds représente le degré de connectivité.

REQUÊTE CYPHER CORRESPONDANTE
MATCH (role:Role)-[:REQUIERT]->(comp:Competence)
MATCH (role)-[:EXPOSE_A]->(r:Risque)
OPTIONAL MATCH (comp)-[:PERMET_GERER]->(r)
WITH role, comp, r, 
     COUNT(DISTINCT r) as total_risques,
     COUNT(DISTINCT CASE WHEN (comp)-[:PERMET_GERER]->(r) THEN r END) as risques_couverts
RETURN role, comp, r, total_risques, risques_couverts,
       ROUND(100.0 * risques_couverts / total_risques, 2) as taux_couverture
ORDER BY taux_couverture DESC
Rôle Professionnel
Compétence
Risque

Exemple 3: Analyse Temporelle des Incidents par Zone

Visualisation des patterns d'incidents dans différentes zones géographiques du projet, avec agrégation temporelle pour identifier les zones critiques nécessitant une intervention prioritaire.

REQUÊTE CYPHER CORRESPONDANTE
MATCH (z:Zone)<-[:SITUE_DANS]-(eq:Equipement)-[:IMPLIQUE_DANS]->(inc:Incident)
WHERE inc.date >= date('2024-01-01')
WITH z, 
     COUNT(DISTINCT inc) as nb_incidents,
     AVG(inc.gravite_score) as gravite_moy,
     COLLECT(DISTINCT inc.type) as types_incidents
RETURN z.id AS zone_id,
       z.nom_anonyme AS zone,
       nb_incidents,
       ROUND(gravite_moy, 2) as gravite,
       types_incidents,
       CASE 
         WHEN nb_incidents >= 10 AND gravite_moy >= 7 THEN 'Critique'
         WHEN nb_incidents >= 5 THEN 'Attention'
         ELSE 'Normal'
       END as classification
ORDER BY nb_incidents DESC, gravite DESC

Workflow Technique de Visualisation

Pipeline Complet: De Cypher à D3.js

1️⃣ Extraction Données (Neo4j)

Exécution des requêtes Cypher sur la base Neo4j pour extraire les sous-graphes pertinents. Utilisation de l'API REST Neo4j ou du driver JavaScript officiel.

// Driver Neo4j
const driver = neo4j.driver(
  'neo4j://localhost',
  neo4j.auth.basic('user', 'pass')
);
const session = driver.session();
const result = await session.run(cypherQuery);

2️⃣ Transformation Format

Conversion des résultats Neo4j en format JSON compatible avec D3.js (nodes/links structure). Application des règles d'anonymisation.

const graphData = {
  nodes: records.map(r => ({
    id: r.get('id'),
    label: anonymize(r.get('label')),
    type: r.get('type')
  })),
  links: relationships.map(rel => ({
    source: rel.start,
    target: rel.end,
    type: rel.type
  }))
};

3️⃣ Visualisation D3.js

Rendu interactif avec force simulation, zoom/pan, tooltips enrichis, et personnalisation des couleurs/formes selon les types d'entités.

const simulation = d3.forceSimulation(nodes)
  .force("link", d3.forceLink(links))
  .force("charge", d3.forceManyBody())
  .force("center", d3.forceCenter());

svg.selectAll("circle")
  .data(nodes)
  .enter().append("circle")
  .attr("r", d => d.size)
  .attr("fill", d => colorScale(d.type));

4️⃣ Interactivité & Export

Ajout d'interactions (hover, click, drag), filtres dynamiques, et options d'export (SVG, PNG, JSON) pour partage et reporting.

node.on("mouseover", showTooltip)
    .on("mouseout", hideTooltip)
    .on("click", highlightConnections)
    .call(d3.drag()
      .on("start", dragstarted)
      .on("drag", dragged));

Architecture Technique Complète

┌─────────────────────────────────────────────────────────────────────┐
│                         STACK SAFETYGRAPH                           │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  ┌──────────────┐      ┌──────────────┐      ┌──────────────┐    │
│  │   NEO4J      │      │   CYPHER     │      │  ETL PIPELINE│    │
│  │  Database    │─────▶│   Queries    │─────▶│ + Anonymiz.  │    │
│  │  (Graphe)    │      │  (Extraction)│      │  (Transform) │    │
│  └──────────────┘      └──────────────┘      └───────┬──────┘    │
│                                                       │            │
│                                            ┌──────────▼──────────┐ │
│                                            │   JSON API          │ │
│                                            │  (REST/GraphQL)     │ │
│                                            └──────────┬──────────┘ │
│                                                       │            │
│  ┌────────────────────────────────────────────────────▼──────────┐│
│  │              FRONTEND VISUALISATION                            ││
│  │  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐     ││
│  │  │  D3.js   │  │ Controls │  │ Tooltips │  │ Legends  │     ││
│  │  │ Force    │  │ Filters  │  │ Info-Box │  │ Stats    │     ││
│  │  │ Layout   │  │ Zoom/Pan │  │ Highlight│  │ Export   │     ││
│  │  └──────────┘  └──────────┘  └──────────┘  └──────────┘     ││
│  └────────────────────────────────────────────────────────────────┘│
│                              │                                     │
│                    ┌─────────▼─────────┐                          │
│                    │   USER BROWSER    │                          │
│                    │  (Interactive UI) │                          │
│                    └───────────────────┘                          │
│                                                                     │
│  OUTILS COMPLÉMENTAIRES:                                          │
│  • Neo4j Bloom (exploration native)                               │
│  • Gephi (analyse statistique avancée)                            │
│  • Vis.js (alternative à D3.js)                                   │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

Standards de Visualisation selon Best Practices

📊 Neo4j Bloom

Points Forts:
• Interface native Neo4j intuitive
• Navigation dynamique par perspective
• Filtres contextuels en temps réel
• Partage de vues avec équipes

Use Case SafetyGraph: Exploration ad-hoc des corrélations par coordinateurs SST sans compétences techniques.

🎨 D3.js

Points Forts:
• Personnalisation complète du rendu
• Animations fluides et transitions
• Intégration web seamless
• Large écosystème de layouts

Use Case SafetyGraph: Dashboards interactifs temps réel pour analyses prédictives et reporting exécutif.

🔬 Gephi

Points Forts:
• Analyse statistique poussée (centralité, clustering)
• Gestion de très grands graphes (millions de nœuds)
• Algorithmes de détection de communautés
• Export haute résolution pour publications

Use Case SafetyGraph: Analyses académiques approfondies et recherche de patterns cachés dans historique incidents.

🌐 Vis.js

Points Forts:
• Simplicité d'implémentation
• Performance optimale petits/moyens graphes
• Options de clustering automatiques
• Documentation exhaustive

Use Case SafetyGraph: Prototypage rapide et vues simplifiées pour présentations clients.

Représentation Explicite des Éléments

🔵 Nœuds (Entités)

Représentent les entités du domaine SST:
Cercles: Entités standard (Compagnie, Projet, Zone)
Carrés: Événements (Incidents, Quasi-accidents)
Diamants: Processus (Procédures, Audits)
Triangles: Acteurs (Rôles, Compétences)

Taille: Proportionnelle au degré de connectivité
Couleur: Code selon type ou niveau de criticité

➡️ Arêtes (Relations)

Représentent les relations sémantiques:
Épaisseur: Force de la relation (nb interactions)
Couleur: Type de relation (EXPOSE_À, MITIGUE, etc.)
Direction: Flèches pour relations orientées
Style: Pointillés pour relations inférées

Labels: Type de relation affiché au survol
Animation: Flux pour relations actives/récentes

📦 Propriétés (Attributs)

Métadonnées affichées interactivement:
Tooltip au survol: Infos essentielles (ID, type, statut)
Panel latéral au clic: Détails complets + historique
Info-box flottante: Contexte additionnel
Badges visuels: Indicateurs de priorité/alerte

Toutes les propriétés respectent l'anonymisation

🎯 Layouts Recommandés

Algorithmes de positionnement selon use case:
Force-Directed: Vue générale équilibrée
Hierarchical: Structures organisationnelles
Circular: Cycles et dépendances
Radial: Focus sur nœud central

Zoom/Pan standard, mini-map pour navigation grands graphes

Avantages de la Visualisation Interactive

🧠 Interprétabilité Immédiate

La structure et la logique des résultats Cypher deviennent immédiatement compréhensibles visuellement, facilitant l'identification de patterns complexes et corrélations non évidentes dans les données tabulaires.

🔍 Explicabilité Renforcée

Permet de justifier et tracer le raisonnement issu du graphe pour rendre le système transparent et validable par toutes les parties prenantes (CNESST, IRSST, auditeurs, gestionnaires).

⚡ Détection Rapide d'Anomalies

Identification visuelle instantanée des nœuds isolés, clusters inhabituels, ou chemins critiques nécessitant une investigation approfondie ou action préventive urgente.

📈 Décisions Basées sur les Données

Transforme les insights complexes du graphe en visualisations actionnables pour supporter les décisions stratégiques en prévention et allocation de ressources SST.

🤝 Communication Facilitée

Les visualisations servent de langage commun entre experts techniques (data scientists), praticiens SST (coordonnateurs), et décideurs (direction), éliminant les barrières de compréhension.

📊 Conformité Auditable

Les exports SVG/PNG des visualisations constituent une documentation visuelle traçable pour audits réglementaires, démontrant la rigueur des analyses SST et la conformité C-25.

Cas d'Usage Pratiques de Visualisation

🏗️ Audit Sécurité Pré-Travaux Hauteur

Avant d'autoriser des travaux en hauteur, le coordinateur SST lance une requête Cypher pour extraire tous les incidents historiques similaires, les procédures applicables, et les compétences requises. La visualisation D3.js révèle instantanément:

Résultat: Décision d'autorisation documentée et traçable en 15 minutes au lieu de 2+ heures d'analyse manuelle de documents.

🔬 Analyse Causale Post-Incident

Suite à un incident, l'analyste SST exécute une requête Cypher traversant 3-4 niveaux de relations pour identifier la chaîne causale complète. La visualisation Gephi permet de:

Résultat: Rapport d'enquête enrichi avec visualisations explicatives conformes aux exigences CNESST, réduisant les délais d'investigation de 40%.

🎯 Priorisation Investissements Prévention

La direction doit allouer un budget préventif limité. Une requête Cypher agrège incidents, coûts, gravités et équipements impliqués. La visualisation Neo4j Bloom permet aux gestionnaires non-techniques de:

Résultat: Décisions d'allocation budgétaire data-driven et justifiées, réduisant les incidents de 25% l'année suivante dans zones ciblées.