Knowledge Graph
The Industrial Knowledge Graph is the governed system of record. Every asset, site, person, and process is a typed entity; everything that happens is an event; and every fact is grounded in evidence.
The data model
The graph is built from four primitives. Keeping the model this small is deliberate — it is what lets reasoning, retrieval, and governance apply uniformly across every domain.
| Primitive | What it represents | Example |
|---|---|---|
| Entity | A typed thing with attributes | Asset, Site, WorkOrder, Person |
| Relationship | A typed edge between entities | Asset measured_by Sensor |
| Event | A time-stamped occurrence | status_change, reading, inspection |
| Evidence | The source that grounds a fact | SCADA tag, document span, sensor |
Modeling the ontology
Knowledge engineers declare entity types, attributes, and relationships in a versioned ontology. The ontology is the contract every connector maps into and every query is typed against.
# ontology/asset.yaml — declare a typed entity
type: Asset
extends: PhysicalThing
attributes:
tag: { type: string, unique: true }
site: { type: ref, to: Site }
status: { type: enum, values: [healthy, degraded, down] }
relationships:
measured_by: { to: Sensor, cardinality: many }
covered_by: { to: WorkOrder, cardinality: many }PhysicalThing) so cross-domain reasoning and access policies apply without per-app modeling.Querying & traversal
Query by type and attribute, then traverse relationships, events, and evidence in a single declarative request. Results always include provenance and a calibrated confidence score.
const { entities } = await iios.graph.query({
type: "Asset",
where: { site: "PLANT-04", status: "degraded" },
traverse: {
events: { since: "-90d" },
evidence: true,
},
limit: 50,
})Asserting facts
Writes are event-sourced: you assert an event with attached evidence rather than mutating a row. This preserves full history and makes point-in-time and lineage queries trivial.
await iios.graph.assert({
entity: { type: "Asset", tag: "PUMP-1183" },
event: {
kind: "status_change",
to: "degraded",
at: "2025-06-30T14:02:00Z",
},
evidence: [{ source: "scada:PLANT-04", ref: "tag/PV-221" }],
})- Every fact carries at least one evidence reference — ungrounded writes are rejected.
- History is immutable; corrections are new events, never overwrites.
- Access policy is evaluated per entity and per attribute at query time.
