CLD federated organisation-role validation
type: NodeShape
comment: Collection of federated SHACL-SPARQL constraints for CLD. Constraints are linked from era-sh:CertificationLevelDocumentShape in ED-CLD.ttl.
sparql: DCAudienceOrganisationRoleFederatedSPARQL
sparql: DCAudienceRoleOfBodyFederatedSPARQL
sparql: DCAudienceAllowedRoleFederatedSPARQL
sparql: DCContributorOrganisationRoleFederatedSPARQL
sparql: DCContributorRoleOfBodyFederatedSPARQL
sparql: DCContributorAllowedRoleFederatedSPARQL
sparql: DCCreatorOrganisationRoleFederatedSPARQL
sparql: DCCreatorRoleOfBodyFederatedSPARQL
sparql: DCCreatorAllowedRoleFederatedSPARQL
sparql: DCSubjectNoModuleDecisionFederatedSPARQL
sparql: DCSubjectAllowedTypesFederatedSPARQL
sparql: DCSubjectNoICRequiresTSIFederatedSPARQL
sparql: DCSubjectAtMostOneICFederatedSPARQL
sparql: DCSourceNotTSIorICFederatedSPARQL
sparql: VPAComplianceFederatedSPARQL

DCAudienceOrganisationRoleFederatedSPARQL
type: SPARQLConstraint
severity: Violation
message: Organisation using the CLD as Applicant MUST be an era:OrganisationRole, resolved locally or in OCR-KG.
select: PREFIX dcterms: <http://purl.org/dc/terms/> PREFIX era: <http://data.europa.eu/949/> SELECT $this ?orgRole WHERE { $this dcterms:audience ?orgRole . FILTER NOT EXISTS { SERVICE <repository:OCR-KG> { ?orgRole a era:OrganisationRole . } } }

DCAudienceRoleOfBodyFederatedSPARQL
type: SPARQLConstraint
severity: Violation
message: Exactly one era:Body MUST be linked via era:roleOf for dcterms:audience, resolved locally or in OCR-KG.
select: PREFIX dcterms: <http://purl.org/dc/terms/> PREFIX era: <http://data.europa.eu/949/> SELECT $this ?orgRole ?bodyCount WHERE { $this dcterms:audience ?orgRole . OPTIONAL { SELECT ?orgRole (COUNT(DISTINCT ?body) AS ?bodyCount) WHERE { SERVICE <repository:OCR-KG> { ?orgRole era:roleOf ?body . ?body a era:Body . } } GROUP BY ?orgRole } FILTER(COALESCE(?bodyCount, 0) != 1) }

DCAudienceAllowedRoleFederatedSPARQL
type: SPARQLConstraint
severity: Violation
message: For dcterms:audience, exactly one allowed organisation role (Applicant or Manufacturer) MUST be linked via era:hasOrganisationRole, resolved locally or in OCR-KG.
select: PREFIX dcterms: <http://purl.org/dc/terms/> PREFIX era: <http://data.europa.eu/949/> PREFIX era-organisation-roles: <http://data.europa.eu/949/concepts/organisation-roles/> SELECT $this ?orgRole ?roleCount WHERE { $this dcterms:audience ?orgRole . OPTIONAL { SELECT ?orgRole (COUNT(DISTINCT ?role) AS ?roleCount) WHERE { SERVICE <repository:OCR-KG> { ?orgRole era:hasOrganisationRole ?role . FILTER(?role IN (era-organisation-roles:Applicant, era-organisation-roles:Manufacturer)) } } GROUP BY ?orgRole } FILTER(COALESCE(?roleCount, 0) != 1) }

DCContributorOrganisationRoleFederatedSPARQL
type: SPARQLConstraint
severity: Warning
message: Each dcterms:contributor SHOULD be an era:OrganisationRole, resolved locally or in OCR-KG.
select: PREFIX dcterms: <http://purl.org/dc/terms/> PREFIX era: <http://data.europa.eu/949/> SELECT $this ?orgRole WHERE { $this dcterms:contributor ?orgRole . FILTER isIRI(?orgRole) FILTER NOT EXISTS { SERVICE <repository:OCR-KG> { ?orgRole a era:OrganisationRole . } } }

DCContributorRoleOfBodyFederatedSPARQL
type: SPARQLConstraint
severity: Warning
message: For each IRI dcterms:contributor, at least one era:roleOf to an era:Body SHOULD exist, resolved locally or in OCR-KG.
select: PREFIX dcterms: <http://purl.org/dc/terms/> PREFIX era: <http://data.europa.eu/949/> SELECT $this ?orgRole WHERE { $this dcterms:contributor ?orgRole . FILTER isIRI(?orgRole) FILTER NOT EXISTS { SERVICE <repository:OCR-KG> { ?orgRole era:roleOf ?body . ?body a era:Body . } } }

DCContributorAllowedRoleFederatedSPARQL
type: SPARQLConstraint
severity: Warning
message: For each IRI dcterms:contributor, at least one allowed organisation role (Manufacturer or AssessmentBody) SHOULD be linked via era:hasOrganisationRole, resolved locally or in OCR-KG.
select: PREFIX dcterms: <http://purl.org/dc/terms/> PREFIX era: <http://data.europa.eu/949/> PREFIX era-organisation-roles: <http://data.europa.eu/949/concepts/organisation-roles/> SELECT $this ?orgRole WHERE { $this dcterms:contributor ?orgRole . FILTER isIRI(?orgRole) FILTER NOT EXISTS { SERVICE <repository:OCR-KG> { ?orgRole era:hasOrganisationRole ?role . FILTER(?role IN (era-organisation-roles:Manufacturer, era-organisation-roles:AssessmentBody)) } } }

DCCreatorOrganisationRoleFederatedSPARQL
type: SPARQLConstraint
severity: Violation
message: dcterms:creator MUST be an era:OrganisationRole, resolved locally or in OCR-KG.
select: PREFIX dcterms: <http://purl.org/dc/terms/> PREFIX era: <http://data.europa.eu/949/> SELECT $this ?orgRole WHERE { $this dcterms:creator ?orgRole . FILTER NOT EXISTS { SERVICE <repository:OCR-KG> { ?orgRole a era:OrganisationRole . } } }

DCCreatorRoleOfBodyFederatedSPARQL
type: SPARQLConstraint
severity: Violation
message: Exactly one era:Body MUST be linked via era:roleOf for dcterms:creator, resolved locally or in OCR-KG.
select: PREFIX dcterms: <http://purl.org/dc/terms/> PREFIX era: <http://data.europa.eu/949/> SELECT $this ?orgRole ?bodyCount WHERE { $this dcterms:creator ?orgRole . OPTIONAL { SELECT ?orgRole (COUNT(DISTINCT ?body) AS ?bodyCount) WHERE { SERVICE <repository:OCR-KG> { ?orgRole era:roleOf ?body . ?body a era:Body . } } GROUP BY ?orgRole } FILTER(COALESCE(?bodyCount, 0) != 1) }

DCCreatorAllowedRoleFederatedSPARQL
type: SPARQLConstraint
severity: Violation
message: For dcterms:creator, exactly one allowed organisation role (CAB, AssessmentBody or NoBo) MUST be linked via era:hasOrganisationRole, resolved locally or in OCR-KG.
select: PREFIX dcterms: <http://purl.org/dc/terms/> PREFIX era: <http://data.europa.eu/949/> PREFIX era-organisation-roles: <http://data.europa.eu/949/concepts/organisation-roles/> SELECT $this ?orgRole ?roleCount WHERE { $this dcterms:creator ?orgRole . OPTIONAL { SELECT ?orgRole (COUNT(DISTINCT ?role) AS ?roleCount) WHERE { SERVICE <repository:OCR-KG> { ?orgRole era:hasOrganisationRole ?role . FILTER(?role IN (era-organisation-roles:CAB, era-organisation-roles:AssessmentBody, era-organisation-roles:NoBo)) } } GROUP BY ?orgRole } FILTER(COALESCE(?roleCount, 0) != 1) }

DCSourceNotTSIorICFederatedSPARQL
type: SPARQLConstraint
severity: Violation
message: dcterms:source must not be an era:TSI or era:IC (classification resolved in era-lex).
select: PREFIX dcterms: <http://purl.org/dc/terms/> PREFIX era: <http://data.europa.eu/949/> SELECT $this ?covered WHERE { $this dcterms:source ?covered . FILTER EXISTS { SERVICE <repository:era-lex> { ?covered a ?forbiddenType . FILTER(?forbiddenType IN (era:TSI, era:IC)) } } }

DCSubjectAtMostOneICFederatedSPARQL
type: SPARQLConstraint
severity: Violation
message: There must be at most one era:IC as dcterms:subject (type resolved in era-lex).
select: PREFIX era: <http://data.europa.eu/949/> PREFIX dcterms: <http://purl.org/dc/terms/> SELECT $this WHERE { $this dcterms:subject ?ic . SERVICE <repository:era-lex> { ?ic a era:IC . } } GROUP BY $this HAVING (COUNT(DISTINCT ?ic) > 1)

DCSubjectAllowedTypesFederatedSPARQL
type: SPARQLConstraint
severity: Violation
message: Each dcterms:subject MUST be typed as era:IC or era:TSI (type resolved in era-lex).
select: PREFIX era: <http://data.europa.eu/949/> PREFIX dcterms: <http://purl.org/dc/terms/> SELECT $this ?subject WHERE { $this dcterms:subject ?subject . FILTER NOT EXISTS { SERVICE <repository:era-lex> { ?subject a ?subjectType . FILTER(?subjectType IN (era:IC, era:TSI)) } } }

DCSubjectNoICRequiresTSIFederatedSPARQL
type: SPARQLConstraint
severity: Violation
message: When no era:IC is linked as dcterms:subject, at least one era:TSI MUST be linked (types resolved in era-lex).
select: PREFIX era: <http://data.europa.eu/949/> PREFIX dcterms: <http://purl.org/dc/terms/> SELECT $this WHERE { FILTER NOT EXISTS { $this dcterms:subject ?ic . SERVICE <repository:era-lex> { ?ic a era:IC . } } FILTER NOT EXISTS { $this dcterms:subject ?tsi . SERVICE <repository:era-lex> { ?tsi a era:TSI . } } }

DCSubjectNoModuleDecisionFederatedSPARQL
type: SPARQLConstraint
severity: Violation
message: dcterms:subject MUST NOT be <http://data.europa.eu/eli/dec/2010/713/oj> (Module Decision).
select: PREFIX dcterms: <http://purl.org/dc/terms/> SELECT $this ?subject WHERE { $this dcterms:subject ?subject . FILTER(?subject = <http://data.europa.eu/eli/dec/2010/713/oj>) }

VPAComplianceFederatedSPARQL
type: SPARQLConstraint
severity: Warning
message: Both `dcterms:subject` and `vpa:checkedCompliance/vpa:checkedRequirement` are used to express compliance to TSI/IC. Prefer only one method.
select: PREFIX era: <http://data.europa.eu/949/> PREFIX vpa: <https://w3id.org/vpa#> PREFIX dcterms: <http://purl.org/dc/terms/> SELECT $this ?subj ?req ?check WHERE { $this dcterms:subject ?subj ; vpa:checkedCompliance ?check . ?check vpa:checkedRequirement ?req . FILTER EXISTS { SERVICE <repository:era-lex> { ?req a ?type2 . FILTER(?type2 IN (era:TSI, era:IC)) } } }

Certification Level Documents (CLD) Entry
type: NodeShape
target class: CertificationLevelDocument
node kind: IRI
comment: Certification Level Documents (CLD) issued by NoBos are: • EC Certificates • QMS-Approvals and whether these are Intermediate Statements of Verification (ISVs). The EU legislative documents 768/2008/EC, (EU) 2016/797, (EU) 2019/250 and 2010/713/EU establish a number of requirements on the content of CLDs.
creator: Maarten Duhoux
  source: https://orcid.org/0009-0003-6653-6123
  member of: ERA
version info: 3.3.0
created: 2024-10-25
property: DCIdentifier
property: VPAVersionNumber
property: DCCreated
property: DCIssued
property: DCReplaces
property: DCAvailable
property: DCType
property: DCSubject
property: VPACheckCompliance
property: DCDescription
property: SeeAlso
property: DCAudience
property: DCContributor
property: DCCreator
property: DCSource
property: DCSpatial
property: Comment
property: DCIsreplacedBy
property: ResultStatement
property: ValidityStatement
property: SequenceStatement
property: ResultAnnex
property: ResultReport
property: EDPChangeActivityPropertyShape
property: EDPStatePropertyShape
sparql: ConformsToSPARQL
sparql: CLDSKOS
sparql: VersionSPARQL
sparql: ConformsToSKOS
sparql: DCIsreplacedByVersionNumberSPARQL
sparql: DCIsreplacedByDCIssuedSPARQL
sparql: VPAComplianceFederatedSPARQL
sparql: DCAudienceOrganisationRoleFederatedSPARQL
sparql: DCAudienceRoleOfBodyFederatedSPARQL
sparql: DCAudienceAllowedRoleFederatedSPARQL
sparql: DCContributorOrganisationRoleFederatedSPARQL
sparql: DCContributorRoleOfBodyFederatedSPARQL
sparql: DCContributorAllowedRoleFederatedSPARQL
sparql: DCCreatorOrganisationRoleFederatedSPARQL
sparql: DCCreatorRoleOfBodyFederatedSPARQL
sparql: DCCreatorAllowedRoleFederatedSPARQL
sparql: DCSubjectNoModuleDecisionFederatedSPARQL
sparql: DCSubjectAllowedTypesFederatedSPARQL
sparql: DCSubjectNoICRequiresTSIFederatedSPARQL
sparql: DCSubjectAtMostOneICFederatedSPARQL
sparql: DCSourceNotTSIorICFederatedSPARQL

DCIdentifier
type: PropertyShape
path: identifier
affected property: identifier
name: CLD identifier
datatype: string
node kind: Literal
description: The CLD ID, as defined in RFU-STR-001.
message: The CLD ID, as defined in RFU-STR-001, MUST be present.
severity: Violation
min count: 1
max count: 1

VPAVersionNumber
type: PropertyShape
path: versionNumber
affected property: versionNumber
name: CLD Version Number
datatype: integer
node kind: Literal
description: The Version Counter of the CLD, as defined in RFU-STR-001.
message: The Version Counter of the CLD, as defined in RFU-STR-001, MUST be present.
severity: Violation
min count: 1
max count: 1

DCCreated
type: PropertyShape
path: created
affected property: created
name: CLD entry created in KG
datatype: date
node kind: Literal
description: Date the CLD was created in ERADIS+.
message: Date the CLD was created in ERADIS+ MUST be present.
severity: Violation
min count: 1
max count: 1

DCIssued
type: PropertyShape
path: issued
affected property: issued
name: CLD Issue date
datatype: date
node kind: Literal
description: Date the CLD was issued by the CAB.
message: Date the CLD was issued by the CAB, MUST be present.
severity: Violation
min count: 1
max count: 1

DCAvailable
type: PropertyShape
path: available
affected property: available
name: ERADIS Availability Date
datatype: date
node kind: Literal
description: Date when this CLD became available in the ERADIS public database.
message: ERADIS availability date SHOULD be present as xsd:date.
severity: Warning
min count: 1
max count: 1

DCReplaces
type: PropertyShape
path: replaces
affected property: replaces
name: Which CLD this CLD replaces
node kind: IRI
description: The previous CLD replaced by this one, if any.
message: (Check) This CLD replaces no other CLD.
severity: Warning
max count: 1

DCType
type: PropertyShape
path: type
affected property: type
name: CLD type
node kind: IRI
description: SKOS Concept indicating what type of CLD is represented.
message: Type of CLD MUST be present.
severity: Violation
min count: 1
max count: 1

ConformsToSPARQL
type: SPARQLConstraint
severity: Warning
message: No `era:Document` (representing ERA Technical Document 000MRA1044) is present in `dcterms:conformsTo`.
select: PREFIX dcterms: <http://purl.org/dc/terms/> PREFIX era: <http://data.europa.eu/949/> SELECT $this WHERE { FILTER NOT EXISTS { $this dcterms:conformsTo ?doc . ?doc a era:Document . } }

CLDSKOS
type: SPARQLConstraint
severity: Violation
description: CLD Module (SKOS Concept).
message: Module MUST be included as exactly ONE SKOS Concept (module).
select: PREFIX era: <http://data.europa.eu/949/> PREFIX skos: <http://www.w3.org/2004/02/skos/core#> PREFIX dcterms: <http://purl.org/dc/terms/> SELECT $this WHERE { $this dcterms:conformsTo ?doc . ?doc a skos:Concept . } GROUP BY $this HAVING (COUNT(?doc) != 1)

