Project TBD — Supply Chain Simulation Ontology
Authors: J Bliss Perry & Dustin J Ross
Date: 2026-04-15
Audience: Technical reviewers familiar with supply chain modeling, agent-based simulation, or semiconductor production networks
Purpose: Share a draft data model for the agentic simulation layer and solicit feedback on whether it reflects how your organization thinks about shock modeling and intervention planning.
Overview
This document covers the simulation layer of our supply chain ontology — specifically, how exogenous shocks (blockades, earthquakes, export control actions, port closures) propagate through a semiconductor supply chain graph, how agents model and compare intervention strategies, and how outcomes are quantified across ensemble runs.
The simulation layer operates on the same property graph (Neo4j) as our compliance data, reusing entity classes wherever possible. ProductionFacility extends the base SupplyChainNode; ExportControlShock references existing Classification nodes. This means a single Entity List expansion can simultaneously trigger compliance re-screening and simulation propagation through the same graph.
1. Class Hierarchy
Thing (abstract root)
│
├── Actor (abstract)
│ └── AgentRole ← role in a simulation run
│
├── Simulation
│ ├── Scenario
│ ├── State
│ ├── Transition
│ ├── Outcome
│ ├── ScenarioBranch ← branch point within a scenario
│ ├── Counterfactual ← baseline vs. intervened comparison
│ ├── Intervention ← typed mitigation action
│ ├── ActionSpace ← set of interventions for an agent
│ ├── Policy ← agent strategy (rule-based, ML, etc.)
│ ├── Observation ← data point observed by an agent
│ ├── ObjectiveFunction ← optimization target for a policy
│ ├── ProbabilityDistribution ← uncertainty over a shock parameter
│ ├── ConfidenceInterval ← statistical bounds on a metric
│ └── EnsembleRun ← Monte Carlo / parametric run set
│
├── SupplyStructure (abstract)
│ ├── BillOfMaterials ← component structure of a product
│ ├── BOMEdge ← parent→child with quantity, substitutability
│ ├── ProductionFacility ← fab, packaging house, etc. (extends SupplyChainNode)
│ ├── ProductionLine ← line within a facility
│ ├── ProcessStep ← discrete production step
│ ├── Capacity ← time-indexed production capacity
│ ├── Inventory ← on-hand / in-transit / safety stock
│ ├── LeadTime ← node-to-node lead time
│ ├── Yield ← step or facility yield rate
│ ├── Utilization ← fraction of capacity in active use
│ └── SharedDependency ← hidden concentration risk (N nodes → 1 resource)
│
├── Logistics (abstract)
│ ├── Route ← port-to-port logistics path
│ ├── Lane ← carrier service on a route
│ ├── Port ← sea port, airport, or inland port
│ │ └── Hub ← major transshipment hub
│ └── Chokepoint ← geographic bottleneck (Taiwan Strait, etc.)
│
├── GeoTemporal (abstract)
│ ├── GeoLocation ← WGS84 coordinate
│ ├── Region ← named area (Taiwan, Hsinchu Science Park, etc.)
│ ├── HazardZone ← seismic, typhoon, geopolitical-flashpoint zone
│ ├── TimeInterval ← bounded time window
│ └── TimeIndexedState ← value of any property at a specific time window
│
├── Hazard (abstract) ← parameterized shock template
│ ├── Blockade
│ ├── Earthquake
│ ├── ExportControlShock ← references existing Classification nodes
│ ├── Tariff
│ ├── CyberIncident
│ ├── PortClosure
│ ├── Pandemic
│ ├── Sanctions
│ └── NaturalDisaster
│
├── ShockEvent ← specific Hazard instantiation in a scenario
├── DisruptionFunction ← maps ShockEvent → capacity/throughput loss over time
├── RecoveryFunction ← describes post-shock recovery curve
├── PropagationRule ← models cascading disruption downstream
│
└── ExposureMetric (abstract)
├── CriticalityScore ← node importance in the BOM graph
├── TimeToImpact ← days until disruption reaches a node
├── TimeToRecover ← days to return to threshold capacity
├── RevenueAtRisk ← estimated revenue exposure
├── FillRate ← fraction of demand fulfillable during shock
├── ServiceLevel ← on-time in-full rate during shock
└── SingleSourceIndex ← single-supplier concentration for a component2. Core Simulation Workflow
A Simulation contains one required BASELINE scenario and one or more SHOCKED scenarios. Agents observe the graph, apply Intervention actions from their ActionSpace, and produce structured ExposureMetric outputs. Uncertainty is represented via ProbabilityDistribution on shock parameters and quantified across an EnsembleRun.
Simulation
├── baselineScenario → Scenario (scenarioRole: BASELINE)
└── hasScenario → Scenario (scenarioRole: SHOCKED / COUNTERFACTUAL)
├── hasShockEvent → ShockEvent → sourceHazard → Hazard subclass
│ └── hasDisruptionFunction → DisruptionFunction
│ └── hasRecoveryFunction → RecoveryFunction
├── branchesAt → ScenarioBranch → leadsToBranch → Scenario [2..*]
└── assignedAgentRoles → AgentRole
├── hasActionSpace → ActionSpace → availableInterventions → Intervention
└── hasPolicy → Policy → objectiveFunction → ObjectiveFunction3. Key Properties by Class
Cardinality: [1..1] = required, [0..1] = optional single, [0..*] = optional multi-valued.
Scenario
ShockEvent
DisruptionFunction
RecoveryFunction
PropagationRule
BOMEdge
Inventory
SharedDependency
AgentRole
Intervention
Policy
ObjectiveFunction
Counterfactual
EnsembleRun
4. Hazard Types and Shock Parameters
A Hazard is a parameterized template. A ShockEvent is a specific instantiation of that template in a scenario — with a concrete onset time, duration, intensity, and geographic footprint.
5. Simulation Graph Relationships
erDiagram SIMULATION ||--|| SCENARIO : "baselineScenario" SIMULATION ||--o{ SCENARIO : "hasScenario (SHOCKED)" SCENARIO ||--o{ SHOCK_EVENT : "hasShockEvent" SHOCK_EVENT }o--|| HAZARD : "sourceHazard" SHOCK_EVENT ||--|| DISRUPTION_FUNCTION : "hasDisruptionFunction" DISRUPTION_FUNCTION ||--o| RECOVERY_FUNCTION : "hasRecoveryFunction" DISRUPTION_FUNCTION }o--|| PRODUCTION_FACILITY : "appliesTo" PRODUCTION_FACILITY ||--o{ CAPACITY : "hasCapacity" PRODUCTION_FACILITY ||--o{ INVENTORY : "hasInventory" PRODUCTION_FACILITY }o--o{ HAZARD_ZONE : "inHazardZone" SUPPLY_CHAIN_NODE ||--o{ PROPAGATION_RULE : "fromNode" PROPAGATION_RULE }o--|| SUPPLY_CHAIN_NODE : "toNode" BILL_OF_MATERIALS ||--|{ BOM_EDGE : "hasBOMEdge" BOM_EDGE }o--o{ SUPPLY_CHAIN_NODE : "qualifiedAlternates" SHARED_DEPENDENCY }o--o{ SUPPLY_CHAIN_NODE : "dependentNodes" SIMULATION ||--o{ EXPOSURE_METRIC : "hasMetric" SIMULATION ||--o{ ENSEMBLE_RUN : "hasEnsembleRun" AGENT_ROLE ||--|| ACTION_SPACE : "hasActionSpace" ACTION_SPACE ||--o{ INTERVENTION : "availableInterventions" INTERVENTION }o--o| SUPPLY_CHAIN_NODE : "targetsNode" SCENARIO ||--o{ AGENT_ROLE : "assignedAgentRoles" AGENT_ROLE ||--|| POLICY : "hasPolicy" POLICY ||--|| OBJECTIVE_FUNCTION : "objectiveFunction" SIMULATION ||--o{ COUNTERFACTUAL : "hasCounterfactual" COUNTERFACTUAL }o--|| SCENARIO : "baselineScenario" COUNTERFACTUAL }o--|| SCENARIO : "intervenedScenario"
Key graph traversals:
-
Find all production facilities in a seismic hazard zone: MATCH (f:ProductionFacility)-[:IN_HAZARD_ZONE]→(hz:HazardZone {hazardZoneType:‘SEISMIC’})
-
Propagate blockade disruption downstream: Walk PropagationRule edges from the affected Chokepoint, applying attenuationFactor and lagDays at each hop.
-
Compare fill rate across baseline and shocked scenarios: MATCH (m:FillRate)-[:FOR_SCENARIO]→(s:Scenario) WHERE s.simulationId = ‘sim-2026-0001’
-
Find high single-source-risk components: Query SingleSourceIndex metric nodes where value > 0.8 and linked BOMEdge.substitutable = false.
-
Identify hidden shared dependencies: MATCH (sd:SharedDependency) WHERE sd.concentrationRisk > 0.7 RETURN sd.sharedResource, sd.dependentNodes
6. Outcome Metrics
All metrics extend ExposureMetric, carry a forScenario reference (enabling baseline-vs-shocked comparison), and support ConfidenceInterval output from ensemble runs.