← PRISM — EU AI Act Compliance Record-Keeping Ontology
The queries below were executed at build time against the PRISM ontology and a set of example AI systems modelled using AIRO. The example systems cover three high-risk use cases under Annex III (a credit scorer, a CV screener and an agentic recruitment assistant) and one non-high-risk system (a customer support chatbot), all deployed by the same fictional organisation. The recruitment assistant also carries the PRISM agentic profile (autonomy level, bounded tool access, oversight checkpoints and the agentic compliance records), which query 04 audits.
Two classifications appear in the results, and they come from different places. Each system asserts its own risk level (eu-aiact:hasRiskLevel): PRISM treats the classification decision as a recorded, compliance-relevant fact. Separately, a classification step derives prism:isHighRiskUnder from the AIRO system description alone — purpose, domain and AI subject — without consulting the asserted level. Query 02 shows both side by side so agreement or divergence is visible, and the repository's validation cross-checks the two: a description that triggers an Annex III rule while the asserted level is not high-risk is an error.
The classification step works by inverted SHACL validation. shacl/airo-high-risk-shapes.ttl holds one shape per Annex III point (adapted from the Annex III shapes by Golpayegani et al., ADAPT Centre, Trinity College Dublin), each encoding that point's conditions over AIRO properties. A system description that matches a shape's conditions gains one prism:isHighRiskUnder "Annex III xx" triple per matched point — the CV screener, for instance, is high-risk under both 4a and 4b. At docs build time this happens automatically; on the command line, examples/classify.py materialises the triples into a file that queries 02 and 03 then load:
cd examples
uv run python classify.py .derived/high-risk.ttl # runs the Annex III shapes, writes derived triples
To run the queries against your own data, add your system description to examples/systems/ (classify.py loads every file there), re-run the classification, and load the derived file alongside prism.ttl in any SPARQL-capable tool. With Apache Jena:
arq --data ontology/prism.ttl \
--data examples/systems/your-system.ttl \
--data examples/.derived/high-risk.ttl \
--query examples/sparql/03-obligations-gap-analysis.sparql
Queries 01 and 04 need no derived triples — they read the asserted description directly.
Example Queries
Portfolio Overview
What AI systems are in the portfolio?
Starting point for any compliance audit: lists every AIRO-described AI system, its purpose, and the domain in which it operates.
PREFIX airo: <https://w3id.org/airo#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?system ?label ?purpose ?domain WHERE {
?system a airo:AISystem ;
rdfs:label ?label ;
airo:hasPurpose ?purpose ;
airo:isAppliedWithinDomain ?domain .
}
ORDER BY ?label
| system | label | purpose | domain |
ex1:AcmeCreditScorer | Acme Credit Scorer | vair:AssessingCreditworthiness | vair:PrivateService |
ex1:AcmeSupportBot | Acme Support Bot | dpv:CustomerCare | vair:PrivateService |
ex:CVScreenerV2 | CV Screener v2 | vair:JobApplicationScreening | vair:Employment |
ex:RecruitAssistantV1 | Recruitment Assistant v1 | vair:JobApplicationScreening | vair:Employment |
Which systems are high-risk under Annex III?
Filters the portfolio for systems that satisfy EU AI Act Annex III high-risk conditions using AIRO properties. Covers Annex III 4a (employment and workers management) and 5b (credit assessment). Systems that do not match — such as the support chatbot — are excluded. The derived classification is shown next to each system's asserted risk level, so agreement (or divergence) between reported and calculated classification is visible at a glance.
PREFIX prism: <https://w3id.org/prism#>
PREFIX eu-aiact: <https://w3id.org/dpv/legal/eu/aiact#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
# ?annex is derived at build time: SHACL rules over the AIRO description
# (purpose, domain, AI subject) materialise prism:isHighRiskUnder, without
# consulting any declared classification. ?assertedLevel is the risk level
# the system itself asserts (eu-aiact:hasRiskLevel); showing both makes any
# divergence between reported and calculated classification visible.
SELECT DISTINCT ?system ?label ?assertedLevel ?annex WHERE {
?system rdfs:label ?label ;
prism:isHighRiskUnder ?annex .
OPTIONAL { ?system eu-aiact:hasRiskLevel ?assertedLevel }
}
ORDER BY ?label
| system | label | assertedLevel | annex |
ex1:AcmeCreditScorer | Acme Credit Scorer | eu-aiact:RiskLevelHigh-A6-2 | Annex III 5b |
ex:CVScreenerV2 | CV Screener v2 | eu-aiact:RiskLevelHigh-A6-2 | Annex III 4a |
ex:CVScreenerV2 | CV Screener v2 | eu-aiact:RiskLevelHigh-A6-2 | Annex III 4b |
ex:RecruitAssistantV1 | Recruitment Assistant v1 | eu-aiact:RiskLevelHigh-A6-2 | Annex III 4a |
ex:RecruitAssistantV1 | Recruitment Assistant v1 | eu-aiact:RiskLevelHigh-A6-2 | Annex III 4b |
Obligation Compliance
Are provider obligations met for high-risk systems?
For each high-risk system, cross-references every provider obligation required by PRISM against the compliance records on file. Missing records and unattested records surface as gaps for remediation.
PREFIX prism: <https://w3id.org/prism#>
PREFIX eu-aiact: <https://w3id.org/dpv/legal/eu/aiact#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT DISTINCT ?system ?systemLabel ?requiredType ?record ?status WHERE {
# Step 1 — select high-risk systems (classified by SHACL at build time).
# DISTINCT: a system can be high-risk under several Annex III points, and
# a record type can carry several matching conditions — one row each.
?system rdfs:label ?systemLabel ;
prism:isHighRiskUnder ?annex .
# Step 2 — find all provider obligations required by PRISM for high-risk systems
?requiredType rdfs:subClassOf prism:ComplianceRecord ;
prism:hasApplicabilityCondition ?cond .
?cond prism:forActor eu-aiact:AIProvider ;
prism:forRiskLevel eu-aiact:RiskLevelHigh .
# Step 2b — a condition narrowed with prism:forSystemType only applies to
# systems asserting that type (e.g. agentic-profile records apply to
# prism:AgenticAISystem instances, not to every high-risk system)
FILTER NOT EXISTS {
?cond prism:forSystemType ?requiredSystemType .
FILTER NOT EXISTS { ?system a ?requiredSystemType }
}
# Step 3 — check whether a record of that type is on file (gap if absent)
OPTIONAL {
?system prism:hasComplianceRecord ?record .
?record a ?requiredType ;
prism:hasAttestationStatus ?status .
}
}
ORDER BY ?system ?requiredType
| system | systemLabel | requiredType | record | status |
ex:CVScreenerV2 | CV Screener v2 | prism:AccuracyRobustnessRecord | | |
ex:CVScreenerV2 | CV Screener v2 | prism:CEMarkingRecord | | |
ex:CVScreenerV2 | CV Screener v2 | prism:ConformityAssessmentRecord | | |
ex:CVScreenerV2 | CV Screener v2 | prism:CorrectiveActionRecord | | |
ex:CVScreenerV2 | CV Screener v2 | prism:DataGovernanceRecord | | |
ex:CVScreenerV2 | CV Screener v2 | prism:DeclarationOfConformityRecord | | |
ex:CVScreenerV2 | CV Screener v2 | prism:HumanOversightRecord | ex:CVScreener_Article14Record | prism:Attested |
ex:CVScreenerV2 | CV Screener v2 | prism:IncidentReportingRecord | | |
ex:CVScreenerV2 | CV Screener v2 | prism:LoggingRecord | | |
ex:CVScreenerV2 | CV Screener v2 | prism:MarketRegistrationRecord | | |
ex:CVScreenerV2 | CV Screener v2 | prism:PostMarketMonitoringRecord | | |
ex:CVScreenerV2 | CV Screener v2 | prism:QualityManagementRecord | | |
ex:CVScreenerV2 | CV Screener v2 | prism:RiskManagementRecord | | |
ex:CVScreenerV2 | CV Screener v2 | prism:TechnicalDocumentationRecord | | |
ex:CVScreenerV2 | CV Screener v2 | prism:TransparencyRecord | | |
ex:RecruitAssistantV1 | Recruitment Assistant v1 | prism:AccuracyRobustnessRecord | | |
ex:RecruitAssistantV1 | Recruitment Assistant v1 | prism:AgentChangeManagementRecord | ex:Recruit_ChangeRecord | prism:Candidate |
ex:RecruitAssistantV1 | Recruitment Assistant v1 | prism:AgenticTestingRecord | ex:Recruit_TestingRecord | prism:Attested |
ex:RecruitAssistantV1 | Recruitment Assistant v1 | prism:CEMarkingRecord | | |
ex:RecruitAssistantV1 | Recruitment Assistant v1 | prism:ConformityAssessmentRecord | | |
ex:RecruitAssistantV1 | Recruitment Assistant v1 | prism:CorrectiveActionRecord | | |
ex:RecruitAssistantV1 | Recruitment Assistant v1 | prism:DataGovernanceRecord | | |
ex:RecruitAssistantV1 | Recruitment Assistant v1 | prism:DeclarationOfConformityRecord | | |
ex:RecruitAssistantV1 | Recruitment Assistant v1 | prism:HumanOversightRecord | ex:Recruit_OversightRecord | prism:Attested |
ex:RecruitAssistantV1 | Recruitment Assistant v1 | prism:IncidentReportingRecord | | |
ex:RecruitAssistantV1 | Recruitment Assistant v1 | prism:LoggingRecord | | |
ex:RecruitAssistantV1 | Recruitment Assistant v1 | prism:MarketRegistrationRecord | | |
ex:RecruitAssistantV1 | Recruitment Assistant v1 | prism:OversightEffectivenessRecord | ex:Recruit_OversightRecord | prism:Attested |
ex:RecruitAssistantV1 | Recruitment Assistant v1 | prism:PostMarketMonitoringRecord | | |
ex:RecruitAssistantV1 | Recruitment Assistant v1 | prism:QualityManagementRecord | | |
ex:RecruitAssistantV1 | Recruitment Assistant v1 | prism:RiskManagementRecord | | |
ex:RecruitAssistantV1 | Recruitment Assistant v1 | prism:TechnicalDocumentationRecord | | |
ex:RecruitAssistantV1 | Recruitment Assistant v1 | prism:TransparencyRecord | | |
ex1:AcmeCreditScorer | Acme Credit Scorer | prism:AccuracyRobustnessRecord | | |
ex1:AcmeCreditScorer | Acme Credit Scorer | prism:CEMarkingRecord | | |
ex1:AcmeCreditScorer | Acme Credit Scorer | prism:ConformityAssessmentRecord | | |
ex1:AcmeCreditScorer | Acme Credit Scorer | prism:CorrectiveActionRecord | | |
ex1:AcmeCreditScorer | Acme Credit Scorer | prism:DataGovernanceRecord | | |
ex1:AcmeCreditScorer | Acme Credit Scorer | prism:DeclarationOfConformityRecord | | |
ex1:AcmeCreditScorer | Acme Credit Scorer | prism:HumanOversightRecord | ex1:CreditScorer_HumanOversight | prism:Attested |
ex1:AcmeCreditScorer | Acme Credit Scorer | prism:IncidentReportingRecord | | |
ex1:AcmeCreditScorer | Acme Credit Scorer | prism:LoggingRecord | | |
ex1:AcmeCreditScorer | Acme Credit Scorer | prism:MarketRegistrationRecord | | |
ex1:AcmeCreditScorer | Acme Credit Scorer | prism:PostMarketMonitoringRecord | | |
ex1:AcmeCreditScorer | Acme Credit Scorer | prism:QualityManagementRecord | | |
ex1:AcmeCreditScorer | Acme Credit Scorer | prism:RiskManagementRecord | ex1:CreditScorer_RiskMgmt | prism:Attested |
ex1:AcmeCreditScorer | Acme Credit Scorer | prism:TechnicalDocumentationRecord | ex1:CreditScorer_TechDoc | prism:Candidate |
ex1:AcmeCreditScorer | Acme Credit Scorer | prism:TransparencyRecord | | |
Agentic AI
Are agentic-profile records in place for AI agents?
For each agentic AI system, cross-references the record types the PRISM agentic profile requires (agent identity, delegation of authority, oversight effectiveness, agentic testing, change management — derived from IMDA's MGF for Agentic AI) against the records on file. The recruitment assistant has attested identity, delegation, oversight and testing records, while its change-management record is still a candidate awaiting attestation.
PREFIX prism: <https://w3id.org/prism#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?system ?systemLabel ?requiredType ?record ?status WHERE {
# Step 1 — select agentic systems (asserted type; no inference needed)
?system a prism:AgenticAISystem ;
rdfs:label ?systemLabel .
# Step 2 — find record types the agentic profile requires: their
# applicability condition names prism:AgenticAISystem as the system type.
# The condition is the semantic trigger, so the query keys on it rather
# than on the record's position in the class hierarchy.
?requiredType prism:hasApplicabilityCondition ?cond .
?cond prism:forSystemType prism:AgenticAISystem .
# Step 3 — check whether a record of that type is on file (gap if absent)
OPTIONAL {
?system prism:hasComplianceRecord ?record .
?record a ?requiredType ;
prism:hasAttestationStatus ?status .
}
}
ORDER BY ?system ?requiredType
| system | systemLabel | requiredType | record | status |
ex:RecruitAssistantV1 | Recruitment Assistant v1 | prism:AgentChangeManagementRecord | ex:Recruit_ChangeRecord | prism:Candidate |
ex:RecruitAssistantV1 | Recruitment Assistant v1 | prism:AgentIdentityRecord | ex:Recruit_IdentityRecord | prism:Attested |
ex:RecruitAssistantV1 | Recruitment Assistant v1 | prism:AgenticTestingRecord | ex:Recruit_TestingRecord | prism:Attested |
ex:RecruitAssistantV1 | Recruitment Assistant v1 | prism:DelegationRecord | ex:Recruit_DelegationRecord | prism:Attested |
ex:RecruitAssistantV1 | Recruitment Assistant v1 | prism:OversightEffectivenessRecord | ex:Recruit_OversightRecord | prism:Attested |