Ontology
Purpose
Unifies data from all connected integrations into a coherent semantic model. The ontology creates abstract nodes (User, Device) that consolidate identities and devices from multiple sources, so you can ask cross-system questions like:
- Which users own devices that have access to sensitive AWS resources?
- Show all accounts belonging to a specific person across every connected system.
- Which devices are used but not enrolled in MDM?
The ontology module powers the Inventory feature.
How It Works
- Maps entities from source modules (AWS, Okta, Jamf, …) to standardized ontology nodes.
- Creates relationships between entities across systems based on common identifiers.
- Consolidates multiple source records into unified abstract representations.
Example: a person with an OktaUser account, a TailscaleUser account, and a JamfDevice becomes a single User node linked to each of those accounts and devices.
Configuration
The ontology module has no credentials. Two optional fields let you scope which modules contribute to the ontology:
| Field | Description |
|---|---|
ontology_users_source |
Comma-separated list of modules that create User nodes (e.g. okta,duo,microsoft) |
ontology_devices_source |
Comma-separated list of modules that create Device nodes (e.g. jamf,tailscale,kandji) |
When a source field is set, the ontology only creates User / Device nodes from the listed modules. When left blank, every compatible module contributes.
Setup Steps
Enable your source modules first. The ontology needs data to unify (AWS, Okta, Jamf, …).
(Optional) In SubImage → Modules → Ontology, set:
ontology_users_source— your primary identity provider(s)ontology_devices_source— your device management system(s)
Run an ontology sync.
Verify in Neo4j Browser:
MATCH (u:User)-[:HAS_ACCOUNT]->(account) RETURN u.email, labels(account), account.username LIMIT 10
Common Use Cases
Identity correlation
MATCH (u:User {email: "john.doe@company.com"})-[:HAS_ACCOUNT]->(account)
RETURN labels(account), account.usernameUnowned devices
MATCH (d:Device)
WHERE NOT (d)<-[:OWNS]-(:User)
RETURN d.hostname, d.platformCross-system access review
MATCH (u:User)-[:HAS_ACCOUNT]->(vpn:TailscaleUser)
MATCH (u)-[:HAS_ACCOUNT]->(aws:AWSUser)
RETURN u.email, vpn.username, aws.username