VersionSPARQL
type: SPARQLConstraint
severity: Violation
message: The `era:Document` in `dcterms:conformsTo` MUST not have a version 1.1 or 2017 as it was issued on {?issued}, which is after Decision ERA-ED-DEC 2110-2022 of 13/12/2022.
select: PREFIX dcterms: <http://purl.org/dc/terms/> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> PREFIX era: <http://data.europa.eu/949/> PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> SELECT $this ?doc ?comment ?issued WHERE { $this dcterms:conformsTo ?doc ; dcterms:issued ?issued . ?doc a era:Document ; rdfs:comment ?comment . FILTER( (CONTAINS(LCASE(STR(?comment)), "1.1") || CONTAINS(LCASE(STR(?comment)), "2017")) && (?issued > "2022-12-13"^^xsd:date) ) }

ConformsToSKOS
type: SPARQLConstraint
severity: Violation
message: No SKOS Concept (for the module) is present in dcterms:conformsTo.
select: PREFIX dcterms: <http://purl.org/dc/terms/> PREFIX skos: <http://www.w3.org/2004/02/skos/core#> SELECT $this WHERE { FILTER NOT EXISTS { $this dcterms:conformsTo ?mod . ?mod a skos:Concept . } }

DCSubject
type: PropertyShape
path: subject
affected property: subject
name: CLD Subject of Assessment
node kind: IRI
description: Object(s) of assessment, validated with federated checks from era-lex: not the Module Decision URI, at most one era:IC, and valid era:IC/era:TSI typing.
message: dcterms:subject MUST follow CLD rules: no Module Decision URI, at most one era:IC, and valid era:IC/era:TSI typing (with at least one era:TSI when no era:IC is present).
severity: Violation
min count: 1

VPACheckCompliance
type: PropertyShape
path: checkedCompliance
affected property: checkedCompliance
name: CLD Compliances Checked
node kind: BlankNodeOrIRI
or:
  class: CABAssessmentCheck
or:
  class: CABAuditCheck
description: Any compliance or audit checks (CABAssessmentCheck or CABAuditCheck) performed for this CLD.
message: CLD contains no compliance or audit checks (CABAssessmentCheck or CABAuditCheck).
severity: Warning
min count: 1

DCDescription
type: PropertyShape
path: description
affected property: description
name: CLD description
or:
  datatype: string
or:
  datatype: langString
node kind: Literal
description: Human-readable description of the CLD.
message: Human-readable Object of Assessment of the CLD MUST be present.
severity: Violation
min count: 1
max count: 1

SeeAlso
type: PropertyShape
path: seeAlso
affected property: seeAlso
name: CLD link to ERADIS URL
datatype: anyURI
node kind: Literal
description: The ERADIS or other URL of the CLD, if available.
message: (Check) No ERADIS or other URL of the CLD available?
severity: Warning
min count: 1
max count: 1

DCAudience
type: PropertyShape
path: audience
affected property: audience
name: Organisation receiving the CLD
node kind: IRI
description: The organisation using the CLD as Applicant. Cardinality and node kind are validated locally; role semantics are validated in the federated CLD shapes.
message: Organisation receiving the CLD as Applicant MUST be provided as one IRI in ERADIS-KG.
severity: Violation
min count: 1
max count: 1

DCContributor
type: PropertyShape
path: contributor
affected property: contributor
name: Involved organisations
node kind: BlankNodeOrIRI
description: Organisations involved in the assessment. Presence and node kind are validated locally; role semantics are validated in the federated CLD shapes.
severity: Warning
message: At least one organisation SHOULD be linked as dcterms:contributor.
min count: 1

DCCreator
type: PropertyShape
path: creator
affected property: creator
name: The CAB producing the CLD
node kind: IRI
description: CAB issuing the CLD. Cardinality and node kind are validated locally; role semantics are validated in the federated CLD shapes.
severity: Violation
message: Exactly one issuing organisation MUST be linked as dcterms:creator.
min count: 1
max count: 1

DCSource
type: PropertyShape
path: source
affected property: source
name: CLD: Covered Directives
node kind: IRI
class: Requirement
description: Legal Requirement(s), but not TSI's, covered by the CLD. Must be a `vpa:Requirement`, and NOT an `era:TSI` or `era:IC`.
message: The property `dcterms:source` MUST be present and link to a `vpa:Requirement` that is not an `era:TSI` nor an `era:IC`.
min count: 1

DCSpatial
type: PropertyShape
path: spatial
affected property: spatial
name: CLD: spatial validity to a Site
node kind: BlankNodeOrIRI
class: Site
description: Manufacturing or assessment site(s), if relevant.
message: No Manufacturing or assessment site(s) mentioned in the CLD.
severity: Warning
min count: 1

Comment
type: PropertyShape
path: comment
affected property: comment
name: CLD comment
or:
  datatype: string
or:
  datatype: langString
node kind: Literal
description: Free-text comment about the CLD.
message: No Free-text comment about the CLD is present
severity: Warning
min count: 1
max count: 1

DCIsreplacedBy
type: PropertyShape
path: isReplacedBy
affected property: isReplacedBy
name: Replacing CLD
node kind: IRI
description: IRI of the newer CLD that replaces this one, if any.
message: (Check) This CLD is not linking to a newer CLD.
severity: Warning
min count: 1
max count: 1

DCIsreplacedByVersionNumberSPARQL
type: SPARQLConstraint
severity: Violation
message: If `dcterms:isReplacedBy` is present, the replacing CLD MUST have a higher `vpa:versionNumber` than this CLD.
select: PREFIX vpa: <https://w3id.org/vpa#> PREFIX dcterms: <http://purl.org/dc/terms/> SELECT $this ?replacer ?thisVersion ?replacerVersion WHERE { OPTIONAL { $this vpa:versionNumber ?thisVersion . } OPTIONAL { $this dcterms:isReplacedBy ?replacer . ?replacer vpa:versionNumber ?replacerVersion . } FILTER(bound(?replacer) && bound(?thisVersion) && bound(?replacerVersion) && (?replacerVersion <= ?thisVersion)) }

DCIsreplacedByDCIssuedSPARQL
type: SPARQLConstraint
message: If `dcterms:isReplacedBy` is present, the replacing CLD MUST have a later `dcterms:issued` date than this CLD.
severity: Violation
select: PREFIX dcterms: <http://purl.org/dc/terms/> SELECT $this ?replacer ?thisIssued ?replacerIssued WHERE { OPTIONAL { $this dcterms:issued ?thisIssued . } OPTIONAL { $this dcterms:isReplacedBy ?replacer . ?replacer dcterms:issued ?replacerIssued . } FILTER(bound(?replacer) && bound(?thisIssued) && bound(?replacerIssued) && (?replacerIssued <= ?thisIssued)) }

ResultStatement
type: PropertyShape
path: resultStatement
affected property: resultStatement
name: CLD Assessment Result
datatype: langString
node kind: Literal
description: Assessment result (free text, required).
message: Assessment result is required.
severity: Warning
min count: 1
max count: 1

ValidityStatement
type: PropertyShape
path: validityStatement
affected property: validityStatement
name: CLD Validity Statement
datatype: langString
node kind: Literal
description: Validity statement (free text, required).
message: Validity statement is required.
severity: Warning
min count: 1
max count: 1

SequenceStatement
type: PropertyShape
path: sequenceStatement
affected property: sequenceStatement
name: CLD Sequence Statement
datatype: langString
node kind: Literal
description: Sequence statement (free text, optional).
message: Sequence statement is not present.
severity: Warning
min count: 1
max count: 1

CAB Assessment/Audit Check
type: NodeShape
comment: Validates conformity assessment or audit checks performed by Conformity Assessment Bodies (CABs) within CLD documentation.
target class: CABAssessmentCheck
target class: CABAuditCheck
node kind: IRI
property: CABCheckCheckedSection
property: CABCheckComplianceResult
property: CABCheckIsOptional
property: CABCheckCheckedRequirement
property: CABCheckWithRestriction
property: CABCheckComment
property: CABCheckSeeAlso

CABCheckCheckedSection
type: PropertyShape
path: checkedSection
affected property: checkedSection
name: Sections checked
node kind: IRI
description: Section of the legal text checked in this check.
message: The CAB's Check does not refer to a section of legal text.
severity: Warning
min count: 1

CABCheckComplianceResult
type: PropertyShape
path:
  alternative path: isCompliant
affected property: isCompliant
affected class: Compliance
name: Compliance Check Result
or:
  datatype: boolean
  node kind: Literal
  description: Whether the section is compliant (true/false) using vpa:isCompliant.
or:
  node kind: IRI
  class: Concept
  description: IRI to a skos:Concept indicating compliance (Y/N/P) using era:isCompliant.
message: The CAB's Check has not expressed compliance using either `vpa:isCompliant` or `era:isCompliant`.
severity: Warning
max count: 1
min count: 1

CABCheckIsOptional
type: PropertyShape
path: isOptional
affected class: Compliance
affected property: isOptional
name: Optional Compliance Check
datatype: boolean
node kind: Literal
description: Indicates whether the CAB check concerns an optional function or optional requirement.
message: The CAB's Check optional flag must be expressed as a boolean value.
severity: Warning
max count: 1
min count: 0

CABCheckCheckedRequirement
type: PropertyShape
path: checkedRequirement
affected property: checkedRequirement
name: The Legal source of the check
node kind: IRI
description: Legal requirement(s) checked in this check.
message: The CAB's Check has not cited the Legal reference used (TSI, or other LegalWork).
severity: Warning
min count: 1

CABCheckWithRestriction
type: PropertyShape
path: withRestriction
affected property: withRestriction
name: Restriction formulated during Check
node kind: BlankNodeOrIRI
class: CABRestriction
description: Restriction, addition, or condition (CLOU) attached to this check.
message: The CAB's Check has not expressed any Restriction.
severity: Warning
min count: 1

CABCheckComment
type: PropertyShape
path: comment
affected property: comment
name: Check comment
or:
  datatype: string
or:
  datatype: langString
node kind: Literal
description: Free-text comment about the check.
message: The CAB's Check was not commented.
severity: Warning
max count: 1
min count: 1

CABCheckSeeAlso
type: PropertyShape
path: seeAlso
affected property: seeAlso
name: see Also
datatype: anyURI
node kind: Literal
description: Reference to supporting documents or reports.
message: The CAB's Check has not refered to a further documented reference URL.
severity: Warning
min count: 1

TSI Conformity Shape
type: NodeShape
comment: Validates TSI conformity declarations for vehicle types, ensuring proper documentation of compliance checks and restrictions.
created: 2024-10-25
property: TSIConformityRegarding

TSIConformityRegarding
type: PropertyShape
path: regarding
affected property: regarding
name: TSI Check restriction related to TSI
node kind: IRI
class: Requirement
description: The TSI for which conformity was checked in this VehicleType. Selection from a predefined list of vehicle related TSIs (both in force and those that were previously in force) (multiple selection possible)
message: The TSI conformity did not express what TSI was the source.
severity: Violation
min count: 1

Vehicle Type Certificate: Conformity with TSI - compliance check
type: NodeShape
comment: This shape validates that a vehicle type includes proper compliance checks (section 2.2 or 2.3 of the certificate) ensuring conformity with applicable TSIs.
created: 2024-10-25
source: http://data.europa.eu/eli/dec_impl/2011/665/2023-09-08
property: TSIComplianceCheckChecked
property: TSIComplianceCheckResult
property: TSIComplianceCheckCheckedSection
property: TSIComplianceCheckForConfiguration

TSIComplianceCheckChecked
type: PropertyShape
path:
  inverse path: checked
affected property: checked
name: checked
class: CertificationLevelDocument
eratv index: 2.2
description: The certificate, to be mentioned under 2.2 of the VehicleType, which examined Sections and Specific Cases, and their conclusion.
message: The certificate, to be mentioned under 2.2 of the VehicleType, which examined Sections and Specific Cases, and their conclusion. EC certificate of verification : Reference of 'EC type examination certificates' (if module SB applied) and/or 'EC design examination certificates' (if module SH1 applied)
severity: Warning
min count: 1

TSIComplianceCheckResult
type: PropertyShape
path: isCompliant
affected property: isCompliant
name: TSI Compliance Check Result
node kind: IRI
in skos concept scheme: ConformityResults
class: Concept
description: Y: Compliant, N: Non-compliant, P: Partially compliant.
message: The type's TSI Compliance Check has not expressed compliance using `era:isCompliant`.
severity: Warning
max count: 1
min count: 1

TSIComplianceCheckCheckedSection
type: PropertyShape
path: checkedSection
affected property: checkedSection
name: TSI Compliance Check (Section checked)
node kind: IRI
max count: 1
min count: 1
or:
  in skos concept scheme: TSISpecificCases
  class: Concept
  description: Applicable specific cases (specific cases conformity with which has been assessed).
  message: The type's TSI Compliance Check does not contain `Applicable specific cases`.
  severity: Warning
  eratv index: 2.3
or:
  in skos concept scheme: TSISections
  class: Concept
  description: Sections of TSI not complied with.
  message: The type's TSI Compliance Check does not contain `Sections of TSI not complied with`.
  severity: Warning
  eratv index: 2.1

TSIComplianceCheckForConfiguration
type: PropertyShape
path: forConfiguration
affected property: forConfiguration
name: Compliance Check TSI valid for Configuration
node kind: IRI
class: VehicleTypeConfiguration
description: Links the compliance check to the specific vehicle configuration it applies to.
min count: 1
severity: Violation
message: The type's TSI Compliance Check does not contain a link to the Configuration it is applicable for.

CLD Validity Shape
type: NodeShape
comment: Validates that CLD has a validity property with a valid time interval using either start/end dates or start/duration.
target class: CertificationLevelDocument
node kind: IRI
or:
  property:
    path: valid
    affected property: valid
    name: Validity Interval (Begin/End)
    description: The validity interval for the CLD (should have a valid beginning and end date).
    qualified value shape: StartEndValidityShape
    qualified min count: 1
    qualified max count: 1
    max count: 1
or:
  property:
    path: valid
    affected property: valid
    name: Validity Interval (Begin/Duration)
    description: The validity interval for the CLD (should have a valid beginning and duration in years).
    qualified value shape: StartDurationShape
    qualified min count: 1
    qualified max count: 1
    max count: 1
message: CLD must have a validity property with a valid time interval.

ResultAnnex
type: PropertyShape
path: resultAnnex
affected property: resultAnnex
affected class: CertificationLevelDocument
name: Assessment/audit result annex
node kind: Literal
datatype: string
min count: 0
max count: 1
description: Annex of the assessment/audit result.
message: resultAnnex: The value must be a string.
severity: Violation

ResultReport
type: PropertyShape
path: resultReport
affected property: resultReport
affected class: CertificationLevelDocument
name: Assessment/audit result report/file
node kind: Literal
datatype: string
min count: 0
max count: 1
description: Report about the assessment/audit result, such as a NoBo File or NoBo Conformity Assessment Report, with identifier, revision and date.
message: resultReport: The value must be a string.
severity: Violation

Declaration of Conformity to an Authorised Vehicle Type
type: NodeShape
target: SPARQLTarget
  select: SELECT ?this WHERE { ?this a <http://data.europa.eu/949/ECDeclaration> ; <http://purl.org/dc/terms/type> <http://data.europa.eu/949/concepts/ecd-types/ECDoC2T> . }
comment: Validates Declaration of Conformity to an Authorised Vehicle Type according to EU Regulation 2016/797 and Decision 2018/545.
creator: Maarten Duhoux
  source: https://orcid.org/0009-0003-6653-6123
  member of: ERA
editorial note: These declarations are not published in ERADIS, but exist in the context of `era:VehicleAuthorisationApplication`
version info: 3.3.0
created: 2026-02-06
property: DC2TIdentifier
property: DC2TType
property: DC2TVersionNumber
property: DC2TCreated
property: DC2TIssued
property: DC2TAvailable
property: DC2TCreator
property: DC2TContributor
property: DC2TCoverage
property: DC2TSubject
property: DC2TLabel
property: DC2TComment
property: DC2TSeeAlso
property: DC2TReplaces
property: DC2TStatus
sparql: DC2TReplacementVersionSPARQL
sparql: DC2TReplacementDateSPARQL

DC2TType
type: PropertyShape
path: type
affected property: type
name: Declaration Type
node kind: IRI
has value: ECDoC2T
description: Type of Declaration: must be ECDoC2T (Declaration of Conformity to Type).
message: Declaration type MUST be ECDoC2T (Declaration of Conformity to an Authorised Vehicle Type).
severity: Violation
min count: 1
max count: 1

DC2TIdentifier
type: PropertyShape
path: identifier
affected property: identifier
name: Declaration Identifier
datatype: string
node kind: Literal
description: Unique identifier for the Declaration.
message: Declaration identifier SHOULD be present.
severity: Warning
min count: 1
max count: 1

DC2TVersionNumber
type: PropertyShape
path: versionNumber
affected property: versionNumber
name: Version Number
datatype: integer
node kind: Literal
description: Sequential version number of this Declaration (starts at 1, increments with each revision).
min inclusive: 1
message: Version number MUST be a positive integer starting from 1.
severity: Violation
min count: 1
max count: 1

DC2TCreated
type: PropertyShape
path: created
affected property: created
name: Creation Date
datatype: date
node kind: Literal
description: Date when this Declaration resource was created in the knowledge graph.
message: Knowledge graph creation date MUST be present as xsd:date.
severity: Violation
min count: 1
max count: 1

DC2TIssued
type: PropertyShape
path: issued
affected property: issued
name: Document Issue Date
datatype: date
node kind: Literal
description: Official date when the applicant issued this Declaration document.
message: Document issue date MUST be present as xsd:date.
severity: Violation
min count: 1
max count: 1

DC2TAvailable
type: PropertyShape
path: available
affected property: available
name: Availability Date
datatype: date
node kind: Literal
description: Date when this Declaration became available in the public database.
message: Availability date SHOULD be present as xsd:date.
severity: Warning
min count: 1
max count: 1

DC2TCreator
type: PropertyShape
path: creator
affected property: creator
name: Applicant (Declaration Issuer)
class: OrganisationRole
node kind: BlankNodeOrIRI
description: The applicant issuing this Declaration (must be an era:OrganisationRole with role 'Applicant').
message: Declaration MUST have exactly one applicant as creator (era:OrganisationRole with role Applicant).
severity: Violation
min count: 1
max count: 1
node:
  property: DC2TCreatorRoleOf
  property: DC2TCreatorOrganisationRole

DC2TCreatorRoleOf
type: PropertyShape
path: roleOf
affected property: roleOf
name: Applicant Body IRI
node kind: IRI
class: Body
description: The legal entity (era:Body) acting as applicant.
message: The OrganisationRole MUST link to exactly one era:Body representing the applicant.
severity: Violation
min count: 1
max count: 1

DC2TCreatorOrganisationRole
type: PropertyShape
path: hasOrganisationRole
affected property: hasOrganisationRole
name: Applicant Role
node kind: IRI
description: Must be the 'Applicant' role from the ERA controlled vocabulary.
has value: Applicant
message: The creator OrganisationRole MUST have the role 'Applicant'.
severity: Violation
min count: 1
max count: 1

DC2TContributor
type: PropertyShape
path: contributor
affected property: contributor
name: Contributing Organizations
class: OrganisationRole
node kind: BlankNodeOrIRI
description: Organizations contributing to the Declaration (e.g., Notified Bodies, assessment bodies).
message: Contributing organizations SHOULD be specified as era:OrganisationRole instances.
severity: Warning
min count: 0
node:
  property: DC2TContributorRoleOf
  property: DC2TContributorOrganisationRole

DC2TContributorRoleOf
type: PropertyShape
path: roleOf
affected property: roleOf
name: Contributing Body IRI
node kind: IRI
class: Body
description: The legal entity (era:Body) acting as contributor.
message: The contributor OrganisationRole MUST link to exactly one era:Body.
severity: Violation
min count: 1
max count: 1

DC2TContributorOrganisationRole
type: PropertyShape
path: hasOrganisationRole
affected property: hasOrganisationRole
name: Contributor Role
node kind: IRI
description: Role from ERA controlled vocabulary (e.g., NoBo, DeBo, AssessmentBody).
in: NoBo
in: DeBo
in: AssessmentBody
in: CAB
message: The contributor MUST have a valid role (NoBo, DeBo, AssessmentBody, or CAB).
severity: Violation
min count: 1
max count: 1

DC2TCoverage
type: PropertyShape
path: coverage
affected property: coverage
name: Vehicle Type(s) covered by this Declaration
node kind: IRI
class: VehicleType
description: The Vehicle Type(s) as declared in scope of this Declaration
message: Declaration MUST reference at least one registered vehicle Type.
severity: Violation
min count: 1

DC2TSubject
type: PropertyShape
path: subject
affected property: subject
name: Subject of Declaration (Vehicles or VehiclesSet)
node kind: IRI
or:
  class: Vehicle
or:
  class: VehicleSet
description: The specific (set of) vehicles which is the subject of the DC2T.
message: Declaration MUST declare conformity to at least one vehicle per covered vehicle type.
severity: Violation
editorial note: SHACL-rule fails to protect against missing vehicles for a certain type.
min count: 1

DC2TLabel
type: PropertyShape
path: label
affected property: label
name: Declaration Title
datatype: string
node kind: Literal
description: Brief title describing the subject of the declaration (e.g., project name of C2T).
message: Declaration MUST have a human-readable title (rdfs:label).
severity: Violation
min count: 1
max count: 1

DC2TComment
type: PropertyShape
path: comment
affected property: comment
name: Additional Comments
or:
  datatype: string
or:
  datatype: langString
node kind: Literal
description: Free-text comment providing additional information about the declaration.
message: Declaration SHOULD include a comment for additional context.
severity: Warning
min count: 1
max count: 1

DC2TSeeAlso
type: PropertyShape
path: seeAlso
affected property: seeAlso
name: Reference URL
datatype: anyURI
node kind: Literal
description: Link to the Declaration document in a public database.
message: Declaration MAY include an URL
severity: Warning
min count: 0
max count: 1

DC2TReplaces
type: PropertyShape
path: replaces
affected property: replaces
name: Replaced Declaration
node kind: IRI
class: ECDeclaration
description: Reference to the previous version of this Declaration, if this is a revised version.
message: If present, dcterms:replaces MUST reference another era:ECDeclaration.
severity: Info
max count: 1

DC2TStatus
type: PropertyShape
path: state
affected property: state
name: Declaration Status
node kind: IRI
class: Concept
description: Current lifecycle status of the declaration (e.g., valid, revoked, superseded).
message: Declaration SHOULD have a status indicating its current validity (valid/revoked/superseded).
severity: Warning
min count: 1
max count: 1

DC2TReplacementVersionSPARQL
type: SPARQLConstraint
severity: Violation
message: If dcterms:replaces is present, this Declaration MUST have a higher vpa:versionNumber than the replaced declaration.
select: PREFIX vpa: <https://w3id.org/vpa#> PREFIX dcterms: <http://purl.org/dc/terms/> SELECT $this ?replaced ?thisVersion ?replacedVersion WHERE { $this dcterms:replaces ?replaced ; vpa:versionNumber ?thisVersion . ?replaced vpa:versionNumber ?replacedVersion . FILTER(?thisVersion <= ?replacedVersion) }

DC2TReplacementDateSPARQL
type: SPARQLConstraint
severity: Violation
message: If dcterms:replaces is present, this Declaration MUST have a later dcterms:issued date than the replaced declaration.
select: PREFIX dcterms: <http://purl.org/dc/terms/> SELECT $this ?replaced ?thisIssued ?replacedIssued WHERE { $this dcterms:replaces ?replaced ; dcterms:issued ?thisIssued . ?replaced dcterms:issued ?replacedIssued . FILTER(?thisIssued <= ?replacedIssued) }

EC Declaration
type: NodeShape
target: SPARQLTarget
  select: SELECT ?this WHERE { ?this a <http://data.europa.eu/949/ECDeclaration> ; <http://purl.org/dc/terms/type> ?type . FILTER(?type IN ( <http://data.europa.eu/949/concepts/ecd-types/ECDoC>, <http://data.europa.eu/949/concepts/ecd-types/ECDoSU> )) }
comment: Validates EC Declarations of Conformity and Suitability for Use according to EU Regulation 2016/797.
creator: Maarten Duhoux
  source: https://orcid.org/0009-0003-6653-6123
  member of: ERA
version info: 3.3.0
created: 2025-10-11
property: ECDIdentifier
property: ECDType
property: ECDVersionNumber
property: ECDCreated
property: ECDIssued
property: ECDAvailable
property: ECDCreator
property: ECDContributor
property: ECDCoverage
property: ECDSubject
property: ECDLabel
property: ECDComment
property: ECDSeeAlso
property: ECDReplaces
property: ECDStatus
property: ECDRequires
sparql: ECDReplacementVersionSPARQL
sparql: ECDReplacementDateSPARQL
sparql: ECDEvidenceConsistencySPARQL

ECDIdentifier
type: PropertyShape
path: identifier
affected property: identifier
name: EC Declaration Identifier
datatype: string
node kind: Literal
description: Unique identifier for the EC Declaration in format: CC/NNNNNNNNNNNNNN/YYYY/NNNNNN where CC=country code, N=alphanumeric, YYYY=year.
pattern: ^[A-Z]{2}/[A-Z0-9]{14}/[0-9]{4}/[0-9]{6}$
message: EC Declaration identifier MUST follow the pattern CC/NNNNNNNNNNNNNN/YYYY/NNNNNN (e.g., AT/000000FN93653a/2021/001714).
severity: Violation
min count: 1
max count: 1

ECDType
type: PropertyShape
path: type
affected property: type
name: EC Declaration Type
node kind: IRI
description: Type of EC Declaration: ECDoC (Conformity) or ECDoSU (Suitability for Use).
in: ECDoC
in: ECDoSU
message: EC Declaration type MUST be either ECDoC (Declaration of Conformity) or ECDoSU (Declaration of Suitability for Use).
severity: Violation
min count: 1
max count: 1

ECDVersionNumber
type: PropertyShape
path: versionNumber
affected property: versionNumber
name: Version Number
datatype: integer
node kind: Literal
description: Sequential version number of this EC Declaration (starts at 1, increments with each revision).
min inclusive: 1
message: Version number MUST be a positive integer starting from 1.
severity: Violation
min count: 1
max count: 1

ECDCreated
type: PropertyShape
path: created
affected property: created
name: Creation Date in ERADIS+
datatype: date
node kind: Literal
description: Date when this EC Declaration resource was created in the ERADIS+ knowledge graph.
message: Knowledge graph creation date MUST be present as xsd:date.
severity: Violation
min count: 1
max count: 1

ECDIssued
type: PropertyShape
path: issued
affected property: issued
name: Document Issue Date
datatype: date
node kind: Literal
description: Official date when the manufacturer issued this EC Declaration document.
message: Document issue date MUST be present as xsd:date.
severity: Violation
min count: 1
max count: 1

ECDAvailable
type: PropertyShape
path: available
affected property: available
name: ERADIS Availability Date
datatype: date
node kind: Literal
description: Date when this EC Declaration became available in the ERADIS public database.
message: ERADIS availability date SHOULD be present as xsd:date.
severity: Warning
min count: 1
max count: 1

ECDCreator
type: PropertyShape
path: creator
affected property: creator
name: Manufacturer (Declaration Issuer)
class: OrganisationRole
node kind: BlankNodeOrIRI
description: The manufacturer issuing this EC Declaration (must be an era:OrganisationRole with role 'Manufacturer').
message: EC Declaration MUST have exactly one manufacturer as creator (era:OrganisationRole with role Manufacturer).
severity: Violation
min count: 1
max count: 1
node:
  property: ECDCreatorRoleOf
  property: ECDCreatorOrganisationRole

ECDCreatorRoleOf
type: PropertyShape
path: roleOf
affected property: roleOf
name: Manufacturer Body IRI
node kind: IRI
class: Body
description: The legal entity (era:Body) acting as manufacturer.
message: The OrganisationRole MUST link to exactly one era:Body representing the manufacturer.
severity: Violation
min count: 1
max count: 1

ECDCreatorOrganisationRole
type: PropertyShape
path: hasOrganisationRole
affected property: hasOrganisationRole
name: Manufacturer Role
node kind: IRI
description: Must be the 'Manufacturer' role from the ERA controlled vocabulary.
has value: Manufacturer
message: The creator OrganisationRole MUST have the role 'Manufacturer'.
severity: Violation
min count: 1
max count: 1

ECDContributor
type: PropertyShape
path: contributor
affected property: contributor
name: Contributing Organizations
class: OrganisationRole
node kind: BlankNodeOrIRI
description: Organizations contributing to the EC Declaration (e.g., Notified Bodies, assessment bodies).
message: Contributing organizations SHOULD be specified as era:OrganisationRole instances.
severity: Warning
min count: 0
node:
  property: ECDContributorRoleOf
  property: ECDContributorOrganisationRole

ECDContributorRoleOf
type: PropertyShape
path: roleOf
affected property: roleOf
name: Contributing Body IRI
node kind: IRI
class: Body
description: The legal entity (era:Body) acting as contributor.
message: The contributor OrganisationRole MUST link to exactly one era:Body.
severity: Violation
min count: 1
max count: 1

ECDContributorOrganisationRole
type: PropertyShape
path: hasOrganisationRole
affected property: hasOrganisationRole
name: Contributor Role
node kind: IRI
description: Role from ERA controlled vocabulary (e.g., NoBo, DeBo, AssessmentBody).
in: NoBo
in: DeBo
in: AssessmentBody
in: CAB
message: The contributor MUST have a valid role (NoBo, DeBo, AssessmentBody, or CAB).
severity: Violation
min count: 1
max count: 1

ECDCoverage
type: PropertyShape
path: coverage
affected property: coverage
name: Applicable EU Legislation
node kind: IRI
class: Requirement
description: EU Directives, Regulations, or Decisions covered by this declaration (references to ERALEX).
message: EC Declaration MUST reference at least one applicable EU legal instrument (Directive/Regulation/Decision).
severity: Violation
min count: 1

ECDSubject
type: PropertyShape
path: subject
affected property: subject
name: Subject of Declaration (IC/Subsystem)
node kind: IRI
or:
  class: IC
or:
  class: TSI
or:
  class: Requirement
description: The specific Interoperability Constituent (IC), TSI section, or requirement that this declaration addresses.
message: EC Declaration MUST declare conformity to at least one IC, TSI, or specific requirement.
severity: Violation
min count: 1

ECDLabel
type: PropertyShape
path: label
affected property: label
name: Declaration Title
datatype: string
node kind: Literal
description: Brief title describing the subject of the declaration (e.g., product name or component type).
message: EC Declaration MUST have a human-readable title (rdfs:label).
severity: Violation
min count: 1
max count: 1

ECDComment
type: PropertyShape
path: comment
affected property: comment
name: Additional Comments
or:
  datatype: string
or:
  datatype: langString
node kind: Literal
description: Free-text comment providing additional information about the declaration.
message: EC Declaration SHOULD include a comment for additional context.
severity: Warning
min count: 1
max count: 1

ECDSeeAlso
type: PropertyShape
path: seeAlso
affected property: seeAlso
name: ERADIS Reference URL
datatype: anyURI
node kind: Literal
description: Link to the EC Declaration document in the ERADIS public database.
pattern: ^https://eradis\.era\.europa\.eu/interop_docs/ecDecl/view\.aspx\?id=[0-9]+$
message: EC Declaration SHOULD include an ERADIS URL following the pattern: https://eradis.era.europa.eu/interop_docs/ecDecl/view.aspx?id=NNNNN
severity: Warning
min count: 1
max count: 1

ECDRequires
type: PropertyShape
path: requires
affected property: requires
name: Supporting Evidence
class: CABEvidence
node kind: BlankNodeOrIRI
description: Evidence from Conformity Assessment Bodies (CABs) supporting this EC Declaration. Each evidence set references test reports and certificates via CLD identifiers.
message: EC Declaration MUST be supported by at least one set of CAB evidence (test reports, certificates).
severity: Violation
min count: 1
node: CAB Evidence Set

CAB Evidence Set
type: NodeShape
target class: CABEvidence
node kind: IRI
comment: A collection of supporting documents (test reports, certificates) from a Conformity Assessment Body.
property: CABEvidenceDocuments

CABEvidenceDocuments
type: PropertyShape
path: member
affected property: member
name: Evidence Documents
node kind: BlankNodeOrIRI
description: Individual CLD references (Certification Level Document entries) for test reports and certificates.
message: CAB Evidence MUST contain at least one CLD reference (test report or certificate).
severity: Violation
min count: 1
node: CLDReferenceValueShape

CLD Reference
type: NodeShape
target class: CertificationLevelDocument
node kind: IRI
comment: A reference to a test report or certificate in the Certification Level Document.

CLDReferenceValueShape
type: NodeShape
or:
  node kind: IRI
  class: CertificationLevelDocument
or:
  node kind: BlankNode
  property: CLDReferenceIdentifier
message: CLD reference MUST be either a direct IRI to an existing CLD resource OR a blank node with a valid CLD identifier.

CLDReferenceIdentifier
type: PropertyShape
path: identifier
affected property: identifier
name: CLD Identifier
datatype: string
node kind: Literal
description: CLD identifier in format: NNNN/N/CCN/YYYY/AAA/LL/NNNN[/VNN] where NNNN=NoBo number, N=type, CC=country, YYYY=year, AAA=abbreviation, LL=language, NNNN=sequential, VNN=version.
pattern: ^[0-9]{4}/[0-9]/[A-Z]{2}[0-9]/[0-9]{4}/[A-Z]{3}/[A-Z]{2}/[0-9]{4}(/V[0-9]+)?$
message: CLD identifier MUST follow the pattern NNNN/N/CCN/YYYY/AAA/LL/NNNN[/VNN] (e.g., 1714/2/CH1/2020/RST/EN/3474 or 1714/4/CH1/2020/RST/EN/3451/V15).
severity: Violation
min count: 1
max count: 1

ECDReplaces
type: PropertyShape
path: replaces
affected property: replaces
name: Replaced Declaration
node kind: IRI
class: ECDeclaration
description: Reference to the previous version of this EC Declaration, if this is a revised version.
message: If present, dcterms:replaces MUST reference another era:ECDeclaration.
severity: Info
max count: 1

ECDStatus
type: PropertyShape
path: status
affected property: state
name: Declaration Status
node kind: IRI
class: Concept
description: Current lifecycle status of the declaration (e.g., valid, revoked, superseded).
message: EC Declaration SHOULD have a status indicating its current validity (valid/revoked/superseded).
severity: Warning
min count: 1
max count: 1

ECDReplacementVersionSPARQL
type: SPARQLConstraint
severity: Violation
message: If dcterms:replaces is present, this EC Declaration MUST have a higher vpa:versionNumber than the replaced declaration.
select: PREFIX vpa: <https://w3id.org/vpa#> PREFIX dcterms: <http://purl.org/dc/terms/> SELECT $this ?replaced ?thisVersion ?replacedVersion WHERE { $this dcterms:replaces ?replaced ; vpa:versionNumber ?thisVersion . ?replaced vpa:versionNumber ?replacedVersion . FILTER(?thisVersion <= ?replacedVersion) }

ECDReplacementDateSPARQL
type: SPARQLConstraint
severity: Violation
message: If dcterms:replaces is present, this EC Declaration MUST have a later dcterms:issued date than the replaced declaration.
select: PREFIX dcterms: <http://purl.org/dc/terms/> SELECT $this ?replaced ?thisIssued ?replacedIssued WHERE { $this dcterms:replaces ?replaced ; dcterms:issued ?thisIssued . ?replaced dcterms:issued ?replacedIssued . FILTER(?thisIssued <= ?replacedIssued) }

ECDEvidenceConsistencySPARQL
type: SPARQLConstraint
severity: Warning
message: All CLD references within a single CABEvidence set SHOULD originate from the same Notified Body (same NoBo number prefix).
select: PREFIX dcterms: <http://purl.org/dc/terms/> PREFIX era: <http://data.europa.eu/949/> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> SELECT $this ?evidence ?member1 ?id1 ?member2 ?id2 WHERE { $this dcterms:requires ?evidence . ?evidence a era:CABEvidence ; rdfs:member ?member1 , ?member2 . ?member1 dcterms:identifier ?id1 . ?member2 dcterms:identifier ?id2 . # Extract NoBo number (first 4 digits before first slash) BIND(SUBSTR(?id1, 1, 4) AS ?nobo1) BIND(SUBSTR(?id2, 1, 4) AS ?nobo2) FILTER(?member1 != ?member2 && ?nobo1 != ?nobo2) }

Evidence Document / Permission as PROV Entity
type: NodeShape
target class: CertificationLevelDocument
target class: Certificate
node kind: IRI
comment: Validates PROV-O entity properties on a CLD or Certificate (both subclasses of vpa:EvidenceDocument / vpa:Permission). Both are implicitly prov:Entities. This shape checks that provenance links (wasGeneratedBy, wasInvalidatedBy, wasDerivedFrom) are consistent when present.
property: EDPEntityWasGeneratedBy
property: EDPEntityWasInvalidatedBy
property: EDPEntityWasDerivedFrom
property: EDPEntityWasAttributedTo
property: EDPEntityGeneratedAtTime
property: EDPStatePropertyShape
sparql: DerivedFromReplacesSPARQL
sparql: InvalidatedStateSPARQL

EDPEntityWasGeneratedBy
type: PropertyShape
path: wasGeneratedBy
affected property: wasGeneratedBy
name: Generated by Activity
node kind: IRI
class: Activity
description: The prov:Activity that generated (created) this entity. Present when it was produced by a versioning activity (EDPSubmit, EDPReplace, EDPRenew).
message: (Info) No prov:Activity recorded as having generated this entity.
severity: Info
max count: 1

EDPEntityWasInvalidatedBy
type: PropertyShape
path: wasInvalidatedBy
affected property: wasInvalidatedBy
name: Invalidated by Activity
node kind: IRI
class: Activity
description: The prov:Activity that invalidated this entity (revocation, withdrawal, or replacement by a newer version).
message: (Info) No prov:Activity recorded as having invalidated this entity.
severity: Info
max count: 1

EDPEntityWasDerivedFrom
type: PropertyShape
path: wasDerivedFrom
affected property: wasDerivedFrom
name: Derived from parent entity
node kind: IRI
or:
  class: CertificationLevelDocument
or:
  class: Certificate
description: The parent CLD or Certificate from which this one was derived (i.e. replaced). This is the inverse provenance view of dcterms:isReplacedBy.
message: (Info) This entity does not declare a parent it was derived from.
severity: Info
max count: 1

EDPEntityWasAttributedTo
type: PropertyShape
path: wasAttributedTo
affected property: wasAttributedTo
name: Attributed to Agent
node kind: IRI
description: The prov:Agent (typically an era:Body or era:OrganisationRole) to whom the entity is attributed.
message: (Info) No prov:Agent is attributed to this entity.
severity: Info

EDPEntityGeneratedAtTime
type: PropertyShape
path: generatedAtTime
affected property: generatedAtTime
name: Entity generation time
datatype: dateTime
node kind: Literal
description: The point in time at which this entity (as prov:Entity) was generated. Should be consistent with dcterms:issued.
message: If prov:generatedAtTime is present, it MUST be an xsd:dateTime.
severity: Warning
max count: 1

DerivedFromReplacesSPARQL
type: SPARQLConstraint
severity: Warning
message: This entity has `prov:wasDerivedFrom` {?parent}, but does not also declare `dcterms:replaces` pointing to the same parent, or vice versa.
select: PREFIX dcterms: <http://purl.org/dc/terms/> PREFIX prov: <http://www.w3.org/ns/prov#> SELECT $this ?parent WHERE { { $this prov:wasDerivedFrom ?parent . FILTER NOT EXISTS { $this dcterms:replaces ?parent } } UNION { $this dcterms:replaces ?parent . FILTER NOT EXISTS { $this prov:wasDerivedFrom ?parent } } }

InvalidatedStateSPARQL
type: SPARQLConstraint
severity: Warning
message: This entity was invalidated by an Activity, but its era:state is not set to Revoked, Withdrawn, Suspended, or Rejected.
select: PREFIX dcterms: <http://purl.org/dc/terms/> PREFIX prov: <http://www.w3.org/ns/prov#> PREFIX era: <http://data.europa.eu/949/> PREFIX era-states-eratv: <http://data.europa.eu/949/concepts/states/eratv/> SELECT $this ?state WHERE { $this prov:wasInvalidatedBy ?act . OPTIONAL { $this era:state ?state } FILTER( !bound(?state) || ?state NOT IN ( era-states-eratv:revoked, era-states-eratv:withdrawn, era-states-eratv:suspended, era-states-eratv:rejected ) ) }

EDP Change Activity
type: NodeShape
target class: Activity
node kind: IRI
comment: Validates a prov:Activity representing a lifecycle event on an Evidence Document or Permission (CLD / Certificate). Covers state-reversing activities (Group 0: undo), state-changing activities (Group 1: amend, correct, request revocation, revoke, withdraw, suspend, reject) and versioning activities (Group 2: submit, replace, renew) that mint a new entity.
property: EDPChangeActivityType
property: EDPChangeActivityAtTime
property: EDPChangeActivityStartedAtTime
property: EDPChangeActivityWasAssociatedWith
property: EDPChangeActivityUsed
property: EDPChangeActivityGenerated
property: EDPChangeActivityState
property: EDPChangeActivityComment
property: EDPChangeActivityWasInformedBy
sparql: VersioningMustGenerateSPARQL
sparql: StateChangeMustNotMintSPARQL
sparql: NonSubmitMustUseSPARQL
sparql: UndoMustReferenceActivitySPARQL
sparql: UndoTargetMustBeUndoableSPARQL
sparql: ActivityTimeOrderSPARQL

EDPChangeActivityType
type: PropertyShape
path: type
affected property: type
name: Activity type
node kind: IRI
class: Concept
in skos concept scheme: EDPActivityTypes
description: The type of lifecycle activity, from the EDPActivityTypes concept scheme.
message: The Activity MUST have a dcterms:type pointing to a skos:Concept from era-edp-act:EDPActivityTypes.
severity: Violation
min count: 1
max count: 1

EDPChangeActivityAtTime
type: PropertyShape
path: atTime
affected property: atTime
name: Activity effective date
datatype: dateTime
node kind: Literal
description: The date/time at which this activity concluded (took effect).
message: The Activity MUST have a prov:atTime (xsd:dateTime).
severity: Violation
min count: 1
max count: 1

EDPChangeActivityStartedAtTime
type: PropertyShape
path: startedAtTime
affected property: startedAtTime
name: Activity start date
datatype: dateTime
node kind: Literal
description: The date/time at which this activity started, if different from the end time.
message: If present, prov:startedAtTime MUST be an xsd:dateTime.
severity: Warning
max count: 1

EDPChangeActivityWasAssociatedWith
type: PropertyShape
path: wasAssociatedWith
affected property: wasAssociatedWith
name: Associated agent
node kind: IRI
description: The prov:Agent (person or organisation) who carried out this activity.
message: The Activity SHOULD declare who performed it via prov:wasAssociatedWith.
severity: Warning
min count: 1

EDPChangeActivityUsed
type: PropertyShape
path: used
affected property: used
name: Entity acted upon
node kind: IRI
description: The EDP or a before-snapshot (prov:Entity with prov:specializationOf) that this activity acted upon. Required for all activity types except EDPSubmit (which has no parent).
message: (Info) This Activity did not declare a prov:used entity.
severity: Info

EDPChangeActivityGenerated
type: PropertyShape
path: generated
affected property: generated
name: Entity or snapshot produced
node kind: IRI
description: For Group 2: the new EDP. For Group 0/1: an after-snapshot (prov:Entity with prov:specializationOf) carrying the updated property values.
message: (Info) This Activity did not generate any entity or snapshot.
severity: Info

EDPChangeActivityState
type: PropertyShape
path: state
affected property: state
name: Activity state
node kind: IRI
class: Concept
in skos concept scheme: States
description: The state of the activity itself (e.g. submitted, in force).
message: If present, era:state MUST be a skos:Concept from the States scheme.
severity: Warning
max count: 1

EDPChangeActivityComment
type: PropertyShape
path: comment
affected property: comment
name: Activity justification
or:
  datatype: string
or:
  datatype: langString
node kind: Literal
description: Free-text explanation or justification for the activity.
message: The Activity SHOULD include a justification (rdfs:comment).
severity: Warning
max count: 1

EDPChangeActivityWasInformedBy
type: PropertyShape
path: wasInformedBy
affected property: wasInformedBy
name: Undo target activity
node kind: IRI
class: Activity
description: For EDPUndo activities: the prov:Activity whose effect is being reversed. Uses prov:wasInformedBy because the undo activity acts upon the outcome of the previous activity.
message: (Info) prov:wasInformedBy not present (only required for EDPUndo).
severity: Info
max count: 1

VersioningMustGenerateSPARQL
type: SPARQLConstraint
severity: Violation
message: This versioning activity (EDPRequestSubmit/EDPSubmit/EDPReplace/EDPRenew) MUST produce a new entity via prov:generated (unless EDPSubmit is validating an EDPRequestSubmit).
select: PREFIX dcterms: <http://purl.org/dc/terms/> PREFIX prov: <http://www.w3.org/ns/prov#> PREFIX era-edp-act: <http://data.europa.eu/949/concepts/edp-activity-types/> SELECT $this WHERE { $this dcterms:type ?type . FILTER(?type IN (era-edp-act:EDPRequestSubmit, era-edp-act:EDPSubmit, era-edp-act:EDPReplace, era-edp-act:EDPRenew)) FILTER NOT EXISTS { $this prov:generated ?newEntity } # Exception: EDPSubmit following EDPRequestSubmit is a validation # (state change only), not a minting activity. FILTER( ?type != era-edp-act:EDPSubmit || NOT EXISTS { $this prov:wasInformedBy ?reqAct . ?reqAct dcterms:type era-edp-act:EDPRequestSubmit } ) }

StateChangeMustNotMintSPARQL
type: SPARQLConstraint
severity: Warning
message: This activity ({?type}) generated a full CLD/Certificate {?newEntity} — only standalone versioning activities (EDPRequestSubmit/EDPSubmit/EDPReplace/EDPRenew) should mint new resources.
select: PREFIX dcterms: <http://purl.org/dc/terms/> PREFIX prov: <http://www.w3.org/ns/prov#> PREFIX era-edp-act: <http://data.europa.eu/949/concepts/edp-activity-types/> PREFIX era: <http://data.europa.eu/949/> SELECT $this ?type ?newEntity WHERE { { # Group 0/1 activities must not mint a new full entity $this dcterms:type ?type . FILTER(?type IN ( era-edp-act:EDPUndo, era-edp-act:EDPAmend, era-edp-act:EDPCorrect, era-edp-act:EDPRequestRevoke, era-edp-act:EDPRevoke, era-edp-act:EDPWithdraw, era-edp-act:EDPSuspend, era-edp-act:EDPReject )) } UNION { # EDPSubmit following EDPRequestSubmit is validation — must not mint $this dcterms:type era-edp-act:EDPSubmit . BIND(era-edp-act:EDPSubmit AS ?type) $this prov:wasInformedBy ?reqAct . ?reqAct dcterms:type era-edp-act:EDPRequestSubmit . } $this prov:generated ?newEntity . FILTER( EXISTS { ?newEntity a era:CertificationLevelDocument } || EXISTS { ?newEntity a era:Certificate } ) }

ActivityTimeOrderSPARQL
type: SPARQLConstraint
severity: Violation
message: prov:startedAtTime ({?start}) must be before or equal to prov:atTime ({?end}).
select: PREFIX prov: <http://www.w3.org/ns/prov#> SELECT $this ?start ?end WHERE { $this prov:startedAtTime ?start ; prov:atTime ?end . FILTER(?start > ?end) }

NonSubmitMustUseSPARQL
type: SPARQLConstraint
severity: Violation
message: This activity ({?type}) is not an EDPSubmit/EDPRequestSubmit and MUST declare at least one prov:used entity or snapshot.
select: PREFIX dcterms: <http://purl.org/dc/terms/> PREFIX prov: <http://www.w3.org/ns/prov#> PREFIX era-edp-act: <http://data.europa.eu/949/concepts/edp-activity-types/> SELECT $this ?type WHERE { $this dcterms:type ?type . FILTER(?type NOT IN (era-edp-act:EDPSubmit, era-edp-act:EDPRequestSubmit)) FILTER NOT EXISTS { $this prov:used ?entity } }

UndoMustReferenceActivitySPARQL
type: SPARQLConstraint
severity: Violation
message: This EDPUndo activity MUST reference the activity it reverses via prov:wasInformedBy.
select: PREFIX prov: <http://www.w3.org/ns/prov#> PREFIX dcterms: <http://purl.org/dc/terms/> PREFIX era-edp-act: <http://data.europa.eu/949/concepts/edp-activity-types/> SELECT $this WHERE { $this dcterms:type era-edp-act:EDPUndo . FILTER NOT EXISTS { $this prov:wasInformedBy ?prevAct } }

UndoTargetMustBeUndoableSPARQL
type: SPARQLConstraint
severity: Violation
message: This EDPUndo targets activity {?prevAct} of type {?prevType}, but that type is not undoable. Only EDPRequestRevoke, EDPRequestSubmit, EDPRevoke, EDPWithdraw, EDPSuspend, EDPReject and EDPUndo can be undone.
select: PREFIX dcterms: <http://purl.org/dc/terms/> PREFIX prov: <http://www.w3.org/ns/prov#> PREFIX era-edp-act: <http://data.europa.eu/949/concepts/edp-activity-types/> SELECT $this ?prevAct ?prevType WHERE { $this dcterms:type era-edp-act:EDPUndo . $this prov:wasInformedBy ?prevAct . ?prevAct dcterms:type ?prevType . FILTER(?prevType NOT IN ( era-edp-act:EDPRequestRevoke, era-edp-act:EDPRequestSubmit, era-edp-act:EDPRevoke, era-edp-act:EDPWithdraw, era-edp-act:EDPSuspend, era-edp-act:EDPReject, era-edp-act:EDPUndo )) }

Entity Snapshot (before/after)
type: NodeShape
comment: Validates a lightweight prov:Entity snapshot that records the property values before or after a Group 0/1 (state-changing) activity. The snapshot carries only the delta — the properties that the activity actually changed. It is linked to the main CLD or Certificate via prov:specializationOf. A before-snapshot is prov:used by the activity (and prov:wasInvalidatedBy it). An after-snapshot is prov:generated by the activity.
target: SPARQLTarget
  select: PREFIX prov: <http://www.w3.org/ns/prov#> SELECT ?this WHERE { ?this prov:specializationOf ?main . }
property: EntitySnapshotSpecializationOf
property: EntitySnapshotGeneratedAtTime
property: EntitySnapshotInvalidatedAtTime
sparql: EntitySnapshotActivityLink

EntitySnapshotSpecializationOf
type: PropertyShape
path: specializationOf
affected property: specializationOf
name: Specialization of main entity
node kind: IRI
or:
  class: CertificationLevelDocument
or:
  class: Certificate
description: The main CLD or Certificate that this snapshot describes at a specific point in time.
message: A snapshot MUST declare prov:specializationOf exactly one CLD or Certificate.
severity: Violation
min count: 1
max count: 1

EntitySnapshotGeneratedAtTime
type: PropertyShape
path: generatedAtTime
affected property: generatedAtTime
name: Snapshot valid from
datatype: dateTime
node kind: Literal
description: The point in time at which this snapshot became the active state of the entity.
message: A snapshot SHOULD have a prov:generatedAtTime.
severity: Warning
max count: 1

EntitySnapshotInvalidatedAtTime
type: PropertyShape
path: invalidatedAtTime
affected property: invalidatedAtTime
name: Snapshot valid until
datatype: dateTime
node kind: Literal
description: The point in time at which this snapshot was superseded (by the activity).
message: A before-snapshot SHOULD have a prov:invalidatedAtTime.
severity: Info
max count: 1

EntitySnapshotActivityLink
type: SPARQLConstraint
severity: Warning
message: This snapshot is not linked to any prov:Activity via prov:wasInvalidatedBy or prov:wasGeneratedBy.
select: PREFIX prov: <http://www.w3.org/ns/prov#> SELECT $this WHERE { $this prov:specializationOf ?main . FILTER NOT EXISTS { $this prov:wasInvalidatedBy ?act } FILTER NOT EXISTS { $this prov:wasGeneratedBy ?act2 } }

EDPChangeActivityPropertyShape
type: PropertyShape
path: changeActivity
affected property: changeActivity
name: Lifecycle activities
node kind: IRI
class: Activity
description: Lifecycle activities (amend, correct, revoke, withdraw, replace, etc.) recorded against this EDP via era:changeActivity.
message: (Info) No lifecycle activities recorded for this entity.
severity: Info

EDPStatePropertyShape
type: PropertyShape
path: state
affected property: state
name: Entity state
node kind: IRI
class: Concept
in skos concept scheme: States
description: The current state of the EDP (e.g. New, Amended, Revoked, Withdrawn, Suspended, Rejected).
message: The entity SHOULD have an era:state from the States concept scheme.
severity: Warning
min count: 1
max count: 1

ECM Certificate
type: NodeShape
target: SPARQLTarget
  select: SELECT ?this WHERE { ?this a <http://data.europa.eu/949/Certificate> ; <http://purl.org/dc/terms/type> <http://data.europa.eu/949/concepts/permission-types/ECMCertificate> . }
relation: ECMCertificate
comment: CERTIFICATE OF CONFORMITY OF ENTITY IN CHARGE OF MAINTENANCE - ECM Certificate
creator: Maarten Duhoux
  source: https://orcid.org/0009-0003-6653-6123
  member of: ERA
created: 2025-05-22
modified: 2025-05-23
modified: 2025-06-19
modified: 2025-10-24
property: ECMTypeShape
property: ECMIdentifierShape
property: ECMRURoleShape
property: ECM-SCB-Shape
property: ECMPreviousCertificateShape
property: ECMValidityPeriodShape
property: ECMPermissionShape
property: ECM-VehicleTypesShape
property: ECM-RU-HS-OperationShape
property: ECM-RU-RID-OperationShape
property: ECM-LocationShape
property: ECMAdditionalCommentsShape
property: ECMIssueDateShape
property: ECMInternalIdentifierShape

ECMTypeShape
type: PropertyShape
path: type
affected property: type
name: Certificate Type
node kind: IRI
has value: ECMCertificate
max count: 1
min count: 1
description: This Certificate must be typed as ECM Certificate
message: An ECM Certificate MUST have `dcterms:type era-permission-types:ECMCertificate`
severity: Violation

ECMIdentifierShape
type: PropertyShape
path: identifier
affected property: identifier
name: 1 EU Identification Number (EIN)
datatype: string
node kind: Literal
min count: 1
max count: 1
pattern: ^[A-Z]{2}/31/[2-9][0-9]{3}/[0-9]{4}$
description: Format: CC/31/YYYY/NNNN where CC=country code, 31=certificate type, YYYY=year, NNNN=sequential number
message: An ECM Certificate MUST have ONE valid identifier matching pattern CC/31/YYYY/NNNN
severity: Violation

ECMRURoleShape
type: PropertyShape
path: audience
affected property: audience
name: 2. Certified Entity in Charge of Maintenance (ECM)
name: 2. Zertifizierte Instandhaltungsstelle (ECM) @de
node kind: IRI
min count: 1
max count: 1
node: ECMRoleShape
class: OrganisationRole
description: Links to the OrganisationRole defining the Entity in Charge of Maintenance
message: An ECM Certificate MUST certify an organisation in a certain ECM role
severity: Violation

ECMRoleShape
type: NodeShape
node kind: IRI
property: ECMRoleOfShape
property: ECMHasRoleShape
description: Defines the role classification for the ECM

ECMRoleOfShape
type: PropertyShape
path: roleOf
affected property: roleOf
name: `era:Body` which is the ECM
min count: 1
max count: 1
message: The organisation receiving an ECM Certificate must be an `era:Body`.
node kind: IRI
severity: Violation
class: Body
description: Specifies the `era:Body` executing the role of ECM

ECMHasRoleShape
type: PropertyShape
path: hasOrganisationRole
affected property: hasOrganisationRole
name: Type of Company
min count: 1
max count: 1
message: The OrganisationRole of an ECM Certificate holder must be selected/confirmed
node kind: IRI
severity: Violation
class: Concept
in: IM-1
in: IM-2
in: RU-1
in: RU-2
in: RU-3
in: RU-4
in: RU-5
in: Keeper
in: MS
in: SP
in: Manufacturer
description: Specifies the type of company which holds the ECM certificate

ECM-SCB-Shape
type: PropertyShape
path: creator
affected property: creator
name: 3. Certification Body
node kind: IRI
min count: 1
max count: 1
class: OrganisationRole
node: ECM-CB-OrgRoleShape
description: Links to the OrganisationRole defining the Certificate Issuing Organisation
message: An ECM Certificate MUST link to the OrganisationRole Certificate Issuing Organisation
severity: Violation

ECM-CB-OrgRoleShape
type: NodeShape
node kind: IRI
property: ECM-CB-RoleShape-ECM
property: ECM-CB-RoleOfShape-ECM
description: Defines the role classification for ECM Certification Bodies
property: ECM-CB-RoleShape-ECMCB
property: ECM-CB-RoleOfShape-ECMCB

ECM-CB-RoleShape-ECM
type: PropertyShape
path: hasOrganisationRole
affected property: hasOrganisationRole
name: ECM Certification Body Role Type
min count: 1
max count: 1
message: An ECM Certificate must be issued by a era:Body having the role of ECM Certification Body
node kind: IRI
severity: Violation
class: Concept
in: ECM-CB
in: NSA-ECM-CB
description: Specifies ECM Certification Body role

ECM-CB-RoleOfShape-ECM
type: PropertyShape
path: roleOf
affected property: roleOf
name: `era:Body` which is the ECM Certification Body (recognised, accredited, or a NSA)
min count: 1
max count: 1
message: The organisation delivering an ECM Certificate must be an `era:Body`.
node kind: IRI
severity: Violation
class: Body
description: Specifies the `era:Body` delivering the ECM certificate

ECMPreviousCertificateShape
type: PropertyShape
path: relatedCertificate
affected property: relatedCertificate
name: EIN of the previous certificate
datatype: string
node kind: Literal
min count: 0
max count: 1
pattern: ^[A-Z]{2}/31/[2-9][0-9]{3}/[0-9]{4}$
description: Reference to a previous certificate with format CC/31/YYYY/NNNN
message: An ECM Certificate MAY refer to ONE previous certificate identifier
severity: Info

ECMValidityPeriodShape
type: PropertyShape
path: valid
affected property: valid
name: 1.4 Validity Period
node kind: IRI
min count: 1
max count: 1
qualified value shape: StartEndValidityShape
qualified min count: 1
qualified max count: 1
description: Defines the time interval during which the certificate is valid (max 5 years)
message: An ECM Certificate MUST have ONE Validity Interval (start and end date).
severity: Violation

ECMPermissionShape
type: PropertyShape
path: permits
affected property: permits
name: Permission type
description: The role permitted by this ECM Certificate
class: OrganisationRole
node kind: IRI
min count: 1
max count: 1
in: ECM
in: ECM-a
in: ECM-b
in: ECM-c
in: ECM-d

ECM-VehicleTypesShape
type: PropertyShape
name: Category of vehicles
path: coverage
affected property: coverage
class: Concept
node kind: IRI
min count: 1
max count: 15
description: Indicates the vehicle (sub)categories the ECM is allowed to maintain
message: An ECM certificate must refer to all the vehicle (sub)categories which can be maintained by the holder
severity: Violation

ECM-RU-HS-OperationShape
type: PropertyShape
name: High-speed Vehicles
path: coversHighSpeed
affected property: coversHighSpeed
datatype: boolean
min count: 1
max count: 1
description: Indicates whether the ECM is authorized to maintain vehicles intended for high-speed operations.
message: An ECM Certificate MUST indicate whether the ECM is authorized to maintain vehicles intended for high-speed operations
severity: Violation

ECM-RU-RID-OperationShape
type: PropertyShape
name: Covers wagons specialised in transport of dangerous goods
path: coversDangerousGoods
affected property: coversDangerousGoods
datatype: boolean
min count: 1
max count: 1
description: Indicates whether the ECM is authorized to maintain wagons specialised in transport of dangerous goods
message: An ECM Certificate MUST indicate whether the ECM is authorized to maintain wagons specialised in transport of dangerous goods
severity: Violation

ECM-LocationShape
type: PropertyShape
path: spatial
affected property: spatial
name: ECM: spatial validity to a Site
node kind: BlankNodeOrIRI
class: Site
description: Assessed site(s), if relevant.
message: No assessed site(s) mentioned in the ECM entitlement.
severity: Warning
min count: 1

ECMAdditionalCommentsShape
type: PropertyShape
path: comment
affected property: comment
name: 6 Additional information
node kind: Literal
min count: 0
max count: 1
datatype: string
description: Additional information related to the certificate.
message: An ECM Certificate allows ONE Additional comment
severity: Violation

ECMIssueDateShape
type: PropertyShape
path: issued
affected property: issued
name: 5. Issue date
datatype: date
min count: 1
max count: 1
node kind: Literal
description: Date on which the certificate is issued.
message: An ECM Certificate MUST have ONE Issue date.
severity: Violation

ECMInternalIdentifierShape
type: PropertyShape
path: label
affected property: label
name: Internal Identification Number
datatype: string
node kind: Literal
min count: 1
max count: 1
description: Internal reference number used by the issuing NSA
message: An ECM Certificate SHOULD have an internal identifier
severity: Warning

ECM Certification Body Attestation
type: NodeShape
target class: Certificate
node kind: IRI
relation: ECMCertification
label: Attestation @fr
comment: Proof of Entitlement - ECM Certification Body
creator: Maarten Duhoux
  source: https://orcid.org/0009-0003-6653-6123
  member of: ERA
created: 2025-10-29
property: ECMCBTypeShape
property: ECMCBIdentifierShape
property: ECMCertBodyCertificationBodyShape
property: ECM-CB-MaintenanceFunctionsShape
property: ECM-CB-ECMTypesAllowedShape
property: ECM-CB-VTCategoriesShape
property: ECM-CB-VTSubCategoriesShape
property: ECMCB-HS-OperationShape
property: ECMCB-RID-OperationShape
property: ECMCertBodyApplicableNationalLegislationShape
property: ECMValidityShape
property: ECMDecisionDateShape
property: ECMCertBodyInternalIdentifierShape
property: ECMCertBodyPreviousCertificateShape

ECMCBTypeShape
type: PropertyShape
path: type
affected property: type
name: Certificate Type
node kind: IRI
has value: ECMCertification
max count: 1
min count: 1
description: This Attestation serves as Proof of Entitlement for an ECM Certification Body
message: An ECM Attestation MUST have `dcterms:type era-permission-types:ECMCertification`
severity: Violation

ECMCBIdentifierShape
type: PropertyShape
path: identifier
affected property: identifier
name: 1. ID DATA - EU Identification Number (EIN)
datatype: string
node kind: Literal
min count: 1
max count: 1
pattern: ^[A-Z]{2}/30/[0-9]{4}/[0-9]{4}$
description: Format: CC/30/MMYY/NNNN where CC=country code, 30=certificate type, YY=year, MM & NNNN=sequential number
message: An ECM Attestation MUST have ONE valid identifier matching pattern CC/30/MMYY/NNNN
severity: Violation

ECMCertBodyCertificationBodyShape
type: PropertyShape
path: audience
affected property: audience
name: 2. Certification Body
node kind: IRI
min count: 1
max count: 1
node: ECM-CB-OrgRoleShape
class: OrganisationRole
description: Links to the OrganisationRole defining the Certificate Issuing Organisation
message: The audience of the ECM CB proof of entitlement
severity: Violation

ECM-CB-RoleShape-ECMCB
type: PropertyShape
path: hasOrganisationRole
affected property: hasOrganisationRole
name: ECM Certification Body Role Type
min count: 1
max count: 1
message: An ECM Certification Body attestation must be held by a era:Body having the role of ECM Certification Body
node kind: IRI
severity: Violation
class: Concept
in: ECM-CB
in: NSA-ECM-CB
description: Specifies ECM Certification Body role

ECM-CB-RoleOfShape-ECMCB
type: PropertyShape
path: roleOf
affected property: roleOf
name: `era:Body` which is the ECM Certification Body (recognised, accredited, or a NSA)
min count: 1
max count: 1
message: The organisation receiving an ECM CB attestation must be an `era:Body`.
node kind: IRI
severity: Violation
class: Body
description: Specifies the `era:Body` receiving the ECM CB attestation

ECM-CB-MaintenanceFunctionsShape
type: PropertyShape
path: coverage
affected property: coverage
name: 5.1a The maintenance functions which can be certified by the ECM CB
class: Concept
in: MDEV
in: MDEL
in: FMM
min count: 0
max count: 3
description: Indicates the certifiable Maintenance Functions
severity: Violation

ECM-CB-ECMTypesAllowedShape
type: PropertyShape
path: coverage
affected property: coverage
name: 5.1b The ECM scope which can be certified by the ECM CB
class: Concept
in: ECM
in: ECM-a
in: ECM-b
in: ECM-c
in: ECM-d
min count: 0
max count: 5
description: Indicates the certifiable ECM scopes
severity: Violation

ECM-CB-VTCategoriesShape
type: PropertyShape
name: 5.2 Category of vehicles
path: coverage
affected property: coverage
class: Concept
node kind: IRI
min count: 1
max count: 15
description: Indicates the vehicle categories the ECM CB is allowed to certify
message: An ECM CB Attestation MUST indicate what vehicle categories the ECM CB is authorized to certify operations on.
severity: Violation

ECM-CB-VTSubCategoriesShape
type: PropertyShape
name: 5.3 Subcategory of vehicles
path: coverage
affected property: coverage
class: Concept
node kind: IRI
min count: 1
max count: 15
description: Indicates the vehicle subcategories the ECM CB is allowed to certify
message: An ECM CB Attestation MUST indicate what vehicle subcategories the ECM CB is authorized to certify operations on.
severity: Violation

ECMCB-HS-OperationShape
type: PropertyShape
name: 5.4a Covers High-speed Vehicles
path: coversHighSpeed
affected property: coversHighSpeed
datatype: boolean
min count: 1
max count: 1
description: Indicates whether the ECM CB is authorized to certify operations regarding vehicles intended for high-speed operations.
message: An ECM CB Attestation MUST indicate whether the ECM CB is authorized to certify operations regarding vehicles intended for high-speed operations
severity: Violation

ECMCB-RID-OperationShape
type: PropertyShape
name: 5.4b Covers wagons specialised in transport of dangerous goods
path: coversDangerousGoods
affected property: coversDangerousGoods
datatype: boolean
min count: 1
max count: 1
description: Indicates whether the ECM CB is authorized to certify operations regarding wagons specialised in transport of dangerous goods
message: An ECM CB Attestation MUST indicate whether the ECM CB is authorized to certify operations regarding wagons specialised in transport of dangerous goods
severity: Violation

ECMCertBodyApplicableNationalLegislationShape
type: PropertyShape
path: source
affected property: source
name: 6 Applicable National Legislation
node kind: Literal
min count: 1
max count: 5
datatype: string
description: The national legislation under which the attestation is issued.
message: An ECM CB Attestation MUST refer to at least ONE applicable national legislation
severity: Violation

ECMValidityShape
type: PropertyShape
path: valid
affected property: valid
name: 7 Validity Period
node kind: IRI
min count: 1
max count: 1
qualified value shape: StartEndValidityShape
qualified min count: 1
qualified max count: 1
description: Defines the time interval during which the attestation is valid (max 5 years)
message: An ECM CB Attestation MUST have ONE Validity Interval (start and end date).
severity: Violation

ECMDecisionDateShape
type: PropertyShape
path: issued
affected property: issued
name: Date of decision
datatype: date
min count: 1
max count: 1
node kind: Literal
description: Date on which the certificate is issued.
message: An ECM CB Attestation MUST have ONE Issue date (decision date).
severity: Violation

ECMCertBodyInternalIdentifierShape
type: PropertyShape
path: label
affected property: label
name: Internal Identification Number
datatype: string
node kind: Literal
min count: 1
max count: 1
description: Internal reference number used by the issuing NSA
message: An ECM CB Attestation SHOULD have an internal identifier
severity: Warning

ECMCertBodyPreviousCertificateShape
type: PropertyShape
path: relatedCertificate
affected property: relatedCertificate
name: EIN of previous version
datatype: string
node kind: Literal
min count: 0
max count: 1
pattern: ^[A-Z]{2}/30/[0-9]{4}/[0-9]{4}$
description: Reference to a previous certificate with format CC/30/MMMM/NNNN
message: An ECM CD entitlement can refer to a previous version
severity: Warning

Certificate of conformity for Maintenance Functions
type: NodeShape
target class: Certificate
node kind: IRI
relation: MaintenanceFunctionCertificate
comment: CERTIFICATE OF CONFORMITY OF Certified Organisation - ECM Certificate
created: 2025-06-19
modified: 2025-07-23
modified: 2025-10-24
property: MWSTypeShape
property: MWSIdentifierShape
property: MWSRURoleShape
property: MWS-SCB-Shape
property: MWSPreviousCertificateShape
property: MWSValidityShape
property: MWSPermissionShape
property: MWS-VehicleTypesShape
property: MWS-RU-HS-OperationShape
property: MWS-RU-RID-OperationShape
property: MWS-LocationShape
property: MWS-FunctionsShape
property: MWSAdditionalCommentsShape
property: MWSIssueDateShape
property: MWSInternalIdentifierShape

MWSTypeShape
type: PropertyShape
path: type
affected property: type
name: Certificate Type
node kind: IRI
has value: MaintenanceFunctionCertificate
max count: 1
min count: 1
description: This Certificate must be typed as `Certificate of conformity for Maintenance Functions`
message: A `Certificate of conformity for Maintenance Functions` MUST have `dcterms:type era-permission-types:MaintenanceFunctionCertificate`
severity: Violation

MWSIdentifierShape
type: PropertyShape
path: identifier
affected property: identifier
name: 1 EU Identification Number (EIN)
datatype: string
node kind: Literal
min count: 1
max count: 1
pattern: ^[A-Z]{2}/3[2-3]/[2-9][0-9]{3}/[0-9]{4}$
description: Format: CC/32|33/YYYY/NNNN where CC=country code, 32|33=certificate type, YYYY=year, NNNN=sequential number
message: A `Certificate of conformity for Maintenance Functions` MUST have ONE valid identifier matching pattern CC/32/YYYY/NNNN
severity: Violation

MWSRURoleShape
type: PropertyShape
path: audience
affected property: audience
name: 2. Certified Organisation
name: 2. ZERTIFIZIERTE ORGANISATION @de
node kind: IRI
min count: 1
max count: 1
node: MWSRoleShape
class: OrganisationRole
description: Links to the OrganisationRole defining the Certified Organisation
message: A `Certificate of conformity for Maintenance Functions` MUST certify an organisation in a certain role
severity: Violation

MWSRoleShape
type: NodeShape
node kind: IRI
property: MWSRoleOfShape
property: MWSHasRoleShape
description: Defines the role classification for the ECM

MWSRoleOfShape
type: PropertyShape
path: roleOf
affected property: roleOf
name: `era:Body` which executes the Maintenance Functions
min count: 1
max count: 1
message: The organisation receiving a `Certificate of conformity for Maintenance Functions` must be an `era:Body`.
node kind: IRI
severity: Violation
class: Body
description: Specifies the `era:Body` executing the Maintenance Functions

MWSHasRoleShape
type: PropertyShape
path: hasOrganisationRole
affected property: hasOrganisationRole
name: Type of Company
min count: 1
max count: 1
message: The OrganisationRole of a `Certificate of conformity for Maintenance Functions` holder must be selected/confirmed
node kind: IRI
severity: Violation
class: Concept
in: IM-1
in: IM-2
in: RU-1
in: RU-2
in: RU-3
in: RU-4
in: RU-5
in: Keeper
in: MS
in: SP
in: Manufacturer
description: Specifies the type of company which holds the Certificate of conformity for Maintenance Functions

MWS-SCB-Shape
type: PropertyShape
path: creator
affected property: creator
name: 3. Certification Body
node kind: IRI
min count: 1
max count: 1
node: MWS-CB-OrgRoleShape
class: OrganisationRole
description: Links to the OrganisationRole defining the Certificate Issuing Organisation
message: A `Certificate of conformity for Maintenance Functions` MUST link to the OrganisationRole Certificate Issuing Organisation
severity: Violation

MWS-CB-OrgRoleShape
type: NodeShape
node kind: IRI
property: MWS-CB-RoleShape
property: MWS-CB-RoleOfShape
description: Defines the role classification for ECM Certification Bodies

MWS-CB-RoleShape
type: PropertyShape
path: hasOrganisationRole
affected property: hasOrganisationRole
name: ECM Certification Body Role Type
min count: 1
max count: 1
message: A `Certificate of conformity for Maintenance Functions` must be issued by a era:Body having the role of ECM Certification Body
node kind: IRI
severity: Violation
class: Concept
in: ECM-CB
in: NSA-ECM-CB
description: Specifies ECM Certification Body role

MWS-CB-RoleOfShape
type: PropertyShape
path: roleOf
affected property: roleOf
name: `era:Body` which is the ECM Certification Body (recognised, accredited, or a NSA)
min count: 1
max count: 1
message: The organisation delivering a `Certificate of conformity for Maintenance Functions` must be an `era:Body`.
node kind: IRI
severity: Violation
class: Body
description: Specifies the `era:Body` delivering the Certificate of conformity for Maintenance Functions

MWSPreviousCertificateShape
type: PropertyShape
path: relatedCertificate
affected property: relatedCertificate
name: EIN of the previous certificate
datatype: string
node kind: Literal
min count: 0
max count: 1
pattern: ^[A-Z]{2}/3[2-3]/[2-9][0-9]{3}/[0-9]{4}$
description: Reference to a previous certificate with format CC/32/YYYY/NNNN or CC/33/YYYY/NNNN
message: A `Certificate of conformity for Maintenance Functions` MAY refer to ONE previous certificate identifier
severity: Info

MWSValidityShape
type: PropertyShape
path: valid
affected property: valid
name: 4.3 Validity Period
node kind: IRI
min count: 1
max count: 1
qualified value shape: StartEndValidityShape
qualified min count: 1
qualified max count: 1
description: Defines the time interval during which the certificate is valid (max 5 years)
message: A `Certificate of conformity for Maintenance Functions` MUST have ONE Validity Interval (start and end date).
severity: Violation

MWSPermissionShape
type: PropertyShape
path: permits
affected property: permits
name: Permission type
description: The role permitted by this `Certificate of conformity for Maintenance Functions`
class: OrganisationRole
node kind: IRI
min count: 1
max count: 1
or:
  has value: MWS
or:
  has value: MWS-a
or:
  has value: MWS-b
or:
  has value: MWS-c
or:
  has value: MWS-d

MWS-VehicleTypesShape
type: PropertyShape
name: Category of vehicles
path: coverage
affected property: coverage
imports: Categories
imports: Subcategories
class: Concept
node kind: IRI
min count: 1
max count: 15
description: Indicates the vehicle (sub)categories the ECM is allowed to maintain
message: A `Certificate of conformity for Maintenance Functions` must refer to all the vehicle (sub)categories which can be maintained by the holder
severity: Violation

MWS-RU-HS-OperationShape
type: PropertyShape
name: High-speed Vehicles
path: coversHighSpeed
affected property: coversHighSpeed
datatype: boolean
min count: 1
max count: 1
description: Indicates whether the ECM is authorized to maintain vehicles intended for high-speed operations.
message: A `Certificate of conformity for Maintenance Functions` MUST indicate whether the ECM is authorized to maintain vehicles intended for high-speed operations
severity: Violation

MWS-RU-RID-OperationShape
type: PropertyShape
name: Covers wagons specialised in transport of dangerous goods
path: coversDangerousGoods
affected property: coversDangerousGoods
datatype: boolean
min count: 1
max count: 1
description: Indicates whether the ECM is authorized to maintain wagons specialised in transport of dangerous goods
message: A `Certificate of conformity for Maintenance Functions` MUST indicate whether the ECM is authorized to maintain wagons specialised in transport of dangerous goods
severity: Violation

MWS-LocationShape
type: PropertyShape
path: spatial
affected property: spatial
name: MWS: spatial validity to a Site
node kind: BlankNodeOrIRI
class: Site
description: Assessed site(s), if relevant.
message: No assessed site(s) mentioned in the MWS entitlement.
severity: Warning
min count: 1

MWS-FunctionsShape
type: PropertyShape
path: coverage
affected property: coverage
name: The maintenance functions covered by the Certificate
class: Concept
in: MDEV
in: MDEL
in: FMM
min count: 1
max count: 9
description: Indicates the covered Maintenance Functions
message: A `Certificate of conformity for Maintenance Functions` MUST indicate which maintenance functions are supported
severity: Violation

MWSAdditionalCommentsShape
type: PropertyShape
path: comment
affected property: comment
name: 6 Additional information
node kind: Literal
min count: 0
max count: 1
datatype: string
description: Additional information related to the certificate.
message: A `Certificate of conformity for Maintenance Functions` allows ONE Additional comment
severity: Violation

MWSIssueDateShape
type: PropertyShape
path: issued
affected property: issued
name: 5. Issue date
datatype: date
min count: 1
max count: 1
node kind: Literal
description: Date on which the certificate is issued.
message: A `Certificate of conformity for Maintenance Functions` MUST have ONE Issue date.
severity: Violation

MWSInternalIdentifierShape
type: PropertyShape
path: label
affected property: label
name: Internal Identification Number
datatype: string
node kind: Literal
min count: 1
max count: 1
description: Internal reference number used by the issuing NSA
message: A `Certificate of conformity for Maintenance Functions` SHOULD have an internal identifier
severity: Warning

SCATypeShape
type: PropertyShape
path: type
affected property: type
name: Certificate Type
node kind: IRI
has value: SafetyCertificateA
max count: 1
min count: 1
description: This Certificate must be typed as Safety Certificate Part A
message: A Safety Certificate Type A MUST have `dcterms:type era-permission-types:SafetyCertificateA`
severity: Violation

SCAIdentifierShape
type: PropertyShape
path: identifier
affected property: identifier
name: EU Identification Number
datatype: string
node kind: Literal
min count: 1
max count: 1
pattern: ^[A-Z]{2}11[2-9][0-9]{3}[0-9]{4}$
description: Format: CC11YYYYNNNN where CC=country code, 11=certificate type, YYYY=year, NNNN=sequential number
message: A Safety Certificate Type A MUST have ONE valid identifier matching pattern CC11YYYYNNNN
severity: Violation

SCAECMCertShape
type: PropertyShape
path: relatedCertificate
affected property: relatedCertificate
name: ECM Certificate Number
datatype: string
node kind: Literal
min count: 0
max count: 1
pattern: ^[A-Z]{2}/31/\d{4}/\d{4}$
description: Reference to related ECM Certificate with format CC/31/YYYY/NNNN
message: A Safety Certificate Type A MAY refer to ONE ECM certificate identifier
severity: Info

SCAInternalIdentifierShape
type: PropertyShape
path: label
affected property: label
name: Internal Identification Number
datatype: string
node kind: Literal
min count: 1
max count: 1
description: Internal reference number used by the issuing NSA
message: A Safety Certificate Type A SHOULD have an internal identifier
severity: Warning

SCARURoleShape
type: PropertyShape
path: audience
affected property: audience
name: Certified Railway Undertaking (1)
node kind: IRI
min count: 1
max count: 1
node: RailwayUndertakingRoleShape
class: OrganisationRole
description: Links to the OrganisationRole defining the Railway Undertaking
message: A Safety Certificate Type A MUST link to the OrganisationRole Railway Undertaking
severity: Violation

RailwayUndertakingRoleShape
type: NodeShape
node kind: IRI
property: RailwayUndertakingIsFromRUShape-SCA
description: Defines the role classification for Railway Undertakings
property: RailwayUndertakingIsFromRUShape-SCB
property: RailwayUndertakingIsFromRUShape-SCC

RailwayUndertakingIsFromRUShape-SCA
type: PropertyShape
path: hasOrganisationRole
affected property: hasOrganisationRole
name: Railway Undertaking Role Type
min count: 1
max count: 1
message: The OrganisationRole of a Safety Certificate Part A must apply to a Railway Undertaking (RU)
node kind: IRI
severity: Violation
class: Concept
in: RU
in: RU-1
in: RU-2
in: RU-3
in: RU-4
in: RU-5
description: Specifies the type of Railway Undertaking operations

SCA-NSA-Shape
type: PropertyShape
path: creator
affected property: creator
name: Certificate Issuing Organisation (2)
node kind: IRI
min count: 1
max count: 1
node: NSAOrganisationRoleShape
class: OrganisationRole
description: Links to the OrganisationRole defining the Certificate Issuing Organisation
message: A Safety Certificate Type A MUST link to the OrganisationRole Certificate Issuing Organisation
severity: Violation

NSAOrganisationRoleShape
type: NodeShape
node kind: IRI
property: NSAOrganisationIsFromRUShape-SCA
description: Defines the role classification for National Safety Authorities
property: NSAOrganisationIsFromRUShape-SCB

NSAOrganisationIsFromRUShape-SCA
type: PropertyShape
path: hasOrganisationRole
affected property: hasOrganisationRole
name: National Safety Authority Role Type
min count: 1
max count: 1
message: The OrganisationRole of a Safety Certificate Part A must be issued by a National Safety Authority (NSA)
node kind: IRI
severity: Violation
class: Concept
has value: NSA-RU-SCB
description: Specifies National Safety Authority role

SCA-RU-HS-OperationShape
type: PropertyShape
name: High-speed Operation
path: coversHighSpeed
affected property: coversHighSpeed
datatype: boolean
min count: 1
max count: 1
description: Indicates whether the RU is authorized for high-speed operations.
message: A Safety Certificate Type A MUST indicate whether the RU is authorized for high-speed operations
severity: Violation

SCA-RU-RID-OperationShape
type: PropertyShape
name: Dangerous Goods Operation
path: coversDangerousGoods
affected property: coversDangerousGoods
datatype: boolean
min count: 1
max count: 1
description: Indicates whether the RU is authorized for dangerous goods transport according to RID regulations
message: A Safety Certificate Type A MUST indicate whether the RU is authorized for dangerous goods operations
severity: Violation

SCA-RU-Shunting-OperationShape
type: PropertyShape
name: Shunting Only
path: coversOnlyShunting
affected property: coversOnlyShunting
datatype: boolean
min count: 1
max count: 1
description: Indicates whether the RU is restricted to shunting operations only (no mainline running)
message: A Safety Certificate Type A MUST indicate whether the RU is authorized for shunting operations only
severity: Violation

SCA-RU-ServiceStartShape
type: PropertyShape
name: Service/s to begin in
path: dateAccepted
affected property: dateAccepted
datatype: date
min count: 0
max count: 1
description: The date when the service/s will begin.
message: A Safety Certificate Type A MAY indicate the date when the service/s will begin
severity: Info

SCA-RU-VolumePassengerShape
type: PropertyShape
name: Transportation Volume Passenger
path: transportationVolumePassenger
affected property: transportationVolumePassenger
in: Less than 200 MPkm/year
in: 200MPkm/year and more
min count: 0
max count: 1
datatype: string
description: The transportation volume for passenger services.
message: A Safety Certificate Type A MAY describe ONE transportation volume for passenger services
severity: Info

SCA-RU-VolumeFreightShape
type: PropertyShape
name: Transportation Volume Freight
path: transportationVolumeFreight
affected property: transportationVolumeFreight
in: Less than 500 MTonneskm/year
in: 500 MTonneskm/year and more
min count: 0
max count: 1
datatype: string
description: The transportation volume for freight services.
message: A Safety Certificate Type A MAY describe ONE transportation volume for freight services
severity: Info

SCAApplicableLegislationShape
type: PropertyShape
path: source
affected property: source
name: Applicable National Legislation (4)
node kind: Literal
min count: 1
max count: 5
datatype: string
description: The national legislation under which the certificate is issued.
message: A Safety Certificate Type A MUST refer to at least ONE applicable national legislation
severity: Violation

SCAAdditionalCommentsShape
type: PropertyShape
path: comment
affected property: comment
name: Additional comments (5)
node kind: Literal
min count: 0
max count: 1
datatype: string
description: Additional comments related to the certificate.
message: A Safety Certificate Type A allows ONE Additional comment
severity: Violation

SCAIssueDateShape
type: PropertyShape
path: issued
affected property: issued
name: Issue date
datatype: date
min count: 1
max count: 1
node kind: Literal
description: Date on which the certificate is issued.
message: A Safety Certificate Type A MUST have ONE Issue date.
severity: Violation

SCAValidityShape
type: PropertyShape
path: valid
affected property: valid
name: Validity Period
node kind: IRI
min count: 1
max count: 1
qualified value shape: StartEndValidityShape
qualified min count: 1
qualified max count: 1
description: Defines the time interval during which the certificate is valid (max 5 years)
message: A Safety Certificate Type A MUST have ONE Validity Interval (start and end date).
severity: Violation

SCBTypeShape
type: PropertyShape
path: type
affected property: type
name: Certificate Type
node kind: IRI
has value: SafetyCertificateB
max count: 1
min count: 1
description: This Certificate must be typed as Safety Certificate Part B
message: A Safety Certificate Type B MUST have `dcterms:type era-permission-types:SafetyCertificateB`
severity: Violation

SCBIdentifierShape
type: PropertyShape
path: identifier
affected property: identifier
name: EU Identification Number
datatype: string
node kind: Literal
min count: 1
max count: 1
pattern: ^[A-Z]{2}12[2-9][0-9]{3}[0-9]{4}$
description: Format: CC12YYYYNNNN where CC=country code, 12=certificate type, YYYY=year, NNNN=sequential number
message: A Safety Certificate Type B MUST have ONE valid identifier matching pattern CC12YYYYNNNN
severity: Violation

SCBSCARefShape
type: PropertyShape
path: relatedCertificate
affected property: relatedCertificate
name: Safety Certificate Part A - Certificate Number
datatype: string
node kind: Literal
min count: 1
max count: 1
pattern: ^[A-Z]{2}/11/\d{4}/\d{4}$
description: Reference to the Certificate Part A with format CC/11/YYYY/NNNN
message: A Safety Certificate Type B MUST refer to ONE Part A certificate identifier
severity: Info

SCBRURoleShape
type: PropertyShape
path: audience
affected property: audience
name: Certified Railway Undertaking (1)
node kind: IRI
min count: 1
max count: 1
node: RailwayUndertakingRoleShape
class: OrganisationRole
description: Links to the OrganisationRole defining the Railway Undertaking
message: A Safety Certificate Type A MUST link to the OrganisationRole Railway Undertaking
severity: Violation

RailwayUndertakingIsFromRUShape-SCB
type: PropertyShape
path: hasOrganisationRole
affected property: hasOrganisationRole
name: Railway Undertaking Role Type
min count: 1
max count: 1
message: The OrganisationRole of a Safety Certificate Part B must apply to a Railway Undertaking (RU)
node kind: IRI
severity: Violation
class: Concept
in: RU
in: RU-1
in: RU-2
in: RU-3
in: RU-4
in: RU-5
description: Specifies the type of Railway Undertaking operations

SCB-NSA-Shape
type: PropertyShape
path: creator
affected property: creator
name: Certificate Issuing Organisation (2)
node kind: IRI
min count: 1
max count: 1
node: NSAOrganisationRoleShape
class: OrganisationRole
description: Links to the OrganisationRole defining the Certificate Issuing Organisation
message: A Safety Certificate Type A MUST link to the OrganisationRole Certificate Issuing Organisation
severity: Violation

NSAOrganisationIsFromRUShape-SCB
type: PropertyShape
path: hasOrganisationRole
affected property: hasOrganisationRole
name: National Safety Authority Role Type
min count: 1
max count: 1
message: The OrganisationRole of a Safety Certificate Part B must be issued by a National Safety Authority (NSA)
node kind: IRI
severity: Violation
class: Concept
has value: NSA-RU-SCB
description: Specifies National Safety Authority role

SCB-RU-HS-OperationShape
type: PropertyShape
name: High-speed Operation
path: coversHighSpeed
affected property: coversHighSpeed
datatype: boolean
min count: 1
max count: 1
description: Indicates whether the RU is authorized for high-speed operations.
message: A Safety Certificate Type A MUST indicate whether the RU is authorized for high-speed operations
severity: Violation

SCB-RU-RID-OperationShape
type: PropertyShape
name: Dangerous Goods Operation
path: coversDangerousGoods
affected property: coversDangerousGoods
datatype: boolean
min count: 1
max count: 1
description: Indicates whether the RU is authorized for dangerous goods transport according to RID regulations
message: A Safety Certificate Type A MUST indicate whether the RU is authorized for dangerous goods operations
severity: Violation

SCB-RU-Shunting-OperationShape
type: PropertyShape
name: Shunting Only
path: coversOnlyShunting
affected property: coversOnlyShunting
datatype: boolean
min count: 1
max count: 1
description: Indicates whether the RU is restricted to shunting operations only (no mainline running)
message: A Safety Certificate Type A MUST indicate whether the RU is authorized for shunting operations only
severity: Violation

SCBLinesOperatedShape
type: PropertyShape
path: spatial
affected property: spatial
name: Lines operated
node kind: Literal
min count: 0
max count: 25
datatype: string
description: Lines operated under the scope of the certificate.
message: A Safety Certificate Type B allows several lines operated to be specified.
severity: Violation

SCBApplicableLegislationShape
type: PropertyShape
path: source
affected property: source
name: Applicable National Legislation (4)
node kind: Literal
min count: 1
max count: 5
datatype: string
description: The national legislation under which the certificate is issued.
message: A Safety Certificate Type A MUST refer to at least ONE applicable national legislation
severity: Violation

SCBIssueDateShape
type: PropertyShape
path: issued
affected property: issued
name: Issue date
datatype: date
min count: 1
max count: 1
node kind: Literal
description: Date on which the certificate is issued.
message: A Safety Certificate Type A MUST have ONE Issue date.
severity: Violation

SCBValidityShape
type: PropertyShape
path: valid
affected property: valid
name: Validity Period
node kind: IRI
min count: 1
max count: 1
qualified value shape: StartEndValidityShape
qualified min count: 1
qualified max count: 1
description: Defines the time interval during which the certificate is valid (max 5 years)
message: A Safety Certificate Type A MUST have ONE Validity Interval (start and end date).
severity: Violation

SCBInternalIdentifierShape
type: PropertyShape
path: label
affected property: label
name: Internal Identification Number
datatype: string
node kind: Literal
min count: 1
max count: 1
description: A Safety Certificate Part B should have an internal identifier.
message: A Safety Certificate Type A SHOULD have an internal identifier
severity: Warning

SingleSafetyCertificateShape
type: NodeShape
target class: Certificate
node kind: IRI
created: 2025-10-14
relation: SingleSafetyCertificate
property: SSCTypeShape
property: SSCIdentifierShape
property: SSCPreviousCertificateShape
property: SSCValidityShape
property: SSCRURoleShape
property: SSC-SCB-Shape
property: SSC-RU-HS-OperationShape
property: SSC-RU-RID-OperationShape
property: SSC-RU-Shunting-OperationShape
property: SSC-RU-ServiceStartShape
property: SSC-RU-VolumePassengerShape
property: SSC-RU-VolumeFreightShape
property: SSCApplicableLegislationShape
property: SSCAdditionalCommentsShape
property: SSCIssueDateShape
property: SSCInternalIdentifierShape

SSCTypeShape
type: PropertyShape
path: type
affected property: type
name: Certificate Type
node kind: IRI
has value: SingleSafetyCertificate
max count: 1
min count: 1
description: This Certificate must be typed as Single Safety Certificate
message: A Single Safety Certificate MUST have `dcterms:type era-permission-types:SingleSafetyCertificate`
severity: Violation

SSCIdentifierShape
type: PropertyShape
path: identifier
affected property: identifier
name: 1.1 EU Identification Number
datatype: string
node kind: Literal
min count: 1
max count: 1
pattern: ^[A-Z]{2}10[2-9][0-9]{3}[0-9]{4}$
description: Format: CC10YYYYNNNN where CC=country code, 10=certificate type, YYYY=year, NNNN=sequential number
message: A Single Safety Certificate MUST have ONE valid identifier matching pattern CC10YYYYNNNN
severity: Violation

SSCPreviousCertificateShape
type: PropertyShape
path: relatedCertificate
affected property: relatedCertificate
name: 1.3 EIN of the previous certificate (in case of renewal or update only)
datatype: string
node kind: Literal
min count: 0
max count: 1
pattern: ^[A-Z]{2}10[2-9][0-9]{3}[0-9]{4}$
description: Reference to a previous certificate with format CC/10/YYYY/NNNN
message: A Single Safety Certificate MAY refer to ONE previous certificate identifier
severity: Info

SSCValidityShape
type: PropertyShape
path: valid
affected property: valid
name: 1.4 Validity Period
node kind: IRI
min count: 1
max count: 1
qualified value shape: StartEndValidityShape
qualified min count: 1
qualified max count: 1
description: Defines the time interval during which the certificate is valid (max 5 years)
message: A Single Safety Certificate MUST have ONE Validity Interval (start and end date).
severity: Violation

SSCRURoleShape
type: PropertyShape
path: audience
affected property: audience
name: 2. Railway Undertaking
node kind: IRI
min count: 1
max count: 1
node: RailwayUndertakingRoleShape
class: OrganisationRole
description: Links to the OrganisationRole defining the Railway Undertaking
message: A Single Safety Certificate MUST link to the OrganisationRole Railway Undertaking
severity: Violation

RailwayUndertakingIsFromRUShape-SCC
type: PropertyShape
path: hasOrganisationRole
affected property: hasOrganisationRole
name: Railway Undertaking Role Type
min count: 1
max count: 1
message: The OrganisationRole of a Single Safety Certificate must apply to a Railway Undertaking (RU)
node kind: IRI
severity: Violation
class: Concept
in: RU
in: RU-1
in: RU-2
in: RU-3
in: RU-4
in: RU-5
description: Specifies the type of Railway Undertaking operations

SSC-SCB-Shape
type: PropertyShape
path: creator
affected property: creator
name: 3. Safety Certification Body
node kind: IRI
min count: 1
max count: 1
node: SCBOrganisationRoleShape
class: OrganisationRole
description: Links to the OrganisationRole defining the Certificate Issuing Organisation
message: A Single Safety Certificate MUST link to the OrganisationRole Certificate Issuing Organisation
severity: Violation

SCBOrganisationRoleShape
type: NodeShape
node kind: IRI
property: SCBOrganisationIsFromRUShape
description: Defines the role classification for Safety Certification Bodies

SCBOrganisationIsFromRUShape
type: PropertyShape
path: hasOrganisationRole
affected property: hasOrganisationRole
name: Safety Certification Body Role Type
min count: 1
max count: 1
message: The OrganisationRole of a Single Safety Certificate must be issued by a Safety Certification Body (NSA)
node kind: IRI
severity: Violation
class: Concept
in: NSA-RU-SCB
in: AuthorisingEntity
description: Specifies Safety Certification Body role

SSC-RU-HS-OperationShape
type: PropertyShape
name: High-speed Operation
path: coversHighSpeed
affected property: coversHighSpeed
datatype: boolean
min count: 1
max count: 1
description: Indicates whether the RU is authorized for high-speed operations.
message: A Single Safety Certificate MUST indicate whether the RU is authorized for high-speed operations
severity: Violation

SSC-RU-RID-OperationShape
type: PropertyShape
name: Dangerous Goods Operation
path: coversDangerousGoods
affected property: coversDangerousGoods
datatype: boolean
min count: 1
max count: 1
description: Indicates whether the RU is authorized for dangerous goods transport according to RID regulations
message: A Single Safety Certificate MUST indicate whether the RU is authorized for dangerous goods operations
severity: Violation

SSC-RU-Shunting-OperationShape
type: PropertyShape
name: Shunting Only
path: coversOnlyShunting
affected property: coversOnlyShunting
datatype: boolean
min count: 1
max count: 1
description: Indicates whether the RU is restricted to shunting operations only (no mainline running)
message: A Single Safety Certificate MUST indicate whether the RU is authorized for shunting operations only
severity: Violation

SSC-RU-ServiceStartShape
type: PropertyShape
name: Service/s to begin in
path: dateAccepted
affected property: dateAccepted
datatype: date
min count: 0
max count: 1
description: The date when the service/s will begin.
message: A Single Safety Certificate MAY indicate the date when the service/s will begin
severity: Info

SSC-RU-VolumePassengerShape
type: PropertyShape
name: Transportation Volume Passenger
path: transportationVolumePassenger
affected property: transportationVolumePassenger
in: Less than 200 MPkm/year
in: 200MPkm/year and more
min count: 0
max count: 1
datatype: string
description: The transportation volume for passenger services.
message: A Single Safety Certificate MAY describe ONE transportation volume for passenger services
severity: Info

SSC-RU-VolumeFreightShape
type: PropertyShape
name: Transportation Volume Freight
path: transportationVolumeFreight
affected property: transportationVolumeFreight
in: Less than 500 MTonneskm/year
in: 500 MTonneskm/year and more
min count: 0
max count: 1
datatype: string
description: The transportation volume for freight services.
message: A Single Safety Certificate MAY describe ONE transportation volume for freight services
severity: Info

SCBOperationsToBorderStationsShape
type: PropertyShape
path: borderPointStation
affected property: borderPointStation
class: OperationalPoint
or:
  class: OperationalPoint
or:
  class: ReferenceBorderPoint
name: 4.3 Operations to border stations
node kind: IRI
min count: 0
max count: 25
description: 4.3 Operations to border stations under the scope of the certificate.
message: A Single Safety Certificate allows several Operations to border stations to be specified.
severity: Violation

SCBAreaOfOperationShape
type: PropertyShape
path: areaOfOperation
affected property: areaOfOperation
name: 4.2 Area of operation
node kind: IRI
min count: 0
max count: 25
class: Concept
description: 4.2 Area of operation under the scope of the certificate.
message: A Single Safety Certificate allows several Areas of operation to be specified.
severity: Violation

SSCApplicableLegislationShape
type: PropertyShape
path: source
affected property: source
name: 4.5 Applicable National Legislation
node kind: Literal
min count: 1
max count: 5
datatype: string
description: The national legislation under which the certificate is issued.
message: A Single Safety Certificate MUST refer to at least ONE applicable national legislation
severity: Violation

SSCAdditionalCommentsShape
type: PropertyShape
path: comment
affected property: comment
name: 4.6 Additional information
node kind: Literal
min count: 0
max count: 1
datatype: string
description: Additional information related to the certificate.
message: A Single Safety Certificate allows ONE Additional comment
severity: Violation

SSCIssueDateShape
type: PropertyShape
path: issued
affected property: issued
name: 5. Issue date
datatype: date
min count: 1
max count: 1
node kind: Literal
description: Date on which the certificate is issued.
message: A Single Safety Certificate MUST have ONE Issue date.
severity: Violation

SSCInternalIdentifierShape
type: PropertyShape
path: label
affected property: label
name: Internal Identification Number
datatype: string
node kind: Literal
min count: 1
max count: 1
description: Internal reference number used by the issuing NSA
message: A Single Safety Certificate SHOULD have an internal identifier
severity: Warning

OrganisationSize
type: PropertyShape
affected class: Body
affected property: organisationSize
scope: local
comment: The size of a given organisation or body.
path: organisationSize
max count: 1
node kind: IRI
severity: Violation
class: Concept
message: organisationSize: Each Body can have up to 1 organisation size which must be represented as an IRI which is a SKOS concept. This error may be due to having more than one value, or having a value that is not an IRI, or a value that is an IRI but not a SKOS concept.

OrganisationSizeSKOS
type: SPARQLConstraint
affected property: organisationSize
affected class: Body
scope: local
comment: The size of a given organisation or body.
severity: Violation
message: Indication of the organisationSize: The Body {$this} has a value {?concept} that is not one of the predefined values and cannot be converted into a SKOS concept on this list: http://data.europa.eu/949/concepts/org-size/OrgSizes.
select: PREFIX era: <http://data.europa.eu/949/> PREFIX skos: <http://www.w3.org/2004/02/skos/core#> SELECT $this ?concept WHERE { $this era:organisationSize ?concept . era:organisationSize era:inSkosConceptScheme ?conceptScheme . FILTER NOT EXISTS{ ?concept skos:inScheme ?conceptScheme . } }

Label
type: PropertyShape
affected class: Body
affected property: label
scope: local
comment: The label of an entity
path: label
min count: 1
max count: 1
datatype: string
severity: Violation
message: rdfs:label: The era:Body must have a label using rdfs. This error may be due to not having a value, having more than one value, or having a value that is not a string.

VatID
type: PropertyShape
affected class: Body
affected property: vatID
scope: local
comment: The VAT Identifier
path: vatID
max count: 1
datatype: string
severity: Warning
message: vatID: The era:Body should have a at most one vatID. This error may be due to not having a value, having more than one value, or having a value that is not a string.

Identifier
type: PropertyShape
affected class: Body
affected property: identifier
scope: local
comment: The ORG indentifier
path: identifier
min count: 1
max count: 1
datatype: string
severity: Violation
message: orgIdentifier: The era:Body must have a at most one org identifier. This error may be due to not having a value, having more than one value, or having a value that is not a string.

HasSite
type: PropertyShape
affected class: Body
affected property: hasSite
scope: local
comment: The link to the site of the era:Body
path: hasSite
min count: 1
node kind: IRI
class: Site
severity: Violation
message: hasSite: The organisation site must be represented as an IRI. This error may be due to not having a value, or having a value that is not an IRI.

SiteAddress
type: PropertyShape
affected class: Site
affected property: siteAddress
scope: local
comment: The link to the site address
path: siteAddress
min count: 1
max count: 1
node kind: IRI
class: Address
severity: Violation
message: hasSite: The organisation site must be represented as an IRI. This error may be due to not having a value, or having a value that is not an IRI.

AdminUnitL1
type: PropertyShape
affected class: Address
affected property: adminUnitL1
scope: local
comment: Indicates the country of the address
path: adminUnitL1
min count: 1
max count: 1
node kind: IRI
severity: Violation
message: locn:adminUnitL1: Each site address must have exactly one country. This error may be due to having a Site without or with more than one adminUnitL1 or it value is not a Concept.

AdminUnitL1SKOS
type: SPARQLConstraint
affected class: Address
affected property: adminUnitL1
scope: local
comment: Indicates the country in which the site address.
severity: Violation
message: Country in which the Site address resides: The Address {$this} has a value {?concept} that is not one of the predefined values and cannot be converted into a SKOS concept on this list: http://publications.europa.eu/resource/authority/country.
select: PREFIX skos: <http://www.w3.org/2004/02/skos/core#> PREFIX locn: <http://w3.org/ns/locn#> SELECT $this ?concept WHERE { $this locn:adminUnitL1 ?concept . FILTER NOT EXISTS{ ?concept skos:inScheme <http://publications.europa.eu/resource/authority/country> . } }

PostCode
type: PropertyShape
affected class: Address
affected property: postCode
scope: local
comment: The postCode of a location
path: postCode
min count: 1
max count: 1
datatype: string
severity: Violation
message: postCode: The Address must have exactly one postCode. This error may be due to not having a value, having more than one value, or having a value that is not a string.

PostName
type: PropertyShape
affected class: Address
affected property: postName
scope: local
comment: The postName of a location
path: postName
min count: 1
max count: 1
datatype: string
severity: Violation
message: postName: The Address must have exactly one postName. This error may be due to not having a value, having more than one value, or having a value that is not a string.

Thoroughfare
type: PropertyShape
affected class: Address
affected property: thoroughfare
scope: local
comment: The thoroughfare of a location
path: thoroughfare
min count: 1
max count: 1
datatype: string
severity: Violation
message: postName: The Address must have exactly one postName. This error may be due to not having a value, having more than one value, or having a value that is not a string.

FullAddress
type: PropertyShape
affected class: Address
affected property: fullAddress
scope: local
comment: The full address of a location as extracted
path: fullAddress
min count: 0
max count: 1
datatype: string
severity: Warning
message: fullAddress: The Address should have one fullAddress. This error may be due to not having a value, having more than one value, or having a value that is not a string.

NandoCode
type: PropertyShape
affected class: OrganisationRole
affected property: nandoCode
scope: local
comment: NANDO (New Approach Notified and Designated Organisations) code identifying the organisation that plays this role.
path: nandoCode
datatype: string
max count: 1
severity: Violation
message: nandoCode: An OrganisationRole must have at most one nandoCode. This error may be due to having more than one value or having a value that is not a string.

NandoCodeOnlyForNobo
type: SPARQLConstraint
affected class: OrganisationRole
affected property: nandoCode
scope: local
comment: An OrganisationRole may only have a value for nandoCode if its hasOrganisationRole is the NOBO (notified body) concept <http://data.europa.eu/949/concepts/organisation-roles/NOBO>.
message: nandoCode: The OrganisationRole {$this} with label {?label} has a nandoCode {?value} but its hasOrganisationRole is {?role}, not <http://data.europa.eu/949/concepts/organisation-roles/NOBO>. A nandoCode is only allowed for notified bodies (NOBO).
prefixes: http://data.europa.eu/949/
select: PREFIX era: <http://data.europa.eu/949/> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> SELECT $this ?label ?value ?role (era:nandoCode AS ?path) WHERE { $this era:nandoCode ?value . OPTIONAL { $this rdfs:label ?label0 } . BIND(COALESCE(?label0, "unknown label") AS ?label) OPTIONAL { $this era:hasOrganisationRole ?role0 } . BIND(COALESCE(STR(?role0), "none") AS ?role) FILTER NOT EXISTS { $this era:hasOrganisationRole <http://data.europa.eu/949/concepts/organisation-roles/NOBO> } }

CLDForbiddenCombinationShape
type: NodeShape
target class: CertificationLevelDocument
node kind: IRI
severity: Violation
message: The combination of CLD type ({?cldType}) and module ({?cldModule}) is forbidden for the TSI ({?tsiRoot}) at the amendment level referenced by this CLD.
sparql: CLDForbiddenCombination

CLDForbiddenCombination
type: SPARQLConstraint
select: PREFIX era: <http://data.europa.eu/949/> PREFIX dcterms: <http://purl.org/dc/terms/> PREFIX eli: <http://data.europa.eu/eli/ontology#> PREFIX owl: <http://www.w3.org/2002/07/owl#> SELECT $this ?cldType ?cldModule ?tsiRoot ?consolidated WHERE { # 1. Get CLD type and module $this dcterms:type ?cldType . $this dcterms:conformsTo ?cldModule . # 2. Query era-lex for a ForbiddenAssessmentConstraint SERVICE <repository:era-lex> { ?tsiEli owl:sameAs ?tsiRoot . ?tsiEli eli:consolidated_by ?consolidated . ?consolidated era:cldValidityRule ?rule . ?rule a era:ForbiddenAssessmentConstraint . ?rule dcterms:type ?cldType . ?rule dcterms:conformsTo ?cldModule . } # 3. CLD must reference the TSI root $this dcterms:subject ?tsiRoot . # 4. All amendments of this consolidated version must be covered FILTER NOT EXISTS { SERVICE <repository:era-lex> { ?consolidated eli:consolidates ?reqAmendment . FILTER(?reqAmendment != ?tsiEli) } FILTER NOT EXISTS { $this dcterms:subject ?reqAmendment . } FILTER NOT EXISTS { $this dcterms:subject ?cldAmendRef . SERVICE <repository:era-lex> { ?reqAmendment owl:sameAs ?cldAmendRef . } } } # 5. This must be the latest matching consolidated version FILTER NOT EXISTS { SERVICE <repository:era-lex> { ?tsiEli eli:consolidated_by ?newerConsolidated . ?newerConsolidated era:cldValidityRule ?newerRule . ?newerRule a era:ForbiddenAssessmentConstraint . ?newerRule dcterms:type ?cldType . ?newerRule dcterms:conformsTo ?cldModule . } FILTER(?newerConsolidated != ?consolidated) FILTER NOT EXISTS { SERVICE <repository:era-lex> { ?newerConsolidated eli:consolidates ?reqAmendment2 . FILTER(?reqAmendment2 != ?tsiEli) } FILTER NOT EXISTS { $this dcterms:subject ?reqAmendment2 . } FILTER NOT EXISTS { $this dcterms:subject ?cldAmendRef2 . SERVICE <repository:era-lex> { ?reqAmendment2 owl:sameAs ?cldAmendRef2 . } } } SERVICE <repository:era-lex> { { SELECT ?newerConsolidated (COUNT(DISTINCT ?na) AS ?newerCount) WHERE { ?newerConsolidated eli:consolidates ?na . } GROUP BY ?n…

CLDValidityDurationShape
type: NodeShape
target class: CertificationLevelDocument
node kind: IRI
severity: Violation
message: CLD validity duration ({?actualYears} years) exceeds the maximum allowed ({?maxYears} years) for type {?cldType} with module {?cldModule} under TSI {?tsiRoot}.
sparql: CLDValidityDuration

CLDValidityDuration
type: SPARQLConstraint
select: PREFIX era: <http://data.europa.eu/949/> PREFIX dcterms: <http://purl.org/dc/terms/> PREFIX eli: <http://data.europa.eu/eli/ontology#> PREFIX owl: <http://www.w3.org/2002/07/owl#> PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> PREFIX time: <http://www.w3.org/2006/time#> SELECT $this ?cldType ?cldModule ?tsiRoot ?maxYears ?actualYears WHERE { # 1. Get CLD properties $this dcterms:type ?cldType . $this dcterms:conformsTo ?cldModule . $this dcterms:valid ?validPeriod . ?validPeriod time:hasDurationDescription ?duration . ?duration time:years ?actualYearsRaw . BIND(xsd:decimal(?actualYearsRaw) AS ?actualYears) # 2. Get TSI subject $this dcterms:subject ?tsiRoot . # 3. Look up the applicable MaxDurationConstraint { # --- Path A: TSI-specific constraint --- SERVICE <repository:era-lex> { ?tsiEli owl:sameAs ?tsiRoot . ?tsiEli eli:consolidated_by ?consolidated . ?consolidated era:cldValidityRule ?rule . ?rule a era:MaxDurationConstraint . ?rule dcterms:type ?cldType . ?rule dcterms:conformsTo ?cldModule . ?rule time:years ?maxYears . } # All amendments covered FILTER NOT EXISTS { SERVICE <repository:era-lex> { ?consolidated eli:consolidates ?reqAmendment . FILTER(?reqAmendment != ?tsiEli) } FILTER NOT EXISTS { $this dcterms:subject ?reqAmendment . } FILTER NOT EXISTS { $this dcterms:subject ?cldAmendRef . SERVICE <repository:era-lex> { ?reqAmendment owl:sameAs ?cldAmendRef . } } } # Latest matching consolidated version FILTER NOT EXISTS { SERVICE <repository:era-lex> { ?tsiEli eli:consolidated_by ?newerConsolidated . ?newerConsolidated era:cldValidityRule ?newerRule . ?newerRule a era:MaxDurationConstraint . ?newerRule dcterms:type ?cldType . ?newerRule dcterms:conformsTo ?cldModule . } FILTER(?newerConsolidated != ?consolidated) FILTER NOT EXISTS { SERVICE <repository:era-lex> { ?newerConsolidated eli:consolidates ?reqAmendment2 . FILTER(?reqAmendment2 != ?tsiEli) } FILTER NOT EXISTS { $this dcterms:subject ?reqAmendment2 . } FILTER NOT EXISTS { $this dcterms:subject ?cld…

CLDUnlimitedShouldNotExpireShape
type: NodeShape
target class: CertificationLevelDocument
node kind: IRI
severity: Warning
message: CLD type {?cldType} with module {?cldModule} under TSI {?tsiRoot} should have unlimited validity, but an end date or duration is specified.
sparql: CLDUnlimitedShouldNotExpire

CLDUnlimitedShouldNotExpire
type: SPARQLConstraint
select: PREFIX era: <http://data.europa.eu/949/> PREFIX dcterms: <http://purl.org/dc/terms/> PREFIX eli: <http://data.europa.eu/eli/ontology#> PREFIX owl: <http://www.w3.org/2002/07/owl#> PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> PREFIX time: <http://www.w3.org/2006/time#> SELECT $this ?cldType ?cldModule ?tsiRoot WHERE { # 1. Get CLD properties $this dcterms:type ?cldType . $this dcterms:conformsTo ?cldModule . $this dcterms:subject ?tsiRoot . $this dcterms:valid ?validPeriod . # 2. CLD has an end date or a duration — it should not { ?validPeriod time:hasEnd ?endDate . } UNION { ?validPeriod time:hasDurationDescription ?dur . ?dur time:years ?yrs . } # 3. Determine whether the applicable rule is UnlimitedValidityConstraint { # --- Path A: TSI-specific constraint --- SERVICE <repository:era-lex> { ?tsiEli owl:sameAs ?tsiRoot . ?tsiEli eli:consolidated_by ?consolidated . ?consolidated era:cldValidityRule ?rule . ?rule a era:UnlimitedValidityConstraint . ?rule dcterms:type ?cldType . ?rule dcterms:conformsTo ?cldModule . } # All amendments covered FILTER NOT EXISTS { SERVICE <repository:era-lex> { ?consolidated eli:consolidates ?reqAmendment . FILTER(?reqAmendment != ?tsiEli) } FILTER NOT EXISTS { $this dcterms:subject ?reqAmendment . } FILTER NOT EXISTS { $this dcterms:subject ?cldAmendRef . SERVICE <repository:era-lex> { ?reqAmendment owl:sameAs ?cldAmendRef . } } } # Latest matching FILTER NOT EXISTS { SERVICE <repository:era-lex> { ?tsiEli eli:consolidated_by ?newerConsolidated . ?newerConsolidated era:cldValidityRule ?newerRule . ?newerRule dcterms:type ?cldType . ?newerRule dcterms:conformsTo ?cldModule . } FILTER(?newerConsolidated != ?consolidated) FILTER NOT EXISTS { SERVICE <repository:era-lex> { ?newerConsolidated eli:consolidates ?reqAmendment2 . FILTER(?reqAmendment2 != ?tsiEli) } FILTER NOT EXISTS { $this dcterms:subject ?reqAmendment2 . } FILTER NOT EXISTS { $this dcterms:subject ?cldAmendRef2 . SERVICE <repository:era-lex> { ?reqAmendment2 owl:sameAs ?cl…

CLDValidityRule
type: PropertyShape
path: cldValidityRule
affected property: cldValidityRule
affected class: LegalResource
name: CLD validity rule
node kind: IRI
class: ValidityConstraint
min count: 0
description: Links a legal resource to a validity constraint governing a specific CLD type and module combination.
message: CLD validity rule must point to a validity constraint.
severity: Violation

IntervalDurationShape
type: PropertyShape
path: hasDurationDescription
affected property: hasDurationDescription
name: Validity Duration
description: Duration of the validity interval.
message: A validity interval with duration must have exactly one duration description.
severity: Violation
qualified value shape: DurationLiteralShape
qualified min count: 1
qualified max count: 1
min count: 1
max count: 1

DurationInYearsDescriptionShape
type: PropertyShape
path: years
affected property: years
name: Duration in Years
datatype: nonNegativeInteger
description: The duration in years.
message: A validity interval with duration must have exactly one duration in years description.
severity: Violation
min count: 0
max count: 1

IntervalBeginningDateShape
type: PropertyShape
path: hasBeginning
affected property: hasBeginning
name: Validity Start Date
qualified value shape: ValidityInstantShape
qualified min count: 1
qualified max count: 1
description: Start date of the validity interval.
message: A validity interval must have exactly one start date.
severity: Violation
min count: 1
max count: 1

IntervalEndingDateShape
type: PropertyShape
path: hasEnd
affected property: hasEnd
name: Validity End Date
qualified value shape: ValidityInstantShape
qualified min count: 1
qualified max count: 1
description: End date of the validity interval.
message: A validity interval must have exactly one end date.
severity: Violation
min count: 1
max count: 1

ValidityInstantXSDDateShape
type: PropertyShape
path: inXSDDate
affected property: inXSDDate
name: Validity Instant (XSD Date)
datatype: date
description: The instant in time represented as an XSD Date.
message: A time instant must have exactly one XSD date value.
severity: Violation
min count: 1
max count: 1