# AUTO-GENERATED by scripts/prepare-ttl.sh — DO NOT EDIT MANUALLY

@prefix dcat: <http://www.w3.org/ns/dcat#> .
@prefix dct: <http://purl.org/dc/terms/> .
@prefix era-sh-eratv: <http://data.europa.eu/949/eratv/shapes/> .
@prefix era-sh: <http://data.europa.eu/949/shapes/> .
@prefix era-va-authcase: <http://data.europa.eu/949/concepts/va-authcases/> .
@prefix era: <http://data.europa.eu/949/> .
@prefix erad: <http://data.europa.eu/949/id/dataset/> .
@prefix erag: <http://data.europa.eu/949/id/graph/> .
@prefix erat: <http://data.europa.eu/949/id/distribution/> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix prov: <http://www.w3.org/ns/prov#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix vpa: <https://w3id.org/vpa#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .


era-sh:AllEraTypesTarget
    a sh:SPARQLTarget ;
    era:scope "local" ;
    sh:prefixes era: ;
    sh:select """
        SELECT DISTINCT ?this
        WHERE {
          ?s a ?this .
          FILTER(STRSTARTS(STR(?this), "http://data.europa.eu/949/")) .
        }
    """ .

era-sh:AllEraPropertiesTarget
    a sh:SPARQLTarget ;
    era:scope "local" ;
    sh:prefixes era: ;
    sh:select """
        SELECT DISTINCT ?this
        WHERE {
          ?s ?this ?o .
          FILTER(STRSTARTS(STR(?this), "http://data.europa.eu/949/")) .
        }
    """ .

##############################################################
# ERA class validation
##############################################################

era-sh:EraOntologyClassShape
    a sh:NodeShape ;
    sh:target era-sh:AllEraTypesTarget ;
    sh:severity sh:Violation ;
.

##############################################################
# 1. ERA classes must exist in ontology
##############################################################

era-sh:EraOntologyClassShape sh:sparql era-sh:EraOntologyClassSPARQL .
era-sh:EraOntologyClassSPARQL
        a sh:SPARQLConstraint ;
        sh:prefixes era: ;
        sh:message "Invalid ERA class {$this}. The class is not defined in the ERA ontology (possible typo)."@en ;
        sh:select """
            SELECT $this (rdf:type AS ?path)
            WHERE {
              FILTER NOT EXISTS {
                { $this a owl:Class }
                UNION
                { $this a rdfs:Class }
              }
            }
        """
    .

##############################################################
# 2. Deprecated ERA classes
##############################################################

era-sh:EraOntologyClassShape sh:sparql era-sh:EraOntologyDeprecatedClassSPARQL .
era-sh:EraOntologyDeprecatedClassSPARQL
        a sh:SPARQLConstraint ;
        sh:prefixes era: ;
        sh:message "Deprecated ERA class {$this} used. Suggested replacement: {$replacement}"@en ;
        sh:select """
            PREFIX vs:   <http://www.w3.org/2003/06/sw-vocab-status/ns#>

            SELECT $this ?replacement (rdf:type AS ?path)
            WHERE {
              {
                $this owl:deprecated true
              }
              UNION
              {
                $this vs:term_status "archaic"
              }

              OPTIONAL {
                $this dct:isReplacedBy ?replacement0
              }
              BIND(COALESCE(?replacement0, "?") AS ?replacement)
            }
        """
    .

##############################################################
# ERA property validation
##############################################################

era-sh:EraOntologyPropertyShape
    a sh:NodeShape ;
    sh:target era-sh:AllEraPropertiesTarget ;
    sh:severity sh:Violation ;
.

##############################################################
# 3. ERA predicates must exist and be defined properties
# (robust typo detection)
##############################################################

era-sh:EraOntologyPropertyShape sh:sparql era-sh:EraOntologyPredicateSPARQL .
era-sh:EraOntologyPredicateSPARQL
        a sh:SPARQLConstraint ;
        sh:prefixes era: ;
        sh:message "Invalid ERA predicate {$this}. The term is not defined as a property in the ERA ontology (possible typo)."@en ;
        sh:select """
            SELECT $this  ($this AS ?path)
            WHERE {
              FILTER NOT EXISTS {
                { $this a rdf:Property }
                UNION
                { $this a owl:ObjectProperty }
                UNION
                { $this a owl:DatatypeProperty }
                UNION
                { $this a owl:AnnotationProperty }
              }
            }
        """
    .

##############################################################
# 4. Deprecated ERA predicates
##############################################################

era-sh:EraOntologyPropertyShape sh:sparql era-sh:EraOntologyDeprecatedPropertySPARQL .
era-sh:EraOntologyDeprecatedPropertySPARQL
        a sh:SPARQLConstraint ;
        sh:prefixes era: ;
        sh:message "Deprecated ERA property {$this} used. Suggested replacement: {$replacement}"@en ;
        sh:select """
            PREFIX vs:  <http://www.w3.org/2003/06/sw-vocab-status/ns#>

            SELECT $this ?replacement ($this AS ?path)
            WHERE {
              {
                $this owl:deprecated true
              }
              UNION
              {
                $this vs:term_status "archaic"
              }

              OPTIONAL {
                $this dct:isReplacedBy ?replacement0
              }
              BIND(COALESCE(?replacement0, "?") AS ?replacement)
            }
        """
    .


era: sh:declare 
  [sh:prefix "dcat" ; sh:namespace "http://www.w3.org/ns/dcat#"^^xsd:anyURI ;],
  [sh:prefix "dct" ; sh:namespace "http://purl.org/dc/terms/"^^xsd:anyURI ;],
  [sh:prefix "era" ; sh:namespace "http://data.europa.eu/949/"^^xsd:anyURI ;],
  [sh:prefix "geo" ; sh:namespace "http://www.opengis.net/ont/geosparql#"^^xsd:anyURI ;],
  [sh:prefix "geosparql" ; sh:namespace "http://www.opengis.net/ont/geosparql#"^^xsd:anyURI ;],
  [sh:prefix "owl" ; sh:namespace "http://www.w3.org/2002/07/owl#"^^xsd:anyURI ;],
  [sh:prefix "prov" ; sh:namespace "http://www.w3.org/ns/prov#"^^xsd:anyURI ;],
  [sh:prefix "rdf" ; sh:namespace "http://www.w3.org/1999/02/22-rdf-syntax-ns#"^^xsd:anyURI ;],
  [sh:prefix "rdfs" ; sh:namespace "http://www.w3.org/2000/01/rdf-schema#"^^xsd:anyURI ;],
  [sh:prefix "sh" ; sh:namespace "http://www.w3.org/ns/shacl#"^^xsd:anyURI ;],
  [sh:prefix "skos" ; sh:namespace "http://www.w3.org/2004/02/skos/core#"^^xsd:anyURI ;],
  [sh:prefix "vpa" ; sh:namespace "https://w3id.org/vpa#"^^xsd:anyURI ;],
  [sh:prefix "xsd" ; sh:namespace "http://www.w3.org/2001/XMLSchema#"^^xsd:anyURI ;] ;
.


######################################################
# SHACL metadata - owl:versionInfo, dcterms, dcat, prov
######################################################


<http://data.europa.eu/949/id/dataset/eratv/era-shapes> a dcat:Dataset ;

    dct:title "SHACL Shapes for ERATV dataset compliant with ERA ontology"@en ;
    dct:description """
    SHACL constraints validating RDF ERATV datasets
    according to the ERA ontology .
    """@en ;
    dct:publisher <http://publications.europa.eu/resource/authority/corporate-body/ERA> ;
    dct:creator <http://publications.europa.eu/resource/authority/corporate-body/ERA> ;
    dct:issued "2026-03-15"^^xsd:date ;

    ## FAIR – Accessible
    dcat:landingPage <https://rinf.data.era.europa.eu/era-vocabulary/era-shapes> ;

    ## FAIR – Interoperable
    dct:conformsTo <https://www.w3.org/TR/shacl/> ;
    dct:conformsTo era: ;

    ## FAIR – Reusable
    dct:license <http://data.europa.eu/eli/dec_impl/2017/863/oj> ;
    dct:language <http://publications.europa.eu/resource/authority/language/ENG> ;
    owl:versionInfo "3.3.2" ;

    ## DCAT distribution
    dcat:distribution <http://data.europa.eu/949/id/distribution/eratv/era-shapes> ;

    ## Provenance
    prov:wasDerivedFrom era: ;
    prov:wasAttributedTo <http://publications.europa.eu/resource/authority/corporate-body/ERA> .

###########################
# DCAT distribution details
#@#########################

<http://data.europa.eu/949/id/distribution/eratv/era-shapes>
    a dcat:Distribution ;
    dct:title "ERA ERATV SHACL shapes (Turtle)"@en ;
    dcat:downloadURL <https://data-interop.era.europa.eu/era-vocabulary/eratv/era-shapes> ;
    dcat:mediaType "text/turtle" ;
    dcat:format <http://publications.europa.eu/resource/authority/file-type/RDF_TURTLE> ;
    dct:license <http://data.europa.eu/eli/dec_impl/2017/863/oj> .


### AXle spacing ###
era-sh:AxleSpacingShape
    a sh:NodeShape ;
    sh:nodeKind sh:IRI ;
    sh:targetClass era:AxleSpacing .

era-sh:AxleSpacingShape sh:property era-sh:AxleSpacingDistanceA .
era-sh:AxleSpacingDistanceA
    a sh:PropertyShape ;
    era:affectedProperty era:axleSpacingDistanceA ;
    era:affectedClass era:AxleSpacing ;
    era:scope "local" ;
    rdfs:comment "Validation for axleSpacingDistanceA property. Position of the axles along the unit: a: Distance between axles." ;
    sh:path era:axleSpacingDistanceA ;
    sh:datatype xsd:decimal ;
    sh:severity sh:Violation ;
    sh:message "axleSpacingDistanceA: The value must be a decimal representing the distance between axles."@en ;
    era:eratvIndex "4.5.3.4" .

era-sh:AxleSpacingShape sh:property era-sh:AxleSpacingDistanceB .
era-sh:AxleSpacingDistanceB
    a sh:PropertyShape ;
    era:affectedProperty era:axleSpacingDistanceB ;
    era:affectedClass era:AxleSpacing ;
    era:scope "local" ;
    rdfs:comment "Validation for axleSpacingDistanceB property. Position of the axles along the unit: b: Distance from end axle to the end of the nearest coupling plane." ;
    sh:path era:axleSpacingDistanceB ;
    sh:datatype xsd:decimal ;
    sh:severity sh:Violation ;
    sh:message "axleSpacingDistanceB: The value must be a decimal representing the distance from end axle to the end of the nearest coupling plane."@en ;
    era:eratvIndex "4.5.3.4" .

era-sh:AxleSpacingShape sh:property era-sh:AxleSpacingDistanceC .
era-sh:AxleSpacingDistanceC
    a sh:PropertyShape ;
    era:affectedProperty era:axleSpacingDistanceC ;
    era:affectedClass era:AxleSpacing ;
    era:scope "local" ;
    rdfs:comment "Validation for axleSpacingDistanceC property. Position of the axles along the unit: c: distance between two inside axles." ;
    sh:path era:axleSpacingDistanceC ;
    sh:datatype xsd:decimal ;
    sh:severity sh:Violation ;
    sh:message "axleSpacingDistanceC: The value must be a decimal representing the distance between two inside axles."@en ;
    era:eratvIndex "4.5.3.4" .

era-sh:AxleSpacingShape sh:property era-sh:AxleSpacingExplanation .
era-sh:AxleSpacingExplanation
    a sh:PropertyShape ;
    era:affectedProperty era:axleSpacingExplanation ;
    era:affectedClass era:AxleSpacing ;
    era:scope "local" ;
    rdfs:comment "Validation for axleSpacingExplanation property." ;
    sh:path era:axleSpacingExplanation ;
    sh:datatype xsd:string ;
    sh:severity sh:Violation ;
    sh:message "axleSpacingExplanation (4.5.3.4): The value must be a string."@en ;
    era:eratvIndex "4.5.3.4" .



era-sh:BrakingPerformanceShape 
    a sh:NodeShape ;
    sh:nodeKind sh:IRI ;
    sh:targetClass era:BrakingPerformance .

era-sh:BrakingPerformanceShape sh:property era-sh:WithBrakedMass .
era-sh:WithBrakedMass
    a sh:PropertyShape ;
    era:affectedProperty era:withBrakedMass ;
    era:affectedClass era:BrakingPerformance ;
    era:scope "local" ;
    rdfs:comment "Validation for withBrakedMass property. Braked mass value." ;
    sh:path era:withBrakedMass ;
    sh:datatype xsd:decimal ;
    sh:severity sh:Violation ;
    sh:message "withBrakedMass: The value must be a decimal representing braked mass."@en .

era-sh:BrakingPerformanceShape sh:property era-sh:WithBrakedMassPercentage .
era-sh:WithBrakedMassPercentage
    a sh:PropertyShape ;
    era:affectedProperty era:withBrakedMassPercentage ;
    era:affectedClass era:BrakingPerformance ;
    era:scope "local" ;
    rdfs:comment "Validation for withBrakedMassPercentage property. Braked mass percentage value." ;
    sh:path era:withBrakedMassPercentage ;
    sh:datatype xsd:decimal ;
    sh:severity sh:Violation ;
    sh:message "withBrakedMassPercentage: The value must be a decimal representing braked mass percentage."@en .

era-sh:BrakingPerformanceShape sh:property era-sh:ServiceBrakingProfile .
era-sh:ServiceBrakingProfile
    a sh:PropertyShape ;
    era:affectedProperty era:serviceBrakingProfile ;
    era:affectedClass era:BrakingPerformance ;
    era:scope "local" ;
    rdfs:comment "Validation for serviceBrakingProfile property. Links to the maximum service braking profile." ;
    sh:path era:serviceBrakingProfile ;
    sh:nodeKind sh:IRI ;
    sh:class era:BrakingProfile ;
    sh:severity sh:Violation ;
    sh:message "serviceBrakingProfile: The value must be an IRI pointing to a BrakingProfile."@en ;
    era:eratvIndex "4.7.7" .

era-sh:BrakingProfileShape 
    a sh:NodeShape ;
    sh:nodeKind sh:IRI ;
    sh:targetClass era:BrakingProfile .

era-sh:BrakingProfileShape sh:property era-sh:ProfileLoadConditionMass .
era-sh:ProfileLoadConditionMass
    a sh:PropertyShape ;
    era:affectedProperty era:profileLoadConditionMass ;
    era:affectedClass era:BrakingProfile ;
    era:scope "local" ;
    rdfs:comment "Validation for profileLoadConditionMass property. Load condition mass for which the braking profile applies." ;
    sh:path era:profileLoadConditionMass ;
    sh:datatype xsd:integer ;
    sh:severity sh:Violation ;
    sh:message "profileLoadConditionMass: The value must be an integer representing the load condition mass."@en ;
    era:eratvIndex "4.7.5" .

era-sh:BrakingProfileShape sh:property era-sh:ProfileDeceleration .
era-sh:ProfileDeceleration
    a sh:PropertyShape ;
    era:affectedProperty era:profileDeceleration ;
    era:affectedClass era:BrakingProfile ;
    era:scope "local" ;
    rdfs:comment "Validation for profileDeceleration property. Maximum train deceleration for a braking profile at design maximum speed." ;
    sh:path era:profileDeceleration ;
    sh:datatype xsd:decimal ;
    sh:severity sh:Violation ;
    sh:message "profileDeceleration: The value must be a decimal representing maximum deceleration in m/s²."@en ;
    era:eratvIndex "4.7.5" , "4.7.7" .

era-sh:BrakingProfileShape sh:property era-sh:ProfileStoppingDistance .
era-sh:ProfileStoppingDistance
    a sh:PropertyShape ;
    era:affectedProperty era:profileStoppingDistance ;
    era:affectedClass era:BrakingProfile ;
    era:scope "local" ;
    rdfs:comment "Validation for profileStoppingDistance property. Maximum train stopping distance for a braking profile at design maximum speed." ;
    sh:path era:profileStoppingDistance ;
    sh:datatype xsd:integer ;
    sh:severity sh:Violation ;
    sh:message "profileStoppingDistance: The value must be an integer representing stopping distance in meters."@en ;
    era:eratvIndex "4.7.5" , "4.7.7" .

era-sh:CertificateNodeShape
    a sh:NodeShape ;
    sh:nodeKind sh:IRI ;
    sh:targetClass era:Certificate .

era-sh:MaximumSpeedAndCantDeficiencyShape 
    a sh:NodeShape ;
    sh:nodeKind sh:IRI ;
    sh:targetClass era:MaximumSpeedAndCantDeficiency .

era-sh:MaximumSpeedAndCantDeficiencyShape sh:property era-sh:VehicleTypeMaximumCantDeficiency .
era-sh:VehicleTypeMaximumCantDeficiency
    a sh:PropertyShape ;
    era:affectedProperty era:vehicleTypeMaximumCantDeficiency ;
    era:affectedClass era:MaximumSpeedAndCantDeficiency ;
    era:scope "local" ;
    rdfs:comment "Validation for vehicleTypeMaximumCantDeficiency property. Maximum cant deficiency for which the vehicle type has been assessed." ;
    sh:path era:vehicleTypeMaximumCantDeficiency ;
    sh:datatype xsd:integer ;
    sh:severity sh:Violation ;
    sh:message "vehicleTypeMaximumCantDeficiency: The value must be an integer representing cant deficiency in millimeters."@en ;
    era:eratvIndex "4.6.4" .

era-sh:MaximumSpeedAndCantDeficiencyShape sh:property era-sh:VehicleTypeMaximumSpeed .
era-sh:VehicleTypeMaximumSpeed
    a sh:PropertyShape ;
    era:affectedProperty era:vehicleTypeMaximumSpeed ;
    era:affectedClass era:MaximumSpeedAndCantDeficiency ;
    era:scope "local" ;
    rdfs:comment "Validation for vehicleTypeMaximumSpeed property. Maximum speed for which the vehicle type has been assessed with the corresponding cant deficiency." ;
    sh:path era:vehicleTypeMaximumSpeed ;
    sh:datatype xsd:integer ;
    sh:severity sh:Violation ;
    sh:message "vehicleTypeMaximumSpeed: The value must be an integer representing speed in km/h."@en ;
    era:eratvIndex "4.6.4" .

era-sh:RestrictionShape 
    a sh:NodeShape ;
    sh:nodeKind sh:IRI ;
    sh:targetClass era:Restriction .

era-sh:RestrictionShape sh:property era-sh:IsConditionBasedRestriction .
era-sh:IsConditionBasedRestriction
    a sh:PropertyShape ;
    era:affectedProperty era:isConditionBasedRestriction ;
    era:affectedClass era:Restriction ;
    era:scope "local" ;
    rdfs:comment "Validation for isConditionBasedRestriction property." ;
    sh:path era:isConditionBasedRestriction ;
    sh:datatype xsd:boolean ;
    sh:severity sh:Violation ;
    sh:message "isConditionBasedRestriction: The value must be a boolean."@en .

era-sh:RestrictionShape sh:property era-sh:IsTimeBasedRestriction .
era-sh:IsTimeBasedRestriction
    a sh:PropertyShape ;
    era:affectedProperty era:isTimeBasedRestriction ;
    era:affectedClass era:Restriction ;
    era:scope "local" ;
    rdfs:comment "Validation for isTimeBasedRestriction property. Indicates if the restriction is time-based." ;
    sh:path era:isTimeBasedRestriction ;
    sh:datatype xsd:boolean ;
    sh:severity sh:Violation ;
    sh:message "isTimeBasedRestriction: The value must be a boolean (true/false)."@en .

era-sh:RestrictionShape sh:property era-sh:OtherCCSRadioSystemOnboard .
era-sh:OtherCCSRadioSystemOnboard
    a sh:PropertyShape ;
    era:affectedProperty era:otherCCSRadioSystemOnboard ;
    era:affectedClass era:Restriction ;
    era:scope "local" ;
    rdfs:comment "Validation for otherCCSRadioSystemOnboard property."@en ;
    sh:path era:otherCCSRadioSystemOnboard ;
    sh:nodeKind sh:IRI ;
    sh:maxCount 1 ;
    sh:severity sh:Violation ;
    sh:message "otherCCSRadioSystemOnboard: The value must be an IRI."@en .

era-sh:RestrictionShape sh:sparql era-sh:OtherCCSRadioSystemOnboardSKOS .
era-sh:OtherCCSRadioSystemOnboardSKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:otherCCSRadioSystemOnboard ;
    era:affectedClass era:Restriction ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of otherCCSRadioSystemOnboard is a valid SKOS concept from the other CCS radio system concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "otherCCSRadioSystemOnboard: The Restriction {$this} with label {?label} has a value {?value} that is not one of the predefined values and cannot be converted into a SKOS concept on this list: <http://data.europa.eu/949/other-ccs-radio-system/OtherCCSRadioSystem>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this (era:otherCCSRadioSystemOnboard AS ?path) (?concept AS ?value) ?label
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:otherCCSRadioSystemOnboard ?concept .
            era:otherCCSRadioSystemOnboard era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:RestrictionShape sh:property era-sh:OtherCCSSystemOnboard .
era-sh:OtherCCSSystemOnboard
    a sh:PropertyShape ;
    era:affectedProperty era:otherCCSSystemOnboard ;
    era:affectedClass era:Restriction ;
    era:scope "local" ;
    rdfs:comment "Validation for otherCCSSystemOnboard property."@en ;
    sh:path era:otherCCSSystemOnboard ;
    sh:nodeKind sh:IRI ;
    sh:maxCount 1 ;
    sh:severity sh:Violation ;
    sh:message "otherCCSSystemOnboard: The value must be an IRI."@en .

era-sh:RestrictionShape sh:sparql era-sh:OtherCCSSystemOnboardSKOS .
era-sh:OtherCCSSystemOnboardSKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:otherCCSSystemOnboard ;
    era:affectedClass era:Restriction ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of otherCCSSystemOnboard is a valid SKOS concept from the other CCS signalling system concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "otherCCSSystemOnboard: The Restriction {$this} with label {?label} has a value {?value} that is not one of the predefined values and cannot be converted into a SKOS concept on this list: <http://data.europa.eu/949/other-ccs-signalling-system/OtherCCSSignallingSystem>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this (era:otherCCSSystemOnboard AS ?path) (?concept AS ?value) ?label
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:otherCCSSystemOnboard ?concept .
            era:otherCCSSystemOnboard era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .



era-sh:VehicleRegistrationRestrictionShape 
    a sh:NodeShape ;
    sh:nodeKind sh:IRI ;
    sh:targetClass era:VehicleRegistrationRestriction .


era-sh:VehicleShape 
    a sh:NodeShape ;
    sh:nodeKind sh:IRI ;
    sh:targetClass era:Vehicle .

era-sh:VehicleShape sh:property era-sh:VehicleNumber .
era-sh:VehicleNumber
    a sh:PropertyShape ;
    era:affectedProperty era:vehicleNumber ;
    era:affectedClass era:Vehicle ;
    era:scope "local" ;
    rdfs:comment "Validation for vehicleNumber property." ;
    sh:path era:vehicleNumber ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
    sh:severity sh:Violation ;
    sh:message "vehicleNumber: The value must be a string. At most one value is allowed."@en .

era-sh:VehicleShape sh:property era-sh:VehicleSeries .
era-sh:VehicleSeries
    a sh:PropertyShape ;
    era:affectedProperty era:inVehicleSeries ;
    era:affectedClass era:Vehicle ;
    era:scope "local" ;
    rdfs:comment "Validation for vehicleSeries property." ;
    sh:path era:inVehicleSeries ;
    sh:nodeKind sh:IRI ;
    sh:class era:VehicleSeries ;
    sh:severity sh:Violation ;
    sh:message "vehicleSeries: The value must be a string."@en .


era-sh:VehicleShape sh:property era-sh:HasCompositeBrakeBlockRetrofitted .
era-sh:HasCompositeBrakeBlockRetrofitted
    a sh:PropertyShape ;
    era:affectedProperty era:hasCompositeBrakeBlockRetrofitted ;
    era:affectedClass era:Vehicle ;
    era:scope "local" ;
    rdfs:comment "Validation for hasCompositeBrakeBlockRetrofitted property." ;
    sh:path era:hasCompositeBrakeBlockRetrofitted ;
    sh:datatype xsd:boolean ;
    sh:severity sh:Violation ;
    sh:message "hasCompositeBrakeBlockRetrofitted: The value must be a boolean."@en .

era-sh:VehicleShape sh:property era-sh:OperationalRestriction .
era-sh:OperationalRestriction
    a sh:PropertyShape ;
    era:affectedProperty era:operationalRestriction ;
    era:affectedClass era:Vehicle ;
    era:scope "local" ;
    rdfs:comment "Validation for operationalRestriction property."@en ;
    sh:path era:operationalRestriction ;
    sh:nodeKind sh:IRI ;
    sh:severity sh:Violation ;
    sh:message "operationalRestriction: The value must be an IRI."@en .

era-sh:VehicleShape sh:sparql era-sh:OperationalRestrictionSKOS .
era-sh:OperationalRestrictionSKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:operationalRestriction ;
    era:affectedClass era:Vehicle ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of operationalRestriction is a valid SKOS concept from the restrictions concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "operationalRestriction: The Vehicle {$this} with label {?label} has a value {?value} 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/restrictions/Restrictions>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this (era:operationalRestriction AS ?path) (?concept AS ?value) ?label
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:operationalRestriction ?concept .
            era:operationalRestriction era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:VehicleTypeAuthorisationRestrictionShape sh:property era-sh:QuieterRoutesExemptedCountry .
era-sh:QuieterRoutesExemptedCountry
    a sh:PropertyShape ;
    era:affectedProperty era:quieterRoutesExemptedCountry ;
    era:affectedClass era:VehicleTypeAuthorisationRestriction ;
    era:scope "local" ;
    rdfs:comment "Validation for quieterRoutesExemptedCountry property."@en ;
    sh:path era:quieterRoutesExemptedCountry ;
    sh:nodeKind sh:IRI ;
    sh:severity sh:Violation ;
    sh:message "quieterRoutesExemptedCountry: The value must be an IRI."@en .

era-sh:VehicleShape sh:sparql era-sh:QuieterRoutesExemptedCountrySKOS .
era-sh:VehicleTypeAuthorisationRestrictionShape sh:sparql era-sh:QuieterRoutesExemptedCountrySKOS .
era-sh:QuieterRoutesExemptedCountrySKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:quieterRoutesExemptedCountry ;
    era:affectedClass era:Vehicle ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of quieterRoutesExemptedCountry is a valid SKOS concept from the country authority concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "quieterRoutesExemptedCountry: The Vehicle {$this} with label {?label} has a value {?value} 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>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this (era:quieterRoutesExemptedCountry AS ?path) (?concept AS ?value) ?label
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:quieterRoutesExemptedCountry ?concept .
            era:quieterRoutesExemptedCountry era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:VehicleShape sh:property era-sh:VehicleKeeper .
era-sh:VehicleKeeper
    a sh:PropertyShape ;
    era:affectedProperty era:vehicleKeeper ;
    era:affectedClass era:Vehicle ;
    era:scope "local" ;
    rdfs:comment "Validation for vehicleKeeper property." ;
    sh:path era:vehicleKeeper ;
    sh:nodeKind sh:IRI ;
    sh:class era:OrganisationRole ;
    sh:severity sh:Violation ;
    sh:message "vehicleKeeper: The value must be an IRI pointing to an OrganisationRole."@en .

era-sh:VehicleShape sh:property era-sh:VehicleType .
era-sh:VehicleType
    a sh:PropertyShape ;
    era:affectedProperty era:vehicleType ;
    era:affectedClass era:Vehicle ;
    era:scope "local" ;
    rdfs:comment "Validation for vehicleType property." ;
    sh:path era:vehicleType ;
    sh:nodeKind sh:IRI ;
    sh:class era:VehicleType ;
    sh:severity sh:Violation ;
    sh:message "vehicleType: The value must be an IRI pointing to a VehicleType."@en .



era-sh:VehicleTypeAuthorisationApplicationShape
    a sh:NodeShape ;
    sh:nodeKind sh:IRI ;
    sh:targetClass  era:VehicleTypeAuthorisationApplication .

era-sh:VehicleTypeAuthorisationApplicationShape sh:sparql era-sh:VPAPermissionTypeSPARQL .
era-sh:VPAPermissionTypeSPARQL 
    a sh:SPARQLConstraint ;   # This triple is optional
    sh:message "VA Applications contain a valid authorisation case. Valid combinations are not checked."@en ;
    sh:prefixes era: ;
    sh:select """
    PREFIX era-va-authcase: <http://data.europa.eu/949/concepts/va-authcases/>
    
    SELECT $this ?authcasetype (vpa:permissionType AS ?path)
    WHERE {
      $this vpa:constitutedBy/vpa:permissionType ?authcasetype .
      FILTER (  !isLiteral(?authcasetype)                ||  # literal is not allowed
                !( ?authcasetype = era-va-authcase:C2T ) ||  # correct SKOS Concept for C2T
                !( ?authcasetype = era-va-authcase:NEW )     # correct SKOS Concept for NEW
                # incomplete
            )
      }
      """ ;
    .

era-sh:PAVA_CC_I_11_b
  a sh:NodeShape ;
  sh:nodeKind sh:IRI ;
  sh:targetClass era:VehicleTypeAuthorisationApplication .

##TODO: implement this shape
# era-sh:PAVA_CC_I_11_b sh:sparql era-sh:PAVA_CC_I_11_b_SPARQL .
# era-sh:PAVA_CC_I_11_b_SPARQL 
#     a sh:SPARQLConstraint ;   # This triple is optional
#     sh:message "VA Applications contain valid vehicle numbers (eventually in vehicle sets) as their scope."@en ;
#     #sh:js [ # js helper to validate the vehicle numbers at ?this  ]
# .

era-sh:VehicleTypeAuthorisationApplicationShape sh:property era-sh:IsPreEngagementApplication .
era-sh:IsPreEngagementApplication
    a sh:PropertyShape ;
    era:affectedProperty era:isPreEngagementApplication ;
    era:affectedClass era:VehicleTypeAuthorisationApplication ;
    era:scope "local" ;
    rdfs:comment "Validation for isPreEngagementApplication property." ;
    sh:path era:isPreEngagementApplication ;
    sh:datatype xsd:boolean ;
    sh:severity sh:Violation ;
    sh:message "isPreEngagementApplication: The value must be a boolean."@en .

era-sh:VehicleTypeAuthorisationApplicationShape sh:property era-sh:PreEngagementBaseline .
era-sh:PreEngagementBaseline
    a sh:PropertyShape ;
    era:affectedProperty era:preEngagementBaseline ;
    era:affectedClass era:VehicleTypeAuthorisationApplication ;
    era:scope "local" ;
    rdfs:comment "Validation for preEngagementBaseline property." ;
    sh:path era:preEngagementBaseline ;
    sh:nodeKind sh:IRI ;
    sh:class era:Document ;
    sh:severity sh:Violation ;
    sh:message "preEngagementBaseline: The value must be an IRI pointing to a Document."@en .


era-sh:VehicleTypeAuthorisationCaseShape
    a sh:NodeShape ;
    sh:nodeKind sh:IRI ;
    sh:targetClass  era:VehicleTypeAuthorisationCase .

era-sh:VehicleAuthorisationCaseShape
    a sh:NodeShape ;
    sh:nodeKind sh:IRI ;
    sh:targetClass era:VehicleAuthorisationCase .

era-sh:VehicleTypeAuthorisationCaseShape sh:property era-sh:AreaOfUse .
era-sh:VehicleAuthorisationCaseShape sh:property era-sh:AreaOfUse .
era-sh:AreaOfUse
    a sh:PropertyShape ;
    era:affectedClass era:VehicleTypeAuthorisationCase ,
                      era:VehicleAuthorisationCase ;
    era:affectedProperty era:areaOfUse ;
    rdfs:comment "Validation for areaOfUse property."@en ;
    sh:nodeKind sh:IRI ;
    sh:path era:areaOfUse ;
    sh:message "areaOfUse: The value must be an IRI."@en ;
    sh:severity sh:Violation .

era-sh:VehicleTypeAuthorisationCaseShape sh:sparql era-sh:AreaOfUseSKOS .
era-sh:VehicleAuthorisationCaseShape sh:sparql era-sh:AreaOfUseSKOS .
era-sh:AreaOfUseSKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:areaOfUse ;
    era:affectedClass era:VehicleTypeAuthorisationCase ,
                      era:VehicleAuthorisationCase ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of areaOfUse is a valid SKOS concept from the countries concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "areaOfUse: The VehicleTypeAuthorisationCase {$this} with label {?label} has a value {?value} 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>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this (era:areaOfUse AS ?path) (?concept AS ?value) ?label
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:areaOfUse ?concept .
            era:areaOfUse era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

# TO DO: era:areaOfUse applicability Constraint (Not applicable for Authorisation Cases of `vpa:permissionType era-va-authcase:PRE4RP)

era-sh:VehicleTypeAuthorisationCaseShape sh:property era-sh:AuthorisingMemberState .
era-sh:VehicleAuthorisationCaseShape sh:property era-sh:AuthorisingMemberState .
era-sh:AuthorisingMemberState
    a sh:PropertyShape ;
    era:affectedProperty era:authorisingMemberState ;
    era:affectedClass era:VehicleTypeAuthorisationCase ,
                      era:VehicleAuthorisationCase ;
    era:scope "local" ;
    rdfs:comment "Indicates the member state where a vehicle type has been authorized. Not to be confused with Area Of Use."@en ;
    era:eratvIndex "3.1.1" ;
    sh:path era:authorisingMemberState ;
    sh:nodeKind sh:IRI ;
    sh:severity sh:Violation ;
    sh:message "authorisingMemberState (3.1.1): The value must be an IRI."@en .

era-sh:VehicleTypeAuthorisationCaseShape sh:sparql era-sh:AuthorisingMemberStateSKOS .
era-sh:VehicleAuthorisationCaseShape sh:sparql era-sh:AuthorisingMemberStateSKOS .
era-sh:AuthorisingMemberStateSKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:authorisingMemberState ;
    era:affectedClass era:VehicleTypeAuthorisationCase ,
                      era:VehicleAuthorisationCase ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of authorisingMemberState is a valid SKOS concept from the countries concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "authorisingMemberState: The VehicleTypeAuthorisationCase {$this} with label {?label} has a value {?value} 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>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this (era:authorisingMemberState AS ?path) (?concept AS ?value) ?label
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:authorisingMemberState ?concept .
            era:authorisingMemberState era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:VehicleTypeAuthorisationCaseShape sh:property era-sh:SafetyDeclaration .
era-sh:SafetyDeclaration
    a sh:PropertyShape ;
    era:affectedProperty era:safetyDeclaration ;
    era:affectedClass era:VehicleTypeAuthorisationCase ;
    era:scope "local" ;
    rdfs:comment "Validation for safetyDeclaration property. CSM-REA Safety Declaration." ;
    sh:path era:safetyDeclaration ;
    sh:datatype xsd:anyURI ;
    sh:severity sh:Violation ;
    sh:message "safetyDeclaration: The value must be an anyURI."@en .


era-sh:VehicleTypeAuthorisationCaseShape sh:property era-sh:ConfigDependentCompliance .
era-sh:ConfigDependentCompliance
    a sh:PropertyShape ;
    era:affectedProperty era:configDependentCompliance ;
    era:affectedClass era:VehicleTypeAuthorisationCase ;
    era:scope "local" ;
    rdfs:comment "Validation for configDependentCompliance property." ;
    sh:path era:configDependentCompliance ;
    sh:nodeKind sh:IRI ;
    sh:class era:Compliance ;
    sh:severity sh:Violation ;
    sh:message "configDependentCompliance: The value must be an IRI pointing to a Compliance."@en .

era-sh:VehicleTypeAuthorisationCaseShape sh:property era-sh:ConfigDependentCondition .
era-sh:VehicleAuthorisationCaseShape sh:property era-sh:ConfigDependentCondition .
era-sh:ConfigDependentCondition
    a sh:PropertyShape ;
    era:affectedProperty era:configDependentCondition ;
    era:affectedClass era:VehicleTypeAuthorisationCase ,
                      era:VehicleAuthorisationCase ;
    era:scope "local" ;
    rdfs:comment "Validation for configDependentCondition property."@en ;
    sh:path era:configDependentCondition ;
    sh:nodeKind sh:IRI ;
    sh:class era:Compliance ;
    sh:severity sh:Violation ;
    sh:message "configDependentCondition: The value must be an IRI pointing to a Compliance."@en .

era-sh:VehicleTypeAuthorisationCaseShape sh:property era-sh:TypeRegistrationMethod .
era-sh:VehicleAuthorisationCaseShape sh:property era-sh:TypeRegistrationMethod .
era-sh:TypeRegistrationMethod
    a sh:PropertyShape ;
    era:affectedProperty era:typeRegistrationMethod ;
    era:affectedClass era:VehicleTypeAuthorisationCase ,
                      era:VehicleAuthorisationCase ;
    era:scope "local" ;
    rdfs:comment "Validation for typeRegistrationMethod property."@en ;
    sh:path era:typeRegistrationMethod ;
    sh:nodeKind sh:IRI ;
    sh:severity sh:Violation ;
    sh:message "typeRegistrationMethod: The value must be an IRI."@en .

era-sh:VehicleTypeAuthorisationCaseShape sh:sparql era-sh:TypeRegistrationMethodSKOS .
era-sh:VehicleAuthorisationCaseShape sh:sparql era-sh:TypeRegistrationMethodSKOS .
era-sh:TypeRegistrationMethodSKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:typeRegistrationMethod ;
    era:affectedClass era:VehicleTypeAuthorisationCase ,
                      era:VehicleAuthorisationCase ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of typeRegistrationMethod is a valid SKOS concept from the vehicle type registration methods concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "typeRegistrationMethod: The VehicleTypeAuthorisationCase {$this} with label {?label} has a value {?value} 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/vehicle-type-registration-methods/VehicleTypeRegistrationMethods>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this (era:typeRegistrationMethod AS ?path) (?concept AS ?value) ?label
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:typeRegistrationMethod ?concept .
            era:typeRegistrationMethod era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .


era-sh:VehicleTypeAuthorisationRestrictionShape 
    a sh:NodeShape ;
    sh:nodeKind sh:IRI ;
    sh:targetClass  era:VehicleTypeAuthorisationRestriction .

era-sh:VehicleTypeAuthorisationRestrictionShape sh:property era-sh:HasStrictLocalHistoricalTouristUse .
era-sh:HasStrictLocalHistoricalTouristUse
    a sh:PropertyShape ;
    era:affectedProperty era:hasStrictLocalHistoricalTouristUse ;
    era:affectedClass era:VehicleTypeAuthorisationRestriction ;
    era:scope "local" ;
    rdfs:comment "Validation for hasStrictLocalHistoricalTouristUse property. Indicates if the restriction applies to strictly local, historical or tourist use." ;
    sh:path era:hasStrictLocalHistoricalTouristUse ;
    sh:datatype xsd:boolean ;
    sh:severity sh:Violation ;
    sh:message "hasStrictLocalHistoricalTouristUse: The value must be a boolean (true/false)."@en ;
    era:eratvIndex "3.1.2.3" .

era-sh:RestrictionShape sh:property era-sh:OnboardRecordingDevice .
era-sh:VehicleTypeAuthorisationRestrictionShape sh:property era-sh:OnboardRecordingDevice .
era-sh:OnboardRecordingDevice
    a sh:PropertyShape ;
    era:affectedProperty era:onboardRecordingDevice ;
    era:affectedClass era:Restriction ;
    era:scope "local" ;
    rdfs:comment "Validation for onboardRecordingDevice property."@en ;
    sh:path era:onboardRecordingDevice ;
    sh:nodeKind sh:IRI ;
    sh:severity sh:Violation ;
    sh:message "onboardRecordingDevice: The value must be an IRI."@en .

era-sh:VehicleTypeAuthorisationRestrictionShape sh:sparql era-sh:OnboardRecordingDeviceSKOS .
era-sh:OnboardRecordingDeviceSKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:onboardRecordingDevice ;
    era:affectedClass era:VehicleTypeAuthorisationRestriction ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of onboardRecordingDevice is a valid SKOS concept from the onboard recording devices concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "onboardRecordingDevice: The VehicleTypeAuthorisationRestriction {$this} with label {?label} has a value {?value} 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/onboard-recording-devices/OnboardRecording>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this (era:onboardRecordingDevice AS ?path) (?concept AS ?value) ?label
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:onboardRecordingDevice ?concept .
            era:onboardRecordingDevice era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:VehicleTypeAuthorisationRestrictionShape sh:property era-sh:QuieterRoutesNoiseCategory .
era-sh:QuieterRoutesNoiseCategory
    a sh:PropertyShape ;
    era:affectedProperty era:quieterRoutesNoiseCategory ;
    era:affectedClass era:VehicleTypeAuthorisationRestriction ;
    era:scope "local" ;
    rdfs:comment "Validation for quieterRoutesNoiseCategory property."@en ;
    sh:path era:quieterRoutesNoiseCategory ;
    sh:nodeKind sh:IRI ;
    sh:severity sh:Violation ;
    sh:message "quieterRoutesNoiseCategory: The value must be an IRI."@en .

era-sh:VehicleTypeAuthorisationRestrictionShape sh:sparql era-sh:QuieterRoutesNoiseCategorySKOS .
era-sh:QuieterRoutesNoiseCategorySKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:quieterRoutesNoiseCategory ;
    era:affectedClass era:VehicleTypeAuthorisationRestriction ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of quieterRoutesNoiseCategory is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "quieterRoutesNoiseCategory: The VehicleTypeAuthorisationRestriction {$this} with label {?label} has a value {?value} that is not one of the predefined values."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this (era:quieterRoutesNoiseCategory AS ?path) (?concept AS ?value) ?label
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:quieterRoutesNoiseCategory ?concept .
            era:quieterRoutesNoiseCategory era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .



era-sh:VehicleTypeAuthorisationShape 
    a sh:NodeShape ;
    sh:nodeKind sh:IRI ;
    sh:targetClass  era:VehicleTypeAuthorisation .

era-sh:VehicleTypeAuthorisationShape sh:property era-sh:VehicleTypeAuthorisationHolder .
era-sh:VehicleTypeAuthorisationHolder
    a sh:PropertyShape ;
    era:affectedProperty era:vehicleTypeAuthorisationHolder ;
    era:affectedClass era:VehicleTypeAuthorisation ;
    era:scope "local" ;
    rdfs:comment "Validation for vehicleTypeAuthorisationHolder property. Indicates the vehicle type authorisation holder." ;
    sh:path era:vehicleTypeAuthorisationHolder ;
    sh:nodeKind sh:IRI ;
    sh:class era:OrganisationRole ;
    sh:severity sh:Violation ;
    sh:message "vehicleTypeAuthorisationHolder: The value must be an IRI pointing to an OrganisationRole."@en ;
    era:eratvIndex "3.1.3.1.2" ,
                   "3.1.3.2.3" ,
                   "3.1.3.3.3" ,
                   "3.1.3.4.3" ,
                   "3.1.3.5.3" ,
                   "3.1.3.6.3" ,
                   "3.1.3.7.3" ,
                   "3.1.3.8.3" .

era-sh:VehicleTypeConfigParameterSetShape 
    a sh:NodeShape ;
    sh:nodeKind sh:IRI ;
    sh:targetClass era:VehicleTypeConfigParameterSet .

era-sh:VehicleTypeShape sh:property era-sh:AxleSpacingDistance .
era-sh:VehicleTypeConfigParameterSetShape sh:property era-sh:AxleSpacingDistance .
era-sh:AxleSpacingDistance a sh:PropertyShape ;
    era:affectedClass era:VehicleTypeConfigParameterSet ;
    era:affectedProperty era:axleSpacingDistance ;
    rdfs:comment "Validation for axleSpacingDistance property."@en ;
    sh:nodeKind sh:IRI ;
    era:eratvIndex "4.5.3.4" ;
    sh:path era:axleSpacingDistance ;
    sh:message "era:axleSpacingDistance: its value must be an IRI."@en ;
    sh:class era:AxleSpacing ;
    sh:severity sh:Violation .

era-sh:VehicleTypeConfigParameterSetShape sh:property era-sh:CatenaryMaxRatedCurrent .
era-sh:CatenaryMaxRatedCurrent a sh:PropertyShape ;
    era:affectedClass era:VehicleTypeConfigParameterSet ;
    era:affectedProperty era:catenaryMaxRatedCurrent ;
    rdfs:comment "Validation for catenaryMaxRatedCurrent property."@en  ;
    sh:datatype xsd:integer ; 
    era:eratvIndex "4.10.3" ;
    sh:path era:catenaryMaxRatedCurrent ;
    sh:message "The catenaryMaxRatedCurrent must be an integer value."@en  ;
    sh:severity sh:Violation .

era-sh:VehicleTypeConfigParameterSetShape sh:property era-sh-eratv:ContactStripMaterial .
era-sh-eratv:ContactStripMaterial a sh:PropertyShape ;
    era:affectedClass era:VehicleTypeConfigParameterSet ;
    era:affectedProperty era:contactStripMaterial ;
    rdfs:comment "Validation for contactStripMaterial property."@en  ;
    sh:nodeKind sh:IRI ;
    sh:maxCount 1 ;
    era:eratvIndex "4.10.10" ;
    sh:path era:contactStripMaterial ;
    sh:message "era:contactStripMaterial: its value must be an IRI."@en ;
    sh:severity sh:Violation .

era-sh:VehicleTypeConfigParameterSetShape sh:property era-sh:HasOnboardEnergyMeasurement .
era-sh:HasOnboardEnergyMeasurement a sh:PropertyShape ;
    era:affectedClass era:VehicleTypeConfigParameterSet ;
    era:affectedProperty era:hasOnboardEnergyMeasurement ;
    rdfs:comment "Validation for hasOnboardEnergyMeasurement property."@en  ;
    sh:datatype xsd:boolean ;
    era:eratvIndex "4.10.12" ;
    sh:path era:hasOnboardEnergyMeasurement ;
    sh:message "The hasOnboardEnergyMeasurement must be a boolean value."@en  ;
    sh:severity sh:Violation .

era-sh:VehicleTypeConfigParameterSetShape sh:property era-sh:EnergySupplyMaxPower .
era-sh:EnergySupplyMaxPower a sh:PropertyShape ;
    era:affectedClass era:VehicleTypeConfigParameterSet ;
    era:affectedProperty era:energySupplyMaxPower ;
    rdfs:comment "Validation for energySupplyMaxPower property."@en ;
    sh:datatype xsd:decimal ;
    sh:path era:energySupplyMaxPower ;
    sh:message "The energySupplyMaxPower must be a decimal value."@en ;
    era:eratvIndex "4.10.2" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeConfigParameterSetShape sh:property era-sh:ForConfiguration .
era-sh:RestrictionShape sh:property era-sh:ForConfiguration .
era-sh:ForConfiguration a sh:PropertyShape ;
    era:affectedClass era:VehicleTypeConfigParameterSet ,
                      era:Restriction ;
    era:affectedProperty era:forConfiguration ;
    rdfs:comment "Validation for forConfiguration property."@en ;
    sh:nodeKind sh:IRI ;
    sh:path era:forConfiguration ;
    sh:message "era:forConfiguration: its value must be an IRI pointing to a VehicleTypeConfiguration."@en ;
    sh:class era:VehicleTypeConfiguration ;
    sh:severity sh:Violation .

era-sh:VehicleTypeConfigParameterSetShape sh:property era-sh:HasAutomaticDroppingDevice .
era-sh:HasAutomaticDroppingDevice a sh:PropertyShape ;
    era:affectedClass era:VehicleTypeConfigParameterSet ;
    era:affectedProperty era:hasAutomaticDroppingDevice ;
    rdfs:comment "Validation for hasAutomaticDroppingDevice property."@en ;
    sh:datatype xsd:boolean ;
    sh:path era:hasAutomaticDroppingDevice ;
    sh:message "The hasAutomaticDroppingDevice must be a boolean value."@en ;
    era:eratvIndex "4.10.11" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:HasBrakingPerformance .
era-sh:VehicleTypeConfigParameterSetShape sh:property era-sh:HasBrakingPerformance .
era-sh:HasBrakingPerformance a sh:PropertyShape ;
    era:affectedClass era:VehicleTypeConfigParameterSet ;
    era:affectedProperty era:hasBrakingPerformance ;
    rdfs:comment "Validation for hasBrakingPerformance property."@en ;
    sh:nodeKind sh:IRI ;
    sh:path era:hasBrakingPerformance ;
    sh:message "era:hasBrakingPerformance: its value must be an IRI pointing to a BrakingPerformance."@en ;
    sh:class era:BrakingPerformance ;
    era:eratvIndex "4.7" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:HasCurrentLimitation .
era-sh:VehicleTypeConfigParameterSetShape sh:property era-sh:HasCurrentLimitation .
era-sh:HasCurrentLimitation a sh:PropertyShape ;
    era:affectedClass era:VehicleTypeConfigParameterSet ;
    era:affectedProperty era:hasCurrentLimitation ;
    rdfs:comment "Validation for hasCurrentLimitation property."@en ;
    sh:datatype xsd:boolean ;
    sh:path era:hasCurrentLimitation ;
    sh:message "The hasCurrentLimitation must be a boolean value."@en ;
    era:eratvIndex "4.10.14" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeConfigParameterSetShape sh:property era-sh:HasOCLChargeableTractionStorage .
era-sh:HasOCLChargeableTractionStorage a sh:PropertyShape ;
    era:affectedClass era:VehicleTypeConfigParameterSet ;
    era:affectedProperty era:hasOCLChargeableTractionStorage ;
    rdfs:comment "Validation for hasOCLChargeableTractionStorage property."@en ;
    sh:datatype xsd:boolean ;
    sh:path era:hasOCLChargeableTractionStorage ;
    sh:message "The hasOCLChargeableTractionStorage must be a boolean value."@en ;
    era:eratvIndex "4.10.16" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:HasParkingBrake .
era-sh:VehicleTypeConfigParameterSetShape sh:property era-sh:HasParkingBrake .
era-sh:HasParkingBrake a sh:PropertyShape ;
    era:affectedClass era:VehicleTypeConfigParameterSet ;
    era:affectedProperty era:hasParkingBrake ;
    rdfs:comment "Validation for hasParkingBrake property."@en ;
    sh:datatype xsd:boolean ;
    sh:path era:hasParkingBrake ;
    sh:message "The hasParkingBrake must be a boolean value."@en ;
    era:eratvIndex "4.7.3.4" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeConfigParameterSetShape sh:property era-sh:HasVehicleTypeConfiguration .
era-sh:HasVehicleTypeConfiguration a sh:PropertyShape ;
    era:affectedClass era:VehicleTypeConfigParameterSet ;
    era:affectedProperty era:hasVehicleTypeConfiguration ;
    rdfs:comment "Validation for hasVehicleTypeConfiguration property."@en ;
    sh:nodeKind sh:IRI ;
    sh:path era:hasVehicleTypeConfiguration ;
    sh:message "era:hasVehicleTypeConfiguration: its value must be an IRI pointing to a VehicleTypeConfiguration."@en ;
    sh:class era:VehicleTypeConfiguration ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:HasWheelSlideProtectionSystem .
era-sh:VehicleTypeConfigParameterSetShape sh:property era-sh:HasWheelSlideProtectionSystem .
era-sh:HasWheelSlideProtectionSystem a sh:PropertyShape ;
    era:affectedClass era:VehicleTypeConfigParameterSet ;
    era:affectedProperty era:hasWheelSlideProtectionSystem ;
    rdfs:comment "Validation for hasWheelSlideProtectionSystem property."@en ;
    sh:datatype xsd:boolean ;
    sh:path era:hasWheelSlideProtectionSystem ;
    sh:message "The hasWheelSlideProtectionSystem must be a boolean value."@en ;
    era:eratvIndex "4.7.8" ;
    sh:severity sh:Violation .


# TODO homogenise with ERA-RINF-shapes.ttl
era-sh:VehicleTypeConfigParameterSetShape sh:property era-sh-eratv:MaxCurrentStandstillPantograph .
era-sh-eratv:MaxCurrentStandstillPantograph a sh:PropertyShape ;
    era:affectedClass era:VehicleTypeConfigParameterSet ;
    era:affectedProperty era:maxCurrentStandstillPantograph ;
    rdfs:comment "Validation for maxCurrentStandstillPantograph property."@en ;
    sh:datatype xsd:decimal ;
    sh:maxCount 1 ;
    sh:path era:maxCurrentStandstillPantograph ;
    sh:message "The maxCurrentStandstillPantograph must be a decimal value."@en ;
    era:eratvIndex "4.10.4" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:MaximumLocomotivesCoupled .
era-sh:VehicleTypeConfigParameterSetShape sh:property era-sh:MaximumLocomotivesCoupled .
era-sh:VehicleTypeAuthorisationRestrictionShape sh:property era-sh:MaximumLocomotivesCoupled .
era-sh:MaximumLocomotivesCoupled a sh:PropertyShape ;
    era:affectedClass era:VehicleTypeConfigParameterSet ;
    era:affectedProperty era:maximumLocomotivesCoupled ;
    rdfs:comment "Validation for maximumLocomotivesCoupled property."@en ;
    sh:datatype xsd:integer ;
    sh:path era:maximumLocomotivesCoupled ;
    sh:message "The maximumLocomotivesCoupled must be an integer value."@en ;
    era:eratvIndex "4.1.5" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeConfigParameterSetShape sh:property era-sh-eratv:MinimumContactWireHeight .
era-sh-eratv:MinimumContactWireHeight
	a sh:PropertyShape ;
    era:affectedProperty era:minimumContactWireHeight ;
    era:affectedClass era:VehicleTypeConfigParameterSet ;
	rdfs:comment "Indication of the minimum contact wire height expressed in metres."@en ;
	era:eratvIndex "4.10.5" ;
	sh:path era:minimumContactWireHeight ;
	sh:datatype xsd:double ;
	sh:maxCount 1 ;
	sh:severity sh:Violation ;
	sh:message "minimumContactWireHeight (4.10.5): The value must be a double (real) number."@en .

era-sh:VehicleTypeConfigParameterSetShape sh:property era-sh:NumberOfPantographsInContactWithOCL .
era-sh:NumberOfPantographsInContactWithOCL a sh:PropertyShape ;
    era:affectedClass era:VehicleTypeConfigParameterSet ;
    era:affectedProperty era:numberOfPantographsInContactWithOCL ;
    rdfs:comment "Validation for numberOfPantographsInContactWithOCL property."@en ;
    sh:datatype xsd:integer ;
    sh:path era:numberOfPantographsInContactWithOCL ;
    sh:message "The numberOfPantographsInContactWithOCL must be an integer value."@en ;
    era:eratvIndex "4.10.7" ;
    sh:severity sh:Violation .

# SPARQL constraint to check applicability based on numberOfPantographsInContactWithOCL
era-sh:VehicleTypeConfigParameterSetShape sh:sparql era-sh:OclTypeApplicabilitySPARQL .
era-sh:OclTypeApplicabilitySPARQL a sh:SPARQLConstraint ;
    sh:prefixes era: ;
    sh:severity sh:Warning ;
    era:eratvIndex "4.10.9" ;
    sh:message "OCL type ({?oclType}) is not applicable when numberOfPantographsInContactWithOCL (value: {?numPanto}) is less than 2."@en ;
    sh:select """
        
        SELECT $this ?oclType ?numPanto (era:oclType AS ?path) WHERE {
            $this era:oclType ?oclType .
            $this era:numberOfPantographsInContactWithOCL ?numPanto .
            FILTER(?numPanto < 2)
        }
    """ .

era-sh:VehicleTypeConfigParameterSetShape sh:property era-sh:QuasiStaticGuidingForce .
era-sh:QuasiStaticGuidingForce a sh:PropertyShape ;
    era:affectedClass era:VehicleTypeConfigParameterSet ;
    era:affectedProperty era:quasiStaticGuidingForce ;
    rdfs:comment "Validation for quasiStaticGuidingForce property."@en ;
    sh:datatype xsd:decimal ;
    sh:path era:quasiStaticGuidingForce ;
    sh:message "The quasiStaticGuidingForce must be a decimal value."@en ;
    era:eratvIndex "4.5.4" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeConfigParameterSetShape sh:property era-sh:ShortestDistanceBetweenPantographsInContactWithOCL .
era-sh:ShortestDistanceBetweenPantographsInContactWithOCL a sh:PropertyShape ;
    era:affectedClass era:VehicleTypeConfigParameterSet ;
    era:affectedProperty era:shortestDistanceBetweenPantographsInContactWithOCL ;
    rdfs:comment "Validation for shortestDistanceBetweenPantographsInContactWithOCL property."@en ;
    sh:datatype xsd:string ;
    sh:pattern "^Single:" ;
    sh:path era:shortestDistanceBetweenPantographsInContactWithOCL ;
    sh:message "The shortestDistanceBetweenPantographsInContactWithOCL must be a string with the following format: 'Single: ___(; Multiple: ___)'."@en ;
    era:eratvIndex "4.10.8" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:TotalVehicleMass .
era-sh:VehicleTypeConfigParameterSetShape sh:property era-sh:TotalVehicleMass .
era-sh:TotalVehicleMass a sh:PropertyShape ;
    era:affectedClass era:VehicleTypeConfigParameterSet ;
    era:affectedProperty era:totalVehicleMass ;
    rdfs:comment "Validation for totalVehicleMass property."@en ;
    sh:datatype xsd:integer ;
    sh:path era:totalVehicleMass ;
    sh:message "The totalVehicleMass must be an integer value."@en ;
    era:eratvIndex "4.5.5" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeConfigParameterSetShape sh:property era-sh:VehiclePantographHead .
era-sh:VehiclePantographHead a sh:PropertyShape ;
    era:affectedClass era:VehicleTypeConfigParameterSet ;
    era:affectedProperty era:vehiclePantographHead ;
    rdfs:comment "Validation for vehiclePantographHead property."@en ;
    sh:nodeKind sh:IRI ;
    sh:path era:vehiclePantographHead ;
    sh:message "era:vehiclePantographHead: its value must be an IRI."@en ;
    era:eratvIndex "4.10.6" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeConfigParameterSetShape sh:property era-sh:VehicleTypeMaximumSpeedAndCantDeficiency .
era-sh:VehicleTypeMaximumSpeedAndCantDeficiency a sh:PropertyShape ;
    era:affectedClass era:VehicleTypeConfigParameterSet ;
    era:affectedProperty era:vehicleTypeMaximumSpeedAndCantDeficiency ;
    rdfs:comment "Validation for vehicleTypeMaximumSpeedAndCantDeficiency property."@en ;
    sh:nodeKind sh:IRI ;
    sh:path era:vehicleTypeMaximumSpeedAndCantDeficiency ;
    sh:message "era:vehicleTypeMaximumSpeedAndCantDeficiency: its value must be an IRI pointing to a MaximumSpeedAndCantDeficiency."@en ;
    sh:class era:MaximumSpeedAndCantDeficiency ;
    era:eratvIndex "4.6.4" ;
    sh:severity sh:Violation .

    
era-sh:VehicleTypeConfigParameterSetShape sh:property era-sh:MinVehicleImpedance .

era-sh:MinVehicleImpedanceShape sh:property era-sh:MinImpedanceFrequency .
era-sh:MinImpedanceFrequency a sh:PropertyShape ;
    era:affectedClass era:MinVehicleImpedance ;
    era:affectedProperty era:minImpedanceFrequency ;
    era:scope "local" ;
    rdfs:comment "Validation for minImpedanceFrequency property."@en ;
    sh:path era:minImpedanceFrequency ;
    sh:datatype xsd:double ;
    sh:maxCount 1 ;
    sh:severity sh:Violation ;
    sh:message "minImpedanceFrequency: The value must be a double."@en .

era-sh:MinVehicleImpedanceShape sh:property era-sh:MinImpedanceResistance .
era-sh:MinImpedanceResistance a sh:PropertyShape ;
    era:affectedClass era:MinVehicleImpedance ;
    era:affectedProperty era:minImpedanceResistance ;
    era:scope "local" ;
    rdfs:comment "Validation for minImpedanceResistance property."@en ;
    sh:path era:minImpedanceResistance ;
    sh:datatype xsd:double ;
    sh:maxCount 1 ;
    sh:severity sh:Violation ;
    sh:message "minImpedanceResistance: The value must be a double."@en .

era-sh:VehicleTypeConfigParameterSetShape sh:property era-sh:EmergencyBrakeProfile  .
era-sh:EmergencyBrakeProfile a sh:PropertyShape ;
    era:affectedProperty era:emergencyBrakeProfile ;
    era:affectedClass era:VehicleTypeConfigParameterSet ;
    era:scope "local" ;
    rdfs:comment "Validation that the value of emergencyBrakeProfile points to an instance of BrakingProfile."@en ;
    sh:path era:emergencyBrakeProfile ;
    sh:nodeKind sh:IRI ;
    sh:class era:BrakingProfile ;
    sh:severity sh:Violation ;
    sh:message "emergencyBrakeProfile: its value must be an IRI of type BrakingProfile."@en .

era-sh:VehicleTypeConfigParameterSetShape sh:property era-sh:EtcsBaselineIncompleteCompatibility .
era-sh:VehicleTypeShape sh:property era-sh:EtcsBaselineIncompleteCompatibility .
era-sh:EtcsBaselineIncompleteCompatibility
    a sh:PropertyShape ;
    era:affectedProperty era:etcsBaselineIncompleteCompatibility ;
    era:affectedClass era:VehicleType, era:VehicleTypeConfigParameterSet ;
    era:scope "local" ;
    rdfs:comment "Validation for etcsBaselineIncompleteCompatibility property." ;
    sh:path era:etcsBaselineIncompleteCompatibility ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
    sh:severity sh:Violation ;
    sh:message "etcsBaselineIncompleteCompatibility (4.13.1.2): The value must be a string."@en ;
    era:eratvIndex "4.13.1.2" .


era-sh:VehicleTypeConfigurationShape 
    a sh:NodeShape ;
    sh:nodeKind sh:IRI ;
    sh:targetClass era:VehicleTypeConfiguration .

era-sh:VehicleTypeConfigurationShape sh:property era-sh:ForOnBoardClassA .
era-sh:ForOnBoardClassA a sh:PropertyShape ;
    era:affectedProperty era:forOnBoardClassA ;
    era:affectedClass era:VehicleTypeConfiguration ;
    era:scope "local" ;
    rdfs:comment "Validation of the forOnBoardClassA property for VehicleTypeConfiguration."@en ;
    sh:path era:forOnBoardClassA ;
    sh:nodeKind sh:IRI ;
    sh:severity sh:Violation ;
    sh:message "forOnBoardClassA: The value must be an IRI."@en .

### SKOS validation for era:forOnBoardClassA
era-sh:VehicleTypeConfigurationShape sh:sparql era-sh:ForOnBoardClassASKOS .
era-sh:ForOnBoardClassASKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:forOnBoardClassA ;
    era:affectedClass era:VehicleTypeConfiguration ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of forOnBoardClassA is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "forOnBoardClassA: The VehicleTypeConfiguration {$this} with label {?label} has a value {?value} 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/etcs-equipment-on-board-level/ETCSEquipmentLevels>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this (era:forOnBoardClassA AS ?path) (?concept AS ?value) ?label
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:forOnBoardClassA ?concept .
            era:forOnBoardClassA era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:VehicleTypeConfigurationShape sh:property era-sh:ForOnBoardClassB .
era-sh:ForOnBoardClassB a sh:PropertyShape ;
    era:affectedProperty era:forOnBoardClassB ;
    era:affectedClass era:VehicleTypeConfiguration ;
    era:scope "local" ;
    rdfs:comment "Validation of the forOnBoardClassB property for VehicleTypeConfiguration."@en ;
    sh:path era:forOnBoardClassB ;
    sh:nodeKind sh:IRI ;
    sh:severity sh:Violation ;
    sh:message "forOnBoardClassB: The value must be an IRI."@en .

### SKOS validation for era:forOnBoardClassB
era-sh:VehicleTypeConfigurationShape sh:sparql era-sh:ForOnBoardClassBSKOS .
era-sh:ForOnBoardClassBSKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:forOnBoardClassB ;
    era:affectedClass era:VehicleTypeConfiguration ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of forOnBoardClassB is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "forOnBoardClassB: The VehicleTypeConfiguration {$this} with label {?label} has a value {?value} 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/etcs-equipment-on-board-level/ETCSEquipmentLevels>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this (era:forOnBoardClassB AS ?path) (?concept AS ?value) ?label
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:forOnBoardClassB ?concept .
            era:forOnBoardClassB era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:VehicleTypeConfigurationShape sh:property era-sh:ForWheelSetGauge  .
era-sh:ForWheelSetGauge
    a sh:PropertyShape ;
    era:affectedClass era:VehicleTypeConfiguration ;
    era:affectedProperty era:forWheelSetGauge ;
    rdfs:comment "Validation for forWheelSetGauge property."@en ;
    sh:nodeKind sh:IRI ;
    sh:path era:forWheelSetGauge ;
    sh:message "forWheelSetGauge: The value must be an IRI."@en ;
    sh:severity sh:Violation .

era-sh:VehicleTypeConfigurationShape sh:sparql era-sh:ForWheelSetGaugeSKOS  .
era-sh:ForWheelSetGaugeSKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:forWheelSetGauge ;
    era:affectedClass era:VehicleTypeConfiguration ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of forWheelSetGauge is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "forWheelSetGauge: The VehicleTypeConfiguration {$this} with label {?label} has a value {?value} 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/nominal-track-gauges/NominalTrackGauges>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this (era:forWheelSetGauge AS ?path) (?concept AS ?value) ?label
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:forWheelSetGauge ?concept .
            era:forWheelSetGauge era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .


era-sh:VehicleTypeConfigurationShape sh:property era-sh:ForEnergySupplySystem  .
era-sh:ForEnergySupplySystem
    a sh:PropertyShape ;
    era:affectedClass era:VehicleTypeConfiguration ;
    era:affectedProperty era:forEnergySupplySystem ;
    rdfs:comment "Validation for forEnergySupplySystem property."@en ;
    sh:nodeKind sh:IRI ;
    sh:path era:forEnergySupplySystem ;
    sh:message "forEnergySupplySystem: The value must be an IRI."@en ;
    sh:severity sh:Violation .


era-sh:VehicleTypeConfigurationShape sh:sparql era-sh:ForEnergySupplySystemSKOS  .
era-sh:ForEnergySupplySystemSKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:forEnergySupplySystem ;
    era:affectedClass era:VehicleTypeConfiguration ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of forEnergySupplySystem is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "forEnergySupplySystem: The VehicleTypeConfiguration {$this} with label {?label} has a value {?value} 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/energy-supply-systems/EnergySupplySystems>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this (era:forEnergySupplySystem AS ?path) (?concept AS ?value) ?label
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:forEnergySupplySystem ?concept .
            era:forEnergySupplySystem era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:VehicleTypeShape 
    a sh:NodeShape ;
    sh:nodeKind sh:IRI ;
    sh:targetClass era:VehicleType .

era-sh:PermissiblePayloadShape 
    a sh:NodeShape ;
    sh:nodeKind sh:IRI ;
#    sh:sparql era-sh:InSkosConceptScheme ; #using the improvement by Graphwise
    sh:targetClass era:PermissiblePayload .

# validate once with era-sh:InSkosConceptScheme SPARQL constraint
era-sh:InSkosConceptScheme 
  a sh:SPARQLConstraint ;
  sh:severity sh:Violation ;
  era:affectedClass era:PermissiblePayload ;
  era:affectedProperty era:forLineCategory ;
  era:eratvIndex "4.5.1.1", "4.9.2" ; 
  sh:message "Instance {$this} of class {?class} has enumerated property {?property} with value {?value} that is not in the list {?scheme}."@en ;
  sh:target era-sh:InSkosConceptSchemeSPARQL ;
  sh:deactivated true;
  sh:prefixes era:;
  sh:select """
    SELECT $this ?class ?property ?value ?scheme (?property AS ?path) {
    $this a ?class; ?property ?value .
    ?property era:inSkosConceptScheme ?scheme .
    FILTER NOT EXISTS {?value skos:inScheme ?scheme}}""".

era-sh:InSkosConceptSchemeSPARQL a sh:SPARQLTarget;
    sh:prefixes era:;
    sh:select """
      SELECT distinct $this (?property AS ?path) {
        $this ?property ?value .
        ?property era:inSkosConceptScheme ?scheme .
        FILTER NOT EXISTS {?value skos:inScheme ?scheme}}""".

era-sh:PermissiblePayloadShape sh:property era-sh:ForLineCategory  .
era-sh:ForLineCategory a sh:PropertyShape ;
    era:affectedClass era:PermissiblePayload ;
    era:affectedProperty era:forLineCategory ;
    rdfs:comment "Validation for forLineCategory property."@en ;
    sh:nodeKind sh:IRI  ;
    sh:message "The forLineCategory value must be an IRI"@en ;
    sh:path era:forLineCategory ;
    era:eratvIndex "4.5.1.1" ; 
    sh:severity sh:Violation .

era-sh:PermissiblePayloadShape sh:property era-sh:PermissiblePayloadMass  .
era-sh:PermissiblePayloadMass a sh:PropertyShape ;
    era:affectedClass era:PermissiblePayload ;
    era:affectedProperty era:permissiblePayloadMass ;
    rdfs:comment "Validation for permissiblePayloadMass property."@en ;
    sh:datatype xsd:decimal ;
    sh:message "The permissiblePayloadMass value must be a decimal"@en ;
    sh:path era:permissiblePayloadMass ;
    era:eratvIndex "4.5.1.1" ;
    sh:severity sh:Violation .


era-sh:VehicleTypeShape sh:property era-sh:TypeName .
era-sh:TypeName a sh:PropertyShape ;
                era:affectedClass era:VehicleType ;
                era:affectedProperty rdfs:label ;
                rdfs:comment "Validation for Type Name property."@en ;
                sh:datatype rdf:langString ;
                sh:uniqueLang true ;
                sh:maxLength 256 ;
                sh:message "The Type Name value must be a character string with a maximum length of 256 characters."@en ;
                sh:path rdfs:label ;
                era:eratvIndex "1.1" ;
                sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:AlternativeTypeName .
era-sh:AlternativeTypeName a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:alternativeTypeName ;
    rdfs:comment "Validation for alternativeTypeName property."@en ;
    sh:datatype rdf:langString ;
    sh:uniqueLang true ;
    sh:maxLength 256 ;
    sh:message "The alternativeTypeName value must be a character string with a maximum length of 256 characters."@en ;
    sh:path era:alternativeTypeName ;
    era:eratvIndex "1.2" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:AltitudeRange .
era-sh:AltitudeRange a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:altitudeRange ;
    rdfs:comment "Validation for altitudeRange property."@en ;
    sh:datatype xsd:string ;
    sh:message "The altitudeRange value must be a character string."@en ;
    sh:path era:altitudeRange ;
    era:eratvIndex "4.3.2" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:AltitudeRangeDetail .
era-sh:AltitudeRangeDetail a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:altitudeRangeDetail ;
    rdfs:comment "Validation for altitudeRangeDetail property."@en ;
    sh:datatype xsd:integer ;
    sh:message "The altitudeRangeDetail value must be an integer."@en ;
    sh:path era:altitudeRangeDetail ;
    era:eratvIndex "4.3.2" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:AtoOnBoardImplementation .
era-sh:AtoOnBoardImplementation a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:atoOnBoardImplementation ;
    rdfs:comment "Validation for atoOnBoardImplementation property."@en ;
    sh:datatype xsd:string ;
    sh:message "The atoOnBoardImplementation value must be a character string."@en ;
    sh:path era:atoOnBoardImplementation ;
    era:eratvIndex "4.13.3.2" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:AxleBearingConditionMonitoring .
era-sh:AxleBearingConditionMonitoring a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:axleBearingConditionMonitoring ;
    rdfs:comment "Validation for axleBearingConditionMonitoring property."@en ;
    sh:nodeKind sh:IRI ;
    sh:path era:axleBearingConditionMonitoring ;
    sh:message "era:axleBearingConditionMonitoring: its value must be an IRI."@en ;
    era:eratvIndex "4.9.2" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:sparql era-sh:AxleBearingConditionMonitoringSKOS .
era-sh:AxleBearingConditionMonitoringSKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:axleBearingConditionMonitoring ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of axleBearingConditionMonitoring is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "axleBearingConditionMonitoring: The VehicleType {$this} with label {?label} has a value {?value} 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/axle-monitoring/AxleBearingMonitoring>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this (era:axleBearingConditionMonitoring AS ?path) (?concept AS ?value) ?label
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:axleBearingConditionMonitoring ?concept .
            era:axleBearingConditionMonitoring era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:VehicleTypeShape sh:property era-sh:BoardingAids .
era-sh:BoardingAids a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:boardingAids ;
    rdfs:comment "Validation for boardingAids property."@en ;
    sh:datatype xsd:string ;
    sh:message "The boardingAids value must be a character string."@en ;
    sh:path era:boardingAids ;
    era:eratvIndex "4.12.3.2" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:ConfigDependentParameter .
era-sh:ConfigDependentParameter a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:configDependentParameter ;
    rdfs:comment "Validation for configDependentParameter property."@en ;
    sh:nodeKind sh:IRI ;
    sh:path era:configDependentParameter ;
    sh:message "era:configDependentParameter: its value must be an IRI pointing to a VehicleTypeConfigParameterSet."@en ;
    sh:class era:VehicleTypeConfigParameterSet ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:DataGSMRNetwork .
era-sh:DataGSMRNetwork a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:dataGSMRNetwork ;
    rdfs:comment "Validation for dataGSMRNetwork property."@en ;
    sh:nodeKind sh:IRI ;
    sh:path era:dataGSMRNetwork ;
    sh:message "era:dataGSMRNetwork: its value must be an IRI."@en ;
    era:eratvIndex "4.13.2.11" ;
    sh:severity sh:Violation .

### SPARQLConstraint for dataGSMRNetwork SKOS validation
era-sh:VehicleTypeShape sh:sparql era-sh:DataGSMRNetworkSKOS .
era-sh:DataGSMRNetworkSKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:dataGSMRNetwork ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of dataGSMRNetwork is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "dataGSMRNetwork: The VehicleType {$this} with label {?label} has a value {?value} 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/gsmr-networks/GSMRNetworks>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this (era:dataGSMRNetwork AS ?path) (?concept AS ?value) ?label
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:dataGSMRNetwork ?concept .
            era:dataGSMRNetwork era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:VehicleTypeShape sh:property era-sh:DesignMassExceptionalPayload .
era-sh:DesignMassExceptionalPayload a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:designMassExceptionalPayload ;
    rdfs:comment "Validation for designMassExceptionalPayload property."@en ;
    sh:datatype xsd:integer ;
    sh:message "The designMassExceptionalPayload value must be an integer."@en ;
    sh:path era:designMassExceptionalPayload ;
    era:eratvIndex "4.5.2.3" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:DesignMassNormalPayload .
era-sh:DesignMassNormalPayload a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:designMassNormalPayload ;
    rdfs:comment "Validation for designMassNormalPayload property."@en ;
    sh:datatype xsd:integer ;
    sh:message "The designMassNormalPayload value must be an integer."@en ;
    sh:path era:designMassNormalPayload ;
    era:eratvIndex "4.5.2.2" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:DesignMassWorkingOrder .
era-sh:DesignMassWorkingOrder a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:designMassWorkingOrder ;
    rdfs:comment "Validation for designMassWorkingOrder property."@en ;
    sh:datatype xsd:integer ;
    sh:message "The designMassWorkingOrder value must be an integer."@en ;
    sh:path era:designMassWorkingOrder ;
    era:eratvIndex "4.5.2.1" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:DrivingCabs .
era-sh:DrivingCabs a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:drivingCabs ;
    rdfs:comment "Validation for drivingCabs property."@en ;
    sh:datatype xsd:integer ;
    sh:in ( 0 1 2 ) ;
    sh:message "The drivingCabs value must be 0, 1, or 2."@en ;
    sh:path era:drivingCabs ;
    era:eratvIndex "4.1.1" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:HasEddyCurrentBrakePrevention .
era-sh:HasEddyCurrentBrakePrevention a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:hasEddyCurrentBrakePrevention ;
    rdfs:comment "Validation for hasEddyCurrentBrakePrevention property."@en ;
    sh:datatype xsd:boolean ;
    sh:message "The hasEddyCurrentBrakePrevention value must be a boolean (true/false)."@en ;
    sh:path era:hasEddyCurrentBrakePrevention ;
    era:eratvIndex "4.7.4.1.2" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:HasEddyCurrentBrake .
era-sh:HasEddyCurrentBrake a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:hasEddyCurrentBrake ;
    rdfs:comment "Validation for hasEddyCurrentBrake property."@en ;
    sh:datatype xsd:boolean ;
    sh:message "The hasEddyCurrentBrake value must be a boolean (true/false)."@en ;
    sh:path era:hasEddyCurrentBrake ;
    era:eratvIndex "4.7.4.1.1" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:EndCouplingType .
era-sh:EndCouplingType a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:endCouplingType ;
    rdfs:comment "Validation for endCouplingType property."@en ;
    sh:nodeKind sh:IRI ;
    sh:path era:endCouplingType ;
    sh:message "era:endCouplingType: its value must be an IRI."@en ;
    era:eratvIndex "4.9.1" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:sparql era-sh:EndCouplingTypeSKOS .
era-sh:EndCouplingTypeSKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:endCouplingType ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of endCouplingType is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "endCouplingType: The VehicleType {$this} with label {?label} has a value {?value} 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/end-coupling-type/EndCouplingType>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this (era:endCouplingType AS ?path) (?concept AS ?value) ?label
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:endCouplingType ?concept .
            era:endCouplingType era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:VehicleTypeShape sh:property era-sh:EtcsDataCommApp .
era-sh:EtcsDataCommApp a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:etcsDataCommApp ;
    rdfs:comment "Validation for etcsDataCommApp property."@en ;
    sh:datatype xsd:string ;
    sh:message "The etcsDataCommApp value must be a character string."@en ;
    sh:path era:etcsDataCommApp ;
    era:eratvIndex "4.13.2.9" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:EtcsNationalApplications .
era-sh:EtcsNationalApplications a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:etcsNationalApplications ;
    rdfs:comment "Validation for etcsNationalApplications property."@en ;
    sh:datatype xsd:string ;
    sh:message "The etcsNationalApplications value must be a character string."@en ;
    sh:path era:etcsNationalApplications ;
    era:eratvIndex "4.13.1.4" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:EtcsOnBoardImplementation .
era-sh:EtcsOnBoardImplementation a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:etcsOnBoardImplementation ;
    rdfs:comment "Validation for etcsOnBoardImplementation property."@en ;
    sh:datatype xsd:string ;
    sh:message "The etcsOnBoardImplementation value must be a character string."@en ;
    sh:path era:etcsOnBoardImplementation ;
    era:eratvIndex "4.13.1.7" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:EtcsOnboardSystemVersions .
era-sh:EtcsOnboardSystemVersions a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:etcsOnboardSystemVersions ;
    rdfs:comment "Validation for etcsOnboardSystemVersions property."@en ;
    sh:nodeKind sh:IRI ;
    sh:maxCount 1 ;
    sh:path era:etcsOnboardSystemVersions ;
    sh:message "era:etcsOnboardSystemVersions: its value must be an IRI."@en ;
    era:eratvIndex "4.13.1.11" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:sparql era-sh:EtcsOnboardSystemVersionsSKOS .
era-sh:EtcsOnboardSystemVersionsSKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:etcsOnboardSystemVersions ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of etcsOnboardSystemVersions is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "etcsOnboardSystemVersions: The VehicleType {$this} with label {?label} has a value {?value} 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/etcs-m-versions/ETCSMVersions>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this (era:etcsOnboardSystemVersions AS ?path) (?concept AS ?value) ?label
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:etcsOnboardSystemVersions ?concept .
            era:etcsOnboardSystemVersions era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:VehicleTypeShape sh:property era-sh:HasFerromagneticWheelMaterial .
era-sh:HasFerromagneticWheelMaterial a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:hasFerromagneticWheelMaterial ;
    rdfs:comment "Validation for hasFerromagneticWheelMaterial property."@en ;
    sh:datatype xsd:boolean ;
    sh:message "The hasFerromagneticWheelMaterial value must be a boolean (true/false)."@en ;
    sh:path era:hasFerromagneticWheelMaterial ;
    era:eratvIndex "4.14.2.12" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:FireSafetyCategory .
era-sh:FireSafetyCategory a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:fireSafetyCategory ;
    rdfs:comment "Validation for fireSafetyCategory property."@en ;
    sh:nodeKind sh:IRI ;
    sh:path era:fireSafetyCategory ;
    sh:message "era:fireSafetyCategory: its value must be an IRI."@en ;
    era:eratvIndex "4.4.1" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:sparql era-sh:FireSafetyCategorySKOS .
era-sh:FireSafetyCategorySKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:fireSafetyCategory ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of fireSafetyCategory is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "fireSafetyCategory: The VehicleType {$this} with label {?label} has a value {?value} 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/rolling-stock-fire/Categories>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this (era:fireSafetyCategory AS ?path) (?concept AS ?value) ?label
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:fireSafetyCategory ?concept .
            era:fireSafetyCategory era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:VehicleTypeShape sh:property era-sh:FixedSeats .
era-sh:FixedSeats a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:fixedSeats ;
    rdfs:comment "Validation for fixedSeats property."@en ;
    sh:datatype xsd:string ;
    sh:message "The fixedSeats value must be a character string."@en ;
    sh:path era:fixedSeats ;
    era:eratvIndex "4.12.1.1" ;
    sh:severity sh:Violation .


era-sh:VehicleTypeShape sh:property era-sh:GsmRRadioDataCommunication .
era-sh:GsmRRadioDataCommunication a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:gsmRRadioDataCommunication ;
    rdfs:comment "Validation for gsmRRadioDataCommunication property."@en ;
    sh:nodeKind sh:IRI ;
    sh:path era:gsmRRadioDataCommunication ;
    sh:message "era:gsmRRadioDataCommunication: its value must be an IRI."@en ;
    era:eratvIndex "4.13.2.7" ;
    sh:severity sh:Violation .

### SKOS SPARQLConstraint for gsmRRadioDataCommunication
era-sh:VehicleTypeShape sh:sparql era-sh:GsmRRadioDataCommunicationSKOS .
era-sh:GsmRRadioDataCommunicationSKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:gsmRRadioDataCommunication ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of gsmRRadioDataCommunication is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "gsmRRadioDataCommunication: The VehicleType {$this} with label {?label} has a value {?value} 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/gsm-r-radio-data-communication/GSMRRadioDataCommunications>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this (era:gsmRRadioDataCommunication AS ?path) (?concept AS ?value) ?label
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:gsmRRadioDataCommunication ?concept .
            era:gsmRRadioDataCommunication era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:VehicleTypeShape sh:property era-sh:GsmRSetsInDrivingCab .
era-sh:GsmRSetsInDrivingCab a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:gsmRSetsInDrivingCab ;
    rdfs:comment "Validation for gsmRSetsInDrivingCab property."@en ;
    sh:datatype xsd:integer ;
    sh:in (0 1 2 3) ;
    sh:message "The gsmRSetsInDrivingCab value must be 0, 1, 2 or 3."@en ;
    sh:path era:gsmRSetsInDrivingCab ;
    era:eratvIndex "4.13.2.2" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:HasCantDeficiencyCompensation .
era-sh:HasCantDeficiencyCompensation a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:hasCantDeficiencyCompensation ;
    rdfs:comment "Validation for hasCantDeficiencyCompensation property."@en ;
    sh:datatype xsd:boolean ;
    sh:message "The hasCantDeficiencyCompensation value must be a boolean (true/false)."@en ;
    sh:path era:hasCantDeficiencyCompensation ;
    era:eratvIndex "4.6.2" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:HasLubricationDevicePrevention .
era-sh:HasLubricationDevicePrevention a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:hasLubricationDevicePrevention ;
    rdfs:comment "Validation for hasLubricationDevicePrevention property."@en ;
    sh:datatype xsd:boolean ;
    sh:message "The hasLubricationDevicePrevention value must be a boolean (true/false)."@en ;
    sh:path era:hasLubricationDevicePrevention ;
    era:eratvIndex "4.9.3.2" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:HasOnboardDerailmentFunction .
era-sh:HasOnboardDerailmentFunction a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:hasOnboardDerailmentFunction ;
    rdfs:comment "Validation for hasOnboardDerailmentFunction property."@en ;
    sh:datatype xsd:boolean ;
    sh:message "The hasOnboardDerailmentFunction value must be a boolean (true/false)."@en ;
    sh:path era:hasOnboardDerailmentFunction ;
    era:eratvIndex "4.15.2" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:HasRegenerativeBrake .
era-sh:HasRegenerativeBrake a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:hasRegenerativeBrake ;
    rdfs:comment "Validation for hasRegenerativeBrake property."@en ;
    sh:datatype xsd:boolean ;
    sh:message "The hasRegenerativeBrake value must be a boolean (true/false)."@en ;
    sh:path era:hasRegenerativeBrake ;
    era:eratvIndex "4.7.4.3.1" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:HasSandingPrevention .
era-sh:HasSandingPrevention a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:hasSandingPrevention ;
    rdfs:comment "Validation for hasSandingPrevention property."@en ;
    sh:datatype xsd:boolean ;
    sh:message "The hasSandingPrevention value must be a boolean (true/false)."@en ;
    sh:path era:hasSandingPrevention ;
    era:eratvIndex "4.14.2.14" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:HasShuntingRestrictions .
era-sh:HasShuntingRestrictions a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:hasShuntingRestrictions ;
    rdfs:comment "Validation for hasShuntingRestrictions property."@en ;
    sh:datatype xsd:boolean ;
    sh:message "The hasShuntingRestrictions value must be a boolean (true/false)."@en ;
    sh:path era:hasShuntingRestrictions ;
    era:eratvIndex "4.8.3" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:HasSignalProcessingDerailmentFunction .
era-sh:HasSignalProcessingDerailmentFunction a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:hasSignalProcessingDerailmentFunction ;
    rdfs:comment "Validation for hasSignalProcessingDerailmentFunction property."@en ;
    sh:datatype xsd:boolean ;
    sh:message "The hasSignalProcessingDerailmentFunction value must be a boolean (true/false)."@en ;
    sh:path era:hasSignalProcessingDerailmentFunction ;
    era:eratvIndex "4.15.3" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:HasTrainIntegrityConfirmation .
era-sh:HasTrainIntegrityConfirmation a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:hasTrainIntegrityConfirmation ;
    rdfs:comment "Validation for hasTrainIntegrityConfirmation property."@en ;
    sh:datatype xsd:boolean ;
    sh:message "The hasTrainIntegrityConfirmation value must be a boolean (true/false)."@en ;
    sh:path era:hasTrainIntegrityConfirmation ;
    era:eratvIndex "4.13.1.9" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:IncludedVersionsVariant .
era-sh:IncludedVersionsVariant a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:includedVersionsVariant ;
    rdfs:comment "Validation for includedVersionsVariant property."@en ;
    sh:datatype xsd:string ;
    sh:pattern "^[a-zA-Z0-9]{3}(-[a-zA-Z0-9]{3})?$" ;
    sh:message "The includedVersionsVariant value must be exactly three alphanumeric characters (e.g., 'A1B', 'XYZ', '012')."@en ;
    sh:path era:includedVersionsVariant ;
    era:eratvIndex "0.2" ;
    era:eratvIndex "0.4" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:LengthOfVehicle .
era-sh:LengthOfVehicle a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:lengthOfVehicle ;
    rdfs:comment "Validation for lengthOfVehicle property."@en ;
    sh:datatype xsd:decimal ;
    sh:maxCount 1 ;
    sh:message "The lengthOfVehicle value must be a decimal."@en ;
    sh:path era:lengthOfVehicle ;
    era:eratvIndex "4.8.1" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:LoadingPlatformHeight .
era-sh:LoadingPlatformHeight a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:loadingPlatformHeight ;
    rdfs:comment "Validation for loadingPlatformHeight property."@en ;
    sh:datatype xsd:integer ;
    sh:message "The loadingPlatformHeight value must be an integer."@en ;
    sh:path era:loadingPlatformHeight ;
    era:eratvIndex "4.8.7" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:HasMagneticBrakePrevention .
era-sh:HasMagneticBrakePrevention a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:hasMagneticBrakePrevention ;
    rdfs:comment "Validation for hasMagneticBrakePrevention property."@en ;
    sh:datatype xsd:boolean ;
    sh:message "The hasMagneticBrakePrevention value must be a boolean (true/false)."@en ;
    sh:path era:hasMagneticBrakePrevention ;
    era:eratvIndex "4.7.4.2.2" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:HasMagneticBrake .
era-sh:HasMagneticBrake a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:hasMagneticBrake ;
    rdfs:comment "Validation for hasMagneticBrake property."@en ;
    sh:datatype xsd:boolean ;
    sh:message "The hasMagneticBrake value must be a boolean (true/false)."@en ;
    sh:path era:hasMagneticBrake ;
    era:eratvIndex "4.7.4.2.1" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:MaxDistConsecutiveAxle .
era-sh:MaxDistConsecutiveAxle a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:maxDistConsecutiveAxle ;
    rdfs:comment "Validation for maxDistConsecutiveAxle property."@en ;
    sh:datatype xsd:integer ;
    sh:message "The maxDistConsecutiveAxle value must be an integer."@en ;
    sh:path era:maxDistConsecutiveAxle ;
    era:eratvIndex "4.14.2.1" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:MaxFlangeHeight .
era-sh:MaxFlangeHeight a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:maxFlangeHeight ;
    rdfs:comment "Validation for maxFlangeHeight property."@en ;
    sh:datatype xsd:decimal ;
    sh:message "The maxFlangeHeight value must be a decimal."@en ;
    sh:path era:maxFlangeHeight ;
    era:eratvIndex "4.14.2.9" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:MaxLengthVehicleNose .
era-sh:MaxLengthVehicleNose a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:maxLengthVehicleNose ;
    rdfs:comment "Validation for maxLengthVehicleNose property."@en ;
    sh:datatype xsd:integer ;
    sh:message "The maxLengthVehicleNose value must be an integer."@en ;
    sh:path era:maxLengthVehicleNose ;
    era:eratvIndex "4.14.2.4" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:MaximumAverageDeceleration .
era-sh:MaximumAverageDeceleration a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:maximumAverageDeceleration ;
    rdfs:comment "Validation for maximumAverageDeceleration property."@en ;
    sh:datatype xsd:decimal ;
    sh:message "The maximumAverageDeceleration value must be a decimal."@en ;
    sh:path era:maximumAverageDeceleration ;
    era:eratvIndex "4.7.1" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:MinDistConsecutiveAxle .
era-sh:MinDistConsecutiveAxle a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:minDistConsecutiveAxle ;
    rdfs:comment "Validation for minDistConsecutiveAxle property."@en ;
    sh:datatype xsd:integer ;
    sh:message "The minDistConsecutiveAxle value must be an integer."@en ;
    sh:path era:minDistConsecutiveAxle ;
    era:eratvIndex "4.14.2.2" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:MinDistFirstLastAxle .
era-sh:MinDistFirstLastAxle a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:minDistFirstLastAxle ;
    rdfs:comment "Validation for minDistFirstLastAxle property."@en ;
    sh:datatype xsd:integer ;
    sh:message "The minDistFirstLastAxle value must be an integer."@en ;
    sh:path era:minDistFirstLastAxle ;
    era:eratvIndex "4.14.2.3" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:MinFlangeHeight .
era-sh:MinFlangeHeight a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:minFlangeHeight ;
    rdfs:comment "Validation for minFlangeHeight property."@en ;
    sh:datatype xsd:decimal ;
    sh:message "The minFlangeHeight value must be a decimal."@en ;
    sh:path era:minFlangeHeight ;
    era:eratvIndex "4.14.2.8" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:MinFlangeThickness .
era-sh:MinFlangeThickness a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:minFlangeThickness ;
    rdfs:comment "Validation for minFlangeThickness property."@en ;
    sh:datatype xsd:decimal ;
    sh:message "The minFlangeThickness value must be a decimal."@en ;
    sh:path era:minFlangeThickness ;
    era:eratvIndex "4.14.2.7" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:MinRimWidth .
era-sh:MinRimWidth a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:minRimWidth ;
    rdfs:comment "Validation for minRimWidth property."@en ;
    sh:datatype xsd:decimal ;
    sh:message "The minRimWidth value must be a decimal."@en ;
    sh:path era:minRimWidth ;
    era:eratvIndex "4.14.2.5" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:MinWheelDiameter .
era-sh:MinWheelDiameter a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:minWheelDiameter ;
    rdfs:comment "Validation for minWheelDiameter property."@en ;
    sh:datatype xsd:integer ;
    sh:message "The minWheelDiameter value must be an integer."@en ;
    sh:path era:minWheelDiameter ;
    era:eratvIndex "4.14.2.6" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:MinimumConcaveVerticalRadius .
era-sh:MinimumConcaveVerticalRadius a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:minimumConcaveVerticalRadius ;
    rdfs:comment "Validation for minimumConcaveVerticalRadius property."@en ;
    sh:datatype xsd:decimal ;
    sh:message "The minimumConcaveVerticalRadius value must be a decimal."@en ;
    sh:path era:minimumConcaveVerticalRadius ;
    era:eratvIndex "4.8.6" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:MinimumConvexVerticalRadius .
era-sh:MinimumConvexVerticalRadius a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:minimumConvexVerticalRadius ;
    rdfs:comment "Validation for minimumConvexVerticalRadius property."@en ;
    sh:datatype xsd:decimal ;
    sh:message "The minimumConvexVerticalRadius value must be a decimal."@en ;
    sh:path era:minimumConvexVerticalRadius ;
    era:eratvIndex "4.8.5" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:NumberOfToilet .
era-sh:NumberOfToilet a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:numberOfToilet ;
    rdfs:comment "Validation for numberOfToilet property."@en ;
    sh:datatype xsd:integer ;
    sh:message "The numberOfToilet value must be an integer."@en ;
    sh:path era:numberOfToilet ;
    era:eratvIndex "4.12.1.2" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:OperationalMassNormalPayload .
era-sh:OperationalMassNormalPayload a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:operationalMassNormalPayload ;
    rdfs:comment "Validation for operationalMassNormalPayload property."@en ;
    sh:datatype xsd:integer ;
    sh:message "The operationalMassNormalPayload value must be an integer."@en ;
    sh:path era:operationalMassNormalPayload ;
    era:eratvIndex "4.5.2.5" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:OperationalMassWorkingOrder .
era-sh:OperationalMassWorkingOrder a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:operationalMassWorkingOrder ;
    rdfs:comment "Validation for operationalMassWorkingOrder property."@en ;
    sh:datatype xsd:integer ;
    sh:message "The operationalMassWorkingOrder value must be an integer."@en ;
    sh:path era:operationalMassWorkingOrder ;
    era:eratvIndex "4.5.2.4" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:HasMandatoryParkingBrake .
era-sh:HasMandatoryParkingBrake a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:hasMandatoryParkingBrake ;
    rdfs:comment "Validation for hasMandatoryParkingBrake property."@en ;
    sh:datatype xsd:boolean ;
    sh:message "The hasMandatoryParkingBrake value must be a boolean (true/false)."@en ;
    sh:path era:hasMandatoryParkingBrake ;
    era:eratvIndex "4.7.3" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:ParkingBrakeMaximumGradient .
era-sh:ParkingBrakeMaximumGradient a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:parkingBrakeMaximumGradient ;
    rdfs:comment "Validation for parkingBrakeMaximumGradient property."@en ;
    sh:datatype xsd:decimal ;
    sh:message "The parkingBrakeMaximumGradient value must be a decimal."@en ;
    sh:path era:parkingBrakeMaximumGradient ;
    era:eratvIndex "4.7.3" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:PassByNoiseLevel .
era-sh:PassByNoiseLevel a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:passByNoiseLevel ;
    rdfs:comment "Validation for passByNoiseLevel property."@en ;
    sh:datatype xsd:decimal ;
    sh:message "The passByNoiseLevel value must be a decimal."@en ;
    sh:path era:passByNoiseLevel ;
    era:eratvIndex "4.11.1" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:PermissiblePayloadForLineCategory .
era-sh:PermissiblePayloadForLineCategory a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:permissiblePayloadForLineCategory ;
    rdfs:comment "Validation for permissiblePayloadForLineCategory property."@en ;
    sh:nodeKind sh:IRI ;
    sh:path era:permissiblePayloadForLineCategory ;
    sh:message "era:permissiblePayloadForLineCategory: its value must be an IRI pointing to a PermissiblePayload."@en ;
    sh:class era:PermissiblePayload ;
    era:eratvIndex "4.5.1" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:PortableBoardingAids .
era-sh:PortableBoardingAids a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:portableBoardingAids ;
    rdfs:comment "Validation for portableBoardingAids property."@en ;
    sh:datatype xsd:string ;
    sh:message "The portableBoardingAids value must be a character string."@en ;
    sh:path era:portableBoardingAids ;
    era:eratvIndex "4.12.3.2" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:HasRegenerativeBrakePrevention .
era-sh:HasRegenerativeBrakePrevention a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:hasRegenerativeBrakePrevention ;
    rdfs:comment "Validation for hasRegenerativeBrakePrevention property."@en ;
    sh:datatype xsd:boolean ;
    sh:message "The hasRegenerativeBrakePrevention value must be a boolean (true/false)."@en ;
    sh:path era:hasRegenerativeBrakePrevention ;
    era:eratvIndex "4.7.4.3.2" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:PreviousVehicleType .
era-sh:PreviousVehicleType a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:previousVehicleType ;
    rdfs:comment "Validation for previousVehicleType property."@en ;
    sh:nodeKind sh:IRI ;
    sh:path era:previousVehicleType ;
    sh:message "era:previousVehicleType: its value must be an IRI pointing to a VehicleType."@en ;
    sh:class era:VehicleType ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:PrioritySeat .
era-sh:PrioritySeat a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:prioritySeat ;
    rdfs:comment "Validation for prioritySeat property."@en ;
    sh:datatype xsd:string ;
    sh:message "The prioritySeat value must be a character string."@en ;
    sh:path era:prioritySeat ;
    era:eratvIndex "4.12.2.1" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:PrmAccessibleToilet .
era-sh:PrmAccessibleToilet a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:prmAccessibleToilet ;
    rdfs:comment "Validation for prmAccessibleToilet property."@en ;
    sh:datatype xsd:integer ;
    sh:message "The prmAccessibleToilet value must be an integer."@en ;
    sh:path era:prmAccessibleToilet ;
    era:eratvIndex "4.12.2.3" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:RadioSwitchOverSpecialCondition .
era-sh:RadioSwitchOverSpecialCondition a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:radioSwitchOverSpecialCondition ;
    rdfs:comment "Validation for radioSwitchOverSpecialCondition property."@en ;
    sh:datatype xsd:string ;
    sh:message "The radioSwitchOverSpecialCondition value must be a character string."@en ;
    sh:path era:radioSwitchOverSpecialCondition ;
    era:eratvIndex "4.13.2.4" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:IsPassByNoiseMeasuredUnderReferenceConditions .
era-sh:IsPassByNoiseMeasuredUnderReferenceConditions a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:isPassByNoiseMeasuredUnderReferenceConditions ;
    rdfs:comment "Validation for isPassByNoiseMeasuredUnderReferenceConditions property."@en ;
    sh:datatype xsd:boolean ;
    sh:message "The isPassByNoiseMeasuredUnderReferenceConditions value must be a boolean (true/false)."@en ;
    sh:path era:isPassByNoiseMeasuredUnderReferenceConditions ;
    era:eratvIndex "4.11.1" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:SleepingPlace .
era-sh:SleepingPlace a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:sleepingPlace ;
    rdfs:comment "Validation for sleepingPlace property."@en ;
    sh:datatype xsd:string ;
    sh:message "The sleepingPlace value must be a character string."@en ;
    sh:path era:sleepingPlace ;
    era:eratvIndex "4.12.1.3" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:SnowIceHailConditions .
era-sh:SnowIceHailConditions a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:snowIceHailConditions ;
    rdfs:comment "Validation for snowIceHailConditions property."@en ;
    sh:nodeKind sh:IRI ;
    sh:path era:snowIceHailConditions ;
    sh:message "era:snowIceHailConditions: its value must be an IRI."@en ;
    era:eratvIndex "4.3.3" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:sparql era-sh:SnowIceHailConditionsSKOS .
era-sh:SnowIceHailConditionsSKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:snowIceHailConditions ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of snowIceHailConditions is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "snowIceHailConditions: The VehicleType {$this} with label {?label} has a value {?value} 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/ice-conditions/IceConditions>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this (era:snowIceHailConditions AS ?path) (?concept AS ?value) ?label
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:snowIceHailConditions ?concept .
            era:snowIceHailConditions era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:VehicleTypeShape sh:property era-sh:StartingNoiseLevel .
era-sh:StartingNoiseLevel a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:startingNoiseLevel ;
    rdfs:comment "Validation for startingNoiseLevel property."@en ;
    sh:datatype xsd:decimal ;
    sh:message "The startingNoiseLevel value must be a decimal."@en ;
    sh:path era:startingNoiseLevel ;
    era:eratvIndex "4.11.4" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:StaticAxleLoadExceptionalPayload .
era-sh:StaticAxleLoadExceptionalPayload a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:staticAxleLoadExceptionalPayload ;
    rdfs:comment "Validation for staticAxleLoadExceptionalPayload property."@en ;
    sh:datatype xsd:decimal ;
    sh:message "The staticAxleLoadExceptionalPayload value must be a decimal."@en ;
    sh:path era:staticAxleLoadExceptionalPayload ;
    era:eratvIndex "4.5.3.3" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:StaticAxleLoadNormalPayload .
era-sh:StaticAxleLoadNormalPayload a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:staticAxleLoadNormalPayload ;
    rdfs:comment "Validation for staticAxleLoadNormalPayload property."@en ;
    sh:datatype xsd:decimal ;
    sh:message "The staticAxleLoadNormalPayload value must be a decimal."@en ;
    sh:path era:staticAxleLoadNormalPayload ;
    era:eratvIndex "4.5.3.2" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:StaticAxleLoadWorkingOrder .
era-sh:StaticAxleLoadWorkingOrder a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:staticAxleLoadWorkingOrder ;
    rdfs:comment "Validation for staticAxleLoadWorkingOrder property."@en ;
    sh:datatype xsd:decimal ;
    sh:message "The staticAxleLoadWorkingOrder value must be a decimal."@en ;
    sh:path era:staticAxleLoadWorkingOrder ;
    era:eratvIndex "4.5.3.1" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:StationaryNoiseLevel .
era-sh:StationaryNoiseLevel a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:stationaryNoiseLevel ;
    rdfs:comment "Validation for stationaryNoiseLevel property."@en ;
    sh:datatype xsd:decimal ;
    sh:message "The stationaryNoiseLevel value must be a decimal."@en ;
    sh:path era:stationaryNoiseLevel ;
    era:eratvIndex "4.11.3" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:SupportedPlatformHeight .
era-sh:SupportedPlatformHeight a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:supportedPlatformHeight ;
    rdfs:comment "Validation for supportedPlatformHeight property."@en ;
    sh:nodeKind sh:IRI ;
    sh:path era:supportedPlatformHeight ;
    sh:message "era:supportedPlatformHeight: its value must be an IRI."@en ;
    era:eratvIndex "4.12.3.1" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:sparql era-sh:SupportedPlatformHeightSKOS .
era-sh:SupportedPlatformHeightSKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:supportedPlatformHeight ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of supportedPlatformHeight is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "supportedPlatformHeight: The VehicleType {$this} with label {?label} has a value {?value} 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/platform-heights/PlatformHeights>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this (era:supportedPlatformHeight AS ?path) (?concept AS ?value) ?label
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:supportedPlatformHeight ?concept .
            era:supportedPlatformHeight era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:VehicleTypeShape sh:property era-sh:ThermalCapacityDistance .
era-sh:ThermalCapacityDistance a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:thermalCapacityDistance ;
    rdfs:comment "Validation for thermalCapacityDistance property."@en ;
    sh:datatype xsd:decimal ;
    sh:message "The thermalCapacityDistance value must be a decimal."@en ;
    sh:path era:thermalCapacityDistance ;
    era:eratvIndex "4.7.2.1.4" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:ThermalCapacityGradient .
era-sh:ThermalCapacityGradient a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:thermalCapacityGradient ;
    rdfs:comment "Validation for thermalCapacityGradient property."@en ;
    sh:datatype xsd:decimal ;
    sh:message "The thermalCapacityGradient value must be a decimal."@en ;
    sh:path era:thermalCapacityGradient ;
    era:eratvIndex "4.7.2.1.3" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:ThermalCapacitySpeed .
era-sh:ThermalCapacitySpeed a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:thermalCapacitySpeed ;
    rdfs:comment "Validation for thermalCapacitySpeed property."@en ;
    sh:datatype xsd:decimal ;
    sh:message "The thermalCapacitySpeed value must be a decimal."@en ;
    sh:path era:thermalCapacitySpeed ;
    era:eratvIndex "4.7.2.1.2" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:ThermalCapacityTSIReference .
era-sh:ThermalCapacityTSIReference a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:thermalCapacityTSIReference ;
    rdfs:comment "Validation for thermalCapacityTSIReference property."@en ;
    sh:nodeKind sh:IRI ;
    sh:path era:thermalCapacityTSIReference ;
    sh:message "era:thermalCapacityTSIReference: its value must be an IRI."@en ;
    era:eratvIndex "4.7.2.1.1" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:sparql era-sh:ThermalCapacityTSIReferenceSKOS .
era-sh:ThermalCapacityTSIReferenceSKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:thermalCapacityTSIReference ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of thermalCapacityTSIReference is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "thermalCapacityTSIReference: The VehicleType {$this} with label {?label} has a value {?value} is not one of the predefined values and cannot be converted into a SKOS concept on this list:<http://data.europa.eu/949/concepts/thermal-capacity/ThermalCapacityTSIReferences>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this (era:thermalCapacityTSIReference AS ?path) (?concept AS ?value) ?label
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:thermalCapacityTSIReference ?concept .
            era:thermalCapacityTSIReference era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:VehicleTypeShape sh:property era-sh:ThermalCapacityTime .
era-sh:ThermalCapacityTime a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:thermalCapacityTime ;
    rdfs:comment "Validation for thermalCapacityTime property."@en ;
    sh:datatype xsd:decimal ;
    sh:message "The thermalCapacityTime value must be a decimal."@en ;
    sh:path era:thermalCapacityTime ;
    era:eratvIndex "4.7.2.1.5" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:IsTransportableOnFerry .
era-sh:IsTransportableOnFerry a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:isTransportableOnFerry ;
    rdfs:comment "Validation for isTransportableOnFerry property."@en ;
    sh:datatype xsd:boolean ;
    sh:message "The isTransportableOnFerry value must be a boolean (true/false)."@en ;
    sh:path era:isTransportableOnFerry ;
    era:eratvIndex "4.8.8" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:TypeVersionId .
era-sh:TypeVersionId a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:typeVersionId ;
    rdfs:comment "Validation for typeVersionId property."@en ;
    sh:nodeKind sh:IRI ;
    sh:path era:typeVersionId ;
    sh:message "era:typeVersionId: its value must be an IRI."@en ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:sparql era-sh:TypeVersionIdSKOS .
era-sh:TypeVersionIdSKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:typeVersionId ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of typeVersionId is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "typeVersionId: The VehicleType {$this} with label {?label} has a value {?value} 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/type-version-ids/TypeVersionIds>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this (era:typeVersionId AS ?path) (?concept AS ?value) ?label
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:typeVersionId ?concept .
            era:typeVersionId era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:VehicleTypeShape sh:property era-sh:VehicleMaxSandingOutput .
era-sh:VehicleMaxSandingOutput a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:vehicleMaxSandingOutput ;
    rdfs:comment "Validation for vehicleMaxSandingOutput property."@en ;
    sh:datatype xsd:decimal ;
    sh:message "The vehicleMaxSandingOutput value must be a decimal indicating the grams per second value. If you provide value as a string in the format '[1st decimal] g per [2nd decimal] s' the 2nd decimal needs to be different than 0."@en ;
    sh:path era:vehicleMaxSandingOutput ;
    era:eratvIndex "4.14.2.13" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:VehicleTypeCategory .
era-sh:CertificateNodeShape sh:property era-sh:VehicleTypeCategory .
era-sh:VehicleTypeCategory a sh:PropertyShape ;
    era:affectedClass era:VehicleType, era:Certificate ;
    era:affectedProperty era:vehicleTypeCategory ;
    rdfs:comment "Validation for vehicleTypeCategory property."@en ;
    sh:nodeKind sh:IRI ;
    sh:path era:vehicleTypeCategory ;
    sh:message "era:vehicleTypeCategory: its value must be an IRI."@en ;
    era:eratvIndex "1.4" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:sparql era-sh:VehicleTypeCategorySKOS .
era-sh:CertificateNodeShape sh:sparql era-sh:VehicleTypeCategorySKOS .
era-sh:VehicleTypeCategorySKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:vehicleTypeCategory ;
    era:affectedClass era:VehicleType, era:Certificate ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of vehicleTypeCategory is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "vehicleTypeCategory: The VehicleType/Certificate {$this} with label {?label} has a value {?value} 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/vehicle-types/Categories>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this (era:vehicleTypeCategory AS ?path) (?concept AS ?value) ?label
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:vehicleTypeCategory ?concept .
            era:vehicleTypeCategory era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:VehicleTypeShape sh:property era-sh:VehicleTypeManufacturer .
era-sh:VehicleTypeManufacturer a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:vehicleTypeManufacturer ;
    rdfs:comment "Validation for vehicleTypeManufacturer property."@en ;
    sh:nodeKind sh:IRI ;
    sh:path era:vehicleTypeManufacturer ;
    sh:message "era:vehicleTypeManufacturer: its value must be an IRI pointing to an OrganisationRole."@en ;
    sh:class era:OrganisationRole ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:VehicleTypeNumber .
era-sh:VehicleTypeNumber a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:vehicleTypeNumber ;
    rdfs:comment "Validation for vehicleTypeNumber property."@en ;
    sh:datatype xsd:string ;
    sh:pattern "^\\d{2}-?\\d{3}-?\\d{4}-?\\d{1}$" ;
    sh:message "The vehicleTypeNumber value must be exactly 10 digits in the format 'XX-XXX-XXXX-X' (dashes optional)."@en ;
    sh:path era:vehicleTypeNumber ;
    era:eratvIndex "0.1" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:VehicleTypeSubCategory .
era-sh:CertificateNodeShape sh:property era-sh:VehicleTypeSubCategory .
era-sh:VehicleTypeSubCategory a sh:PropertyShape ;
    era:affectedClass era:VehicleType, era:Certificate ;
    era:affectedProperty era:vehicleTypeSubCategory ;
    rdfs:comment "Validation for vehicleTypeSubCategory property."@en ;
    sh:nodeKind sh:IRI ;
    sh:path era:vehicleTypeSubCategory ;
    sh:message "era:vehicleTypeSubCategory: its value must be an IRI."@en ;
    era:eratvIndex "1.5" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:sparql era-sh:VehicleTypeSubCategorySKOS .
era-sh:CertificateNodeShape sh:sparql era-sh:VehicleTypeSubCategorySKOS .
era-sh:VehicleTypeSubCategorySKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:vehicleTypeSubCategory ;
    era:affectedClass era:VehicleType, era:Certificate ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of vehicleTypeSubCategory is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "vehicleTypeSubCategory: The VehicleType/Certificate {$this} with label {?label} has a value {?value} 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/vehicle-types/SubCategories>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this (era:vehicleTypeSubCategory AS ?path) (?concept AS ?value) ?label
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:vehicleTypeSubCategory ?concept .
            era:vehicleTypeSubCategory era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:VehicleTypeShape sh:property era-sh:VehiclesComposingFixedFormation .
era-sh:VehiclesComposingFixedFormation a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:vehiclesComposingFixedFormation ;
    rdfs:comment "Validation for vehiclesComposingFixedFormation property."@en ;
    sh:datatype xsd:integer ;
    sh:message "The vehiclesComposingFixedFormation value must be an integer."@en ;
    sh:path era:vehiclesComposingFixedFormation ;
    era:eratvIndex "4.1.12" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:VoiceGSMRNetwork .
era-sh:VoiceGSMRNetwork a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:voiceGSMRNetwork ;
    rdfs:comment "Validation for voiceGSMRNetwork property."@en ;
    sh:nodeKind sh:IRI ;
    sh:path era:voiceGSMRNetwork ;
    sh:message "era:voiceGSMRNetwork: its value must be an IRI."@en ;
    era:eratvIndex "4.13.2.10" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:sparql era-sh:VoiceGSMRNetworkSKOS .
era-sh:VoiceGSMRNetworkSKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:voiceGSMRNetwork ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of voiceGSMRNetwork is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "voiceGSMRNetwork: The VehicleType {$this} with label {?label} has a value {?value} 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/gsmr-networks/GSMRNetworks>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this (era:voiceGSMRNetwork AS ?path) (?concept AS ?value) ?label
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:voiceGSMRNetwork ?concept .
            era:voiceGSMRNetwork era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:VehicleTypeShape sh:property era-sh:VoiceOperationalCommImpl .
era-sh:VoiceOperationalCommImpl a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:voiceOperationalCommImpl ;
    rdfs:comment "Validation for voiceOperationalCommImpl property."@en ;
    sh:datatype xsd:string ;
    sh:message "The voiceOperationalCommImpl value must be a character string."@en ;
    sh:path era:voiceOperationalCommImpl ;
    era:eratvIndex "4.13.2.6" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:WagonDerailmentFunction .
era-sh:WagonDerailmentFunction a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:wagonDerailmentFunction ;
    rdfs:comment "Validation for wagonDerailmentFunction property."@en ;
    sh:nodeKind sh:IRI ;
    sh:maxCount 1 ;
    sh:path era:wagonDerailmentFunction ;
    sh:message "era:wagonDerailmentFunction: its value must be an IRI."@en ;
    era:eratvIndex "4.15.1" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:sparql era-sh:WagonDerailmentFunctionSKOS .
era-sh:WagonDerailmentFunctionSKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:wagonDerailmentFunction ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of wagonDerailmentFunction is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "wagonDerailmentFunction: The VehicleType {$this} with label {?label} has a value {?value} 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/wagon-derailment-function/WagonDerailmentFunction>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this (era:wagonDerailmentFunction AS ?path) (?concept AS ?value) ?label
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:wagonDerailmentFunction ?concept .
            era:wagonDerailmentFunction era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:VehicleTypeShape sh:property era-sh:WheelSetGaugeChangeoverFacility .
era-sh:WheelSetGaugeChangeoverFacility a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:wheelSetGaugeChangeoverFacility ;
    rdfs:comment "Validation for wheelSetGaugeChangeoverFacility property."@en ;
    sh:nodeKind sh:IRI ;
    sh:path era:wheelSetGaugeChangeoverFacility ;
    sh:message "era:wheelSetGaugeChangeoverFacility: its value must be an IRI."@en ;
    era:eratvIndex "4.1.11" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:sparql era-sh:WheelSetGaugeChangeoverFacilitySKOS .
era-sh:WheelSetGaugeChangeoverFacilitySKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:wheelSetGaugeChangeoverFacility ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of wheelSetGaugeChangeoverFacility is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "wheelSetGaugeChangeoverFacility: The VehicleType {$this} with label {?label} has a value {?value} 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/gauge-changeover-facilities/GaugeChangeoverFacilities>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this (era:wheelSetGaugeChangeoverFacility AS ?path) (?concept AS ?value) ?label
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:wheelSetGaugeChangeoverFacility ?concept .
            era:wheelSetGaugeChangeoverFacility era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:VehicleTypeShape sh:property era-sh:WheelSetGaugeTransformationMethod .
era-sh:WheelSetGaugeTransformationMethod a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:wheelSetGaugeTransformationMethod ;
    rdfs:comment "Validation for wheelSetGaugeTransformationMethod property."@en ;
    sh:datatype xsd:string ;
    sh:message "The wheelSetGaugeTransformationMethod value must be a character string."@en ;
    sh:path era:wheelSetGaugeTransformationMethod ;
    era:eratvIndex "4.1.3.b" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:WheelchairSleepingPlace .
era-sh:WheelchairSleepingPlace a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:wheelchairSleepingPlace ;
    rdfs:comment "Validation for wheelchairSleepingPlace property."@en ;
    sh:datatype xsd:string ;
    sh:message "The wheelchairSleepingPlace value must be a character string."@en ;
    sh:path era:wheelchairSleepingPlace ;
    era:eratvIndex "4.12.1.3" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:WheelchairSpace .
era-sh:WheelchairSpace a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:wheelchairSpace ;
    rdfs:comment "Validation for wheelchairSpace property."@en ;
    sh:datatype xsd:string ;
    sh:message "The wheelchairSpace value must be a character string."@en ;
    sh:path era:wheelchairSpace ;
    era:eratvIndex "4.12.2.2" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh-eratv:MinInServiceWheelDiameter .
era-sh-eratv:MinInServiceWheelDiameter a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:minInServiceWheelDiameter ;
    rdfs:comment "Validation for minInServiceWheelDiameter property."@en ;
    sh:datatype xsd:integer ;
    sh:maxCount 1 ;
    sh:message "The minInServiceWheelDiameter value must be an integer."@en ;
    sh:path era:minInServiceWheelDiameter ;
    era:eratvIndex "4.8.2" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh-eratv:EtcsBaseline .
era-sh-eratv:EtcsBaseline a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:etcsBaseline ;
    rdfs:comment "Validation for etcsBaseline property."@en ;
    sh:nodeKind sh:IRI ;
    sh:maxCount 1 ;
    sh:path era:etcsBaseline ;
    sh:message "era:EtcsBaseline: its value must be an IRI."@en ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:sparql era-sh-eratv:EtcsBaselineSKOS .
era-sh-eratv:EtcsBaselineSKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:etcsBaseline ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of etcsBaseline is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "etcsBaseline: The VehicleType {$this} with label {?label} has a value {?value} 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/etcs-baselines/ETCSBaselines>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this (era:etcsBaseline AS ?path) (?concept AS ?value) ?label
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:etcsBaseline ?concept .
            era:etcsBaseline era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .


era-sh:RestrictionShape sh:property era-sh:EtcsEquipmentOnBoardLevel .
era-sh:VehicleTypeShape sh:property era-sh:EtcsEquipmentOnBoardLevel .
era-sh:EtcsEquipmentOnBoardLevel a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:etcsEquipmentOnBoardLevel ;
    rdfs:comment "Validation for etcsEquipmentOnBoardLevel property."@en ;
    sh:nodeKind sh:IRI ;
    sh:path era:etcsEquipmentOnBoardLevel ;
    sh:message "era:EtcsEquipmentOnBoardLevel: its value must be an IRI."@en ;
    sh:severity sh:Violation .

era-sh:RestrictionShape sh:sparql era-sh:EtcsEquipmentOnBoardLevelSKOS .
era-sh:VehicleTypeShape sh:sparql era-sh:EtcsEquipmentOnBoardLevelSKOS .
era-sh:EtcsEquipmentOnBoardLevelSKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:etcsEquipmentOnBoardLevel ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of etcsEquipmentOnBoardLevel is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "etcsEquipmentOnBoardLevel: The VehicleType {$this} with label {?label} has a value {?value} 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/etcs-equipment-on-board-level/ETCSEquipmentLevels>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this (era:etcsEquipmentOnBoardLevel AS ?path) (?concept AS ?value) ?label
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:etcsEquipmentOnBoardLevel ?concept .
            era:etcsEquipmentOnBoardLevel era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:VehicleTypeShape sh:property era-sh-eratv:AtoCommunicationSystem .
era-sh-eratv:AtoCommunicationSystem a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:atoCommunicationSystem ;
    rdfs:comment "Validation for atoCommunicationSystem property."@en ;
    sh:nodeKind sh:IRI ;
    sh:path era:atoCommunicationSystem ;
    sh:message "era:atoCommunicationSystem: its value must be an IRI."@en ;
    era:eratvIndex "4.13.2.9" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:sparql era-sh-eratv:AtoCommunicationSystemSKOS .
era-sh-eratv:AtoCommunicationSystemSKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:atoCommunicationSystem ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of atoCommunicationSystem is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "atoCommunicationSystem: The VehicleType {$this} with label {?label} has a value {?value} 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/ato-commsys/ATOCommSystem>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this (era:atoCommunicationSystem AS ?path) (?concept AS ?value) ?label
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:atoCommunicationSystem ?concept .
            era:atoCommunicationSystem era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:VehicleTypeShape sh:property era-sh:MaximumDesignSpeed .
era-sh:VehicleTypeConfigParameterSetShape sh:property era-sh:MaximumDesignSpeed .
era-sh:VehicleTypeAuthorisationRestrictionShape sh:property era-sh:MaximumDesignSpeed .
era-sh:MaximumDesignSpeed a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:maximumDesignSpeed ;
    rdfs:comment "Validation for maximumDesignSpeed property."@en ;
    sh:datatype xsd:decimal ;
    sh:message "The maximumDesignSpeed value must be an integer."@en ;
    sh:path era:maximumDesignSpeed ;
    era:eratvIndex "4.1.2.1" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh-eratv:DataRadioCompatible .
era-sh-eratv:DataRadioCompatible a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:dataRadioCompatible ;
    rdfs:comment "Validation for dataRadioCompatible property."@en ;
    sh:nodeKind sh:IRI ;
    sh:path era:dataRadioCompatible ;
    sh:message "era:dataRadioCompatible: its value must be an IRI."@en ;
    era:eratvIndex "4.13.2.8" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:sparql era-sh-eratv:DataRadioCompatibleSKOS .
era-sh-eratv:DataRadioCompatibleSKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:dataRadioCompatible ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of dataRadioCompatible is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "dataRadioCompatible: The VehicleType {$this} with label {?label} has a value {?value} 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/radio-system-compatibilities-data/RadioSystemCompatibilitiesData>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this (era:dataRadioCompatible AS ?path) (?concept AS ?value) ?label
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:dataRadioCompatible ?concept .
            era:dataRadioCompatible era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:VehicleTypeShape sh:property era-sh-eratv:CompatibleWithLineCategory .
era-sh-eratv:CompatibleWithLineCategory a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:compatibleWithLineCategory ;
    rdfs:comment "Validation for compatibleWithLineCategory property."@en ;
    sh:nodeKind sh:IRI ;
    sh:path era:compatibleWithLineCategory ;
    sh:message "era:compatibleWithLineCategory: its value must be an IRI."@en ;
    era:eratvIndex "4.5.1.1" ;
    sh:severity sh:Violation .


era-sh:VehicleTypeShape sh:sparql era-sh-eratv:CompatibleWithLineCategorySKOS .
era-sh-eratv:CompatibleWithLineCategorySKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:compatibleWithLineCategory ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of compatibleWithLineCategory is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "compatibleWithLineCategory: The VehicleType {$this} with label {?label} has a value {?value} 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/line-category/LineCategories>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this (era:compatibleWithLineCategory AS ?path) (?concept AS ?value) ?label
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:compatibleWithLineCategory ?concept .
            era:compatibleWithLineCategory era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .


era-sh:VehicleTypeShape sh:property era-sh:MinAxleLoad .
era-sh:MinAxleLoad a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:minAxleLoad ;
    rdfs:comment "Validation for minAxleLoad property."@en ;
    sh:datatype xsd:decimal ;
    sh:message "The minAxleLoad value must be a decimal."@en ;
    sh:path era:minAxleLoad ;
    era:eratvIndex "4.14.2.10" ;
    sh:severity sh:Violation .

era-sh:RestrictionShape sh:property era-sh-eratv:LegacyRadioSystem .
era-sh:VehicleTypeShape sh:property era-sh-eratv:LegacyRadioSystem .
era-sh:VehicleTypeAuthorisationRestrictionShape sh:property era-sh-eratv:LegacyRadioSystem .
era-sh-eratv:LegacyRadioSystem a sh:PropertyShape ;
    era:affectedClass era:VehicleType, era:Restriction ;
    era:affectedProperty era:legacyRadioSystem ;
    rdfs:comment "Validation for legacyRadioSystem property."@en ;
    sh:nodeKind sh:IRI ;
    sh:path era:legacyRadioSystem ;
    sh:message "era:legacyRadioSystem: its value must be an IRI."@en ;
    era:eratvIndex "4.13.2.3" ;
    sh:severity sh:Violation .

era-sh:RestrictionShape sh:sparql era-sh-eratv:LegacyRadioSystemSKOS .
era-sh:VehicleTypeShape sh:sparql era-sh-eratv:LegacyRadioSystemSKOS .
era-sh-eratv:LegacyRadioSystemSKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:legacyRadioSystem ;
    era:affectedClass era:VehicleType, era:Restriction ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of legacyRadioSystem is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "legacyRadioSystem: The VehicleType {$this} with label {?label} has a value {?value} 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/legacy-radio-systems/LegacyRadioSystems>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this (era:legacyRadioSystem AS ?path) (?concept AS ?value) ?label
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:legacyRadioSystem ?concept .
            era:legacyRadioSystem era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:VehicleTypeShape sh:property era-sh-eratv:EtcsInfill .
era-sh-eratv:EtcsInfill a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:etcsInfill ;
    rdfs:comment "Validation for etcsInfill property."@en ;
    sh:nodeKind sh:IRI ;
    sh:maxCount 1 ;
    sh:path era:etcsInfill ;
    sh:message "era:etcsInfill: its value must be an IRI."@en ;
    era:eratvIndex "4.13.1.3" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:sparql era-sh-eratv:EtcsInfillSKOS .
era-sh-eratv:EtcsInfillSKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:etcsInfill ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of etcsInfill is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "etcsInfill: The VehicleType {$this} with label {?label} has a value {?value} 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/etcs-infills/ETCSInfills>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this (era:etcsInfill AS ?path) (?concept AS ?value) ?label
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:etcsInfill ?concept .
            era:etcsInfill era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:VehicleTypeShape sh:property era-sh-eratv:EnergySupplySystem .
era-sh-eratv:EnergySupplySystem a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:energySupplySystem ;
    rdfs:comment "Validation for energySupplySystem property."@en ;
    sh:nodeKind sh:IRI ;
    sh:maxCount 1 ;
    sh:path era:energySupplySystem ;
    sh:message "era:energySupplySystem: its value must be an IRI."@en ;
    era:eratvIndex "4.10.1" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:sparql era-sh-eratv:EnergySupplySystemSKOS .
era-sh-eratv:EnergySupplySystemSKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:energySupplySystem ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of energySupplySystem is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "energySupplySystem: The VehicleType {$this} with label {?label} has a value {?value} 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/energy-supply-systems/EnergySupplySystems>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this (era:energySupplySystem AS ?path) (?concept AS ?value) ?label
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:energySupplySystem ?concept .
            era:energySupplySystem era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:VehicleTypeShape sh:property era-sh:NonCodedRestrictions .
era-sh:RestrictionShape sh:property era-sh:NonCodedRestrictions .
era-sh:VehicleTypeAuthorisationRestrictionShape sh:property era-sh:NonCodedRestrictions .
era-sh:NonCodedRestrictions a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:nonCodedRestrictions ;
    rdfs:comment "Validation for nonCodedRestrictions property."@en ;
    sh:datatype xsd:string ;
    sh:message "The nonCodedRestrictions value must be a character string."@en ;
    sh:path era:nonCodedRestrictions ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:TrainControlSwitchOverSpecialCondition .
era-sh:TrainControlSwitchOverSpecialCondition a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:trainControlSwitchOverSpecialCondition ;
    era:eratvIndex "4.13.1.6" ;
    sh:datatype xsd:string ;
    rdfs:comment "Validation for trainControlSwitchOverSpecialCondition property."@en ;
    sh:path era:trainControlSwitchOverSpecialCondition ;
    sh:message "The trainControlSwitchOverSpecialCondition value must be a character string."@en ;
    sh:severity sh:Violation .

era-sh:RestrictionShape sh:property era-sh-eratv:ProtectionLegacySystem .
era-sh:VehicleTypeShape sh:property era-sh-eratv:ProtectionLegacySystem .
era-sh:VehicleTypeAuthorisationRestrictionShape sh:property era-sh-eratv:ProtectionLegacySystem .
era-sh-eratv:ProtectionLegacySystem a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:protectionLegacySystem ;
    rdfs:comment "Validation for protectionLegacySystem property."@en ;
    sh:nodeKind sh:IRI ;
    sh:path era:protectionLegacySystem ;
    sh:message "era:protectionLegacySystem: its value must be an IRI."@en ;
    era:eratvIndex "4.13.1.5" ;
    sh:severity sh:Violation .

era-sh:RestrictionShape sh:sparql era-sh-eratv:ProtectionLegacySystemSKOS .
era-sh:VehicleTypeShape sh:sparql era-sh-eratv:ProtectionLegacySystemSKOS .
era-sh-eratv:ProtectionLegacySystemSKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:protectionLegacySystem ;
    era:affectedClass era:VehicleType, era:Restriction ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of protectionLegacySystem is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "protectionLegacySystem: The VehicleType/Restriction {$this} with label {?label} has a value {?value} that is not one of the predefined values and cannot be converted into a SKOS concept on this list: {?conceptScheme}."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this (era:protectionLegacySystem AS ?path) (?concept AS ?value) ?label ?conceptScheme
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:protectionLegacySystem ?concept .
            era:protectionLegacySystem era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:VehicleTypeShape sh:property era-sh:MassPerWheel .
era-sh:VehicleTypeConfigParameterSetShape sh:property era-sh:MassPerWheel .
era-sh:MassPerWheel a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:massPerWheel ;
    rdfs:comment "Validation for massPerWheel property."@en ;
    sh:datatype xsd:decimal ;
    sh:message "The massPerWheel value must be an decimal."@en ;
    sh:path era:massPerWheel ;
    era:eratvIndex "4.5.6" ;
    sh:severity sh:Violation .

era-sh:RestrictionShape sh:property era-sh-eratv:GaugingProfile .
era-sh:VehicleTypeShape sh:property era-sh-eratv:GaugingProfile .
era-sh-eratv:GaugingProfile a sh:PropertyShape ;
    era:affectedClass era:VehicleType, era:Restriction ;
    era:affectedProperty era:gaugingProfile ;
    rdfs:comment "Validation for gaugingProfile property."@en ;
    sh:nodeKind sh:IRI ;
    sh:path era:gaugingProfile ;
    sh:message "era:gaugingProfile: its value must be an IRI."@en ;
    era:eratvIndex "4.2.1" ;
    sh:severity sh:Violation .

era-sh:RestrictionShape sh:sparql era-sh-eratv:GaugingProfileSKOS .
era-sh:VehicleTypeShape sh:sparql era-sh-eratv:GaugingProfileSKOS .
era-sh-eratv:GaugingProfileSKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:gaugingProfile ;
    era:affectedClass era:VehicleType, era:Restriction ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of gaugingProfile is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "gaugingProfile: The VehicleType/Restriction {$this} with label {?label} has a value {?value} 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/gaugings/GaugingProfiles>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this (era:gaugingProfile AS ?path) (?concept AS ?value) ?label
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:gaugingProfile ?concept .
            era:gaugingProfile era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:RestrictionShape sh:property era-sh-eratv:TrainDetectionSystemType .
era-sh:VehicleTypeShape sh:property era-sh-eratv:TrainDetectionSystemType .
era-sh:VehicleTypeAuthorisationRestrictionShape sh:property era-sh-eratv:TrainDetectionSystemType .
era-sh-eratv:TrainDetectionSystemType a sh:PropertyShape ;
    era:affectedClass era:VehicleType, era:Restriction ;
    era:affectedProperty era:trainDetectionSystemType ;
    rdfs:comment "Validation for trainDetectionSystemType property."@en ;
    sh:nodeKind sh:IRI ;
    sh:maxCount 1 ;
    sh:path era:trainDetectionSystemType ;
    sh:message "era:trainDetectionSystemType: its value must be an IRI."@en ;
    era:eratvIndex "4.14.1" ;
    sh:severity sh:Violation .

era-sh:RestrictionShape sh:sparql era-sh-eratv:TrainDetectionSystemTypeSKOS .
era-sh:VehicleTypeShape sh:sparql era-sh-eratv:TrainDetectionSystemTypeSKOS .
era-sh-eratv:TrainDetectionSystemTypeSKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:trainDetectionSystemType ;
    era:affectedClass era:VehicleType, era:Restriction ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of trainDetectionSystemType is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "trainDetectionSystemType: The VehicleType/Restriction {$this} with label {?label} 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/train-detection/TrainDetectionSystems>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this ?concept ?label (era:trainDetectionSystemType AS ?path)
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:trainDetectionSystemType ?concept .
            era:trainDetectionSystemType era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:VehicleTypeShape sh:property era-sh-eratv:UsesGroup555 .
era-sh-eratv:UsesGroup555 a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:usesGroup555 ;
    rdfs:comment "Validation for usesGroup555 property."@en ;
    sh:datatype xsd:boolean ;
    sh:message "The usesGroup555 value must be a boolean (true/false)."@en ;
    sh:path era:usesGroup555 ;
    sh:maxCount 1 ;
    era:eratvIndex "4.13.2.12" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh-eratv:TemperatureRange .
era-sh:VehicleTypeAuthorisationRestrictionShape sh:property era-sh-eratv:TemperatureRange .
era-sh-eratv:TemperatureRange a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:temperatureRange ;
    rdfs:comment "Validation for temperatureRange property."@en ;
    sh:nodeKind sh:IRI ;
    sh:maxCount 1 ;
    sh:path era:temperatureRange ;
    sh:message "era:temperatureRange: its value must be an IRI."@en ;
    era:eratvIndex "4.3.1" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:sparql era-sh-eratv:TemperatureRangeSKOS .
era-sh:VehicleTypeAuthorisationRestrictionShape sh:sparql era-sh-eratv:TemperatureRangeSKOS .
era-sh-eratv:TemperatureRangeSKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:temperatureRange ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of temperatureRange is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "temperatureRange: The VehicleType {$this} with label {?label} 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/temperature-ranges/TemperatureRanges>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this ?concept ?label (era:temperatureRange AS ?path)
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:temperatureRange ?concept .
            era:temperatureRange era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .


era-sh:VehicleTypeShape sh:property era-sh-eratv:EtcsSystemCompatibility .
era-sh-eratv:EtcsSystemCompatibility a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:etcsSystemCompatibility ;
    rdfs:comment "Validation for etcsSystemCompatibility property."@en ;
    sh:nodeKind sh:IRI ;
    sh:path era:etcsSystemCompatibility ;
    sh:message "era:etcsSystemCompatibility: its value must be an IRI."@en ;
    era:eratvIndex "4.13.1.8" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:sparql era-sh-eratv:EtcsSystemCompatibilitySKOS .
era-sh-eratv:EtcsSystemCompatibilitySKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:etcsSystemCompatibility ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of etcsSystemCompatibility is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "etcsSystemCompatibility: The VehicleType {$this} with label {?label} 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/etcs-system-compatibilities/ETCSSystemCompatibilities>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this ?concept ?label (era:etcsSystemCompatibility AS ?path)
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:etcsSystemCompatibility ?concept .
            era:etcsSystemCompatibility era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:AxleSpacingDistance a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:axleSpacingDistance ;
    rdfs:comment "Validation for axleSpacingDistance property."@en ;
    sh:nodeKind sh:IRI ;
    sh:path era:axleSpacingDistance ;
    sh:message "era:axleSpacingDistance: its value must be an IRI."@en ;
    era:eratvIndex "4.5.3.4" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh-eratv:SafeConsistLengthInformationNecessary .
era-sh-eratv:SafeConsistLengthInformationNecessary a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:safeConsistLengthInformationNecessary ;
    rdfs:comment "Validation for safeConsistLengthInformationNecessary property."@en ;
    sh:nodeKind sh:IRI ;
    sh:maxCount 1 ;
    sh:path era:safeConsistLengthInformationNecessary ;
    sh:message "era:safeConsistLengthInformationNecessary: its value must be an IRI."@en ;
    era:eratvIndex "4.13.1.10" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:sparql era-sh-eratv:SafeConsistLengthInformationNecessarySKOS .
era-sh-eratv:SafeConsistLengthInformationNecessarySKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:safeConsistLengthInformationNecessary ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of safeConsistLengthInformationNecessary is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "safeConsistLengthInformationNecessary: The VehicleType {$this} with label {?label} 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/safe-consist-length/SafeConsistLengthNecessary>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this ?concept ?label (era:safeConsistLengthInformationNecessary AS ?path)
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:safeConsistLengthInformationNecessary ?concept .
            era:safeConsistLengthInformationNecessary era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

# TODO homogenise with ERA-RINF-shapes.ttl
era-sh:VehicleTypeShape sh:property era-sh-eratv:MaximumContactWireHeight .
era-sh-eratv:MaximumContactWireHeight a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:maximumContactWireHeight ;
    rdfs:comment "Validation for maximumContactWireHeight property."@en ;
    sh:datatype xsd:double ;
    sh:maxCount 1 ;
    sh:message "The maximumContactWireHeight value must be a decimal."@en ;
    sh:path era:maximumContactWireHeight ;
    era:eratvIndex "4.10.5" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeConfigParameterSetShape sh:property era-sh-eratv:RailInclination .
era-sh:VehicleTypeShape sh:property era-sh-eratv:RailInclination .
era-sh-eratv:RailInclination a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:railInclination ;
    rdfs:comment "Validation for railInclination property."@en ;
    sh:nodeKind sh:IRI ;
    sh:maxCount 1 ;
    sh:path era:railInclination ;
    sh:message "era:railInclination: its value must be an IRI."@en ;
    era:eratvIndex "4.6.5" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeConfigParameterSetShape sh:sparql era-sh-eratv:RailInclinationSKOS .
era-sh:VehicleTypeShape sh:sparql era-sh-eratv:RailInclinationSKOS .
era-sh-eratv:RailInclinationSKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:railInclination ;
    era:affectedClass era:VehicleType, era:VehicleTypeConfigParameterSet ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of railInclination is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "railInclination: The VehicleType/VehicleTypeConfigParameterSet {$this} with label {?label} 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/rail-inclinations/RailInclinations>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this ?concept ?label (era:railInclination AS ?path)
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:railInclination ?concept .
            era:railInclination era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:VehicleTypeShape sh:property era-sh-eratv:AtoSystemVersion .
era-sh-eratv:AtoSystemVersion a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:atoSystemVersion ;
    rdfs:comment "Validation for atoSystemVersion property."@en ;
    sh:nodeKind sh:IRI ;
    sh:path era:atoSystemVersion ;
    sh:message "era:atoSystemVersion: its value must be an IRI."@en ;
    era:eratvIndex "4.13.3.1" ;
    sh:severity sh:Violation .
    
era-sh:VehicleTypeShape sh:sparql era-sh-eratv:AtoSystemVersionSKOS .
era-sh-eratv:AtoSystemVersionSKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:atoSystemVersion ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of atoSystemVersion is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "atoSystemVersion: The VehicleType {$this} with label {?label} 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/ato-s-versions/ATOSystemVersions>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this ?concept ?label (era:atoSystemVersion AS ?path)
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:atoSystemVersion ?concept .
            era:atoSystemVersion era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .


era-sh:VehicleTypeShape sh:property era-sh-eratv:GsmRVersion .
era-sh-eratv:GsmRVersion a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:gsmRVersion ;
    rdfs:comment "Validation for gsmRVersion property."@en ;
    sh:nodeKind sh:IRI ;
    sh:path era:gsmRVersion ;
    sh:message "era:gsmRVersion: its value must be an IRI."@en ;
    era:eratvIndex "4.13.2.1" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:sparql era-sh-eratv:GsmRVersionSKOS .
era-sh-eratv:GsmRVersionSKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:gsmRVersion ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of gsmRVersion is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "gsmRVersion: The VehicleType {$this} with label {?label} 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/gsmr-versions/GSMRVersions>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this ?concept ?label (era:gsmRVersion AS ?path)
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:gsmRVersion ?concept .
            era:gsmRVersion era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:VehicleTypeShape sh:property era-sh-eratv:MinimumHorizontalRadius .
era-sh:VehicleTypeAuthorisationRestrictionShape sh:property era-sh-eratv:MinimumHorizontalRadius .
era-sh-eratv:MinimumHorizontalRadius a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:minimumHorizontalRadius ;
    rdfs:comment "Validation for minimumHorizontalRadius property."@en ;
     sh:or (
        [ sh:datatype xsd:decimal ]
        [ sh:datatype xsd:integer ]
    ) ;
    sh:message "The minimumHorizontalRadius value must be an integer or a decimal."@en ;
    sh:path era:minimumHorizontalRadius ;
    sh:maxCount 1 ;
    era:eratvIndex "4.8.4" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh-eratv:VoiceRadioCompatible .
era-sh-eratv:VoiceRadioCompatible a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:voiceRadioCompatible ;
    rdfs:comment "Validation for voiceRadioCompatible property."@en ;
    sh:nodeKind sh:IRI ;
    sh:path era:voiceRadioCompatible ;
    sh:message "era:voiceRadioCompatible: its value must be an IRI."@en ;
    era:eratvIndex "4.13.2.5" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:sparql era-sh-eratv:VoiceRadioCompatibleSKOS .
era-sh-eratv:VoiceRadioCompatibleSKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:voiceRadioCompatible ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of voiceRadioCompatible is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "voiceRadioCompatible: The VehicleType {$this} with label {?label} 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/radio-system-compatibilities-voice/RadioSystemCompatibilitiesVoice>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this ?concept ?label (era:voiceRadioCompatible AS ?path)
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:voiceRadioCompatible ?concept .
            era:voiceRadioCompatible era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:VehicleShape sh:property era-sh:ManufacturingCountry .
era-sh:VehicleTypeShape sh:property era-sh:ManufacturingCountry .
era-sh:ManufacturingCountry a sh:PropertyShape ;
    era:affectedClass era:VehicleType ,
                      era:Vehicle ;
    era:affectedProperty era:manufacturingCountry ;
    rdfs:comment "Validation for manufacturingCountry property."@en ;
    sh:nodeKind sh:IRI ;
    sh:path era:manufacturingCountry ;
    sh:message "era:manufacturingCountry: its value must be an IRI."@en ;
    sh:severity sh:Violation .

era-sh:VehicleShape sh:sparql era-sh:ManufacturingCountrySKOS .
era-sh:VehicleTypeShape sh:sparql era-sh:ManufacturingCountrySKOS .
era-sh:ManufacturingCountrySKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:manufacturingCountry ;
    era:affectedClass era:Vehicle ,
                      era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of manufacturingCountry is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "manufacturingCountry: The Vehicle/VehicleType {$this} with label {?label} 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>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this ?concept ?label (era:manufacturingCountry AS ?path)
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:manufacturingCountry ?concept .
            era:manufacturingCountry era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:VehicleTypeConfigParameterSetShape sh:property era-sh:VehicleContactForce .
era-sh:VehicleTypeShape sh:property era-sh:VehicleContactForce .
era-sh:VehicleContactForce a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:vehicleContactForce ;
    rdfs:comment "Validation for vehicleContactForce property."@en ;
    sh:datatype xsd:decimal ;
    sh:message "The vehicleContactForce must be a decimal value."@en ;
    sh:path era:vehicleContactForce ;
    era:eratvIndex "4.10.15" ;
    sh:severity sh:Violation .

era-sh:RestrictionShape sh:property era-sh-eratv:WheelSetGauge .
era-sh:VehicleTypeShape sh:property era-sh-eratv:WheelSetGauge .
era-sh:VehicleTypeAuthorisationRestrictionShape sh:property era-sh-eratv:WheelSetGauge .
era-sh-eratv:WheelSetGauge a sh:PropertyShape ;
    era:affectedClass era:VehicleType, era:Restriction ;
    era:affectedProperty era:wheelSetGauge ;
    rdfs:comment "Validation for wheelSetGauge property."@en ;
    sh:nodeKind sh:IRI ;
    sh:maxCount 1 ;
    sh:path era:wheelSetGauge ;
    sh:message "era:wheelSetGauge: its value must be an IRI."@en ;
    era:eratvIndex "4.1.3" ;
    sh:severity sh:Violation .

### SPARQLConstraint for wheelSetGauge SKOS validation
era-sh:RestrictionShape sh:sparql era-sh-eratv:WheelSetGaugeSKOS .
era-sh:VehicleTypeShape sh:sparql era-sh-eratv:WheelSetGaugeSKOS .
era-sh-eratv:WheelSetGaugeSKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:wheelSetGauge ;
    era:affectedClass era:VehicleType, era:Restriction ;  
    era:scope "local" ;
    rdfs:comment "Ensures that the value of wheelSetGauge is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "wheelSetGauge: The VehicleType {$this} with label {?label} 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/nominal-track-gauges/NominalTrackGauges>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this ?concept ?label (era:wheelSetGauge AS ?path)
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:wheelSetGauge ?concept .
            era:wheelSetGauge era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:VehicleTypeShape sh:property era-sh:MaximumBrakeThermalEnergyCapacity .
era-sh:VehicleTypeConfigParameterSetShape sh:property era-sh:MaximumBrakeThermalEnergyCapacity .
era-sh:MaximumBrakeThermalEnergyCapacity a sh:PropertyShape ;
    era:affectedClass era:VehicleType ;
    era:affectedProperty era:maximumBrakeThermalEnergyCapacity ;
    rdfs:comment "Validation for maximumBrakeThermalEnergyCapacity property."@en ;
    sh:datatype xsd:decimal ;
    sh:message "The maximumBrakeThermalEnergyCapacity value must be a decimal."@en ;
    sh:path era:maximumBrakeThermalEnergyCapacity ;
    era:eratvIndex "4.7.2.1.6" ;
    sh:severity sh:Violation .

era-sh:VehicleTypeShape sh:property era-sh:VehicleCategory .
era-sh:VehicleCategory
    a sh:PropertyShape ;
    era:affectedProperty era:vehicleCategory ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Validation for the vehicleCategory property for VehicleType."@en ;
    sh:path era:vehicleCategory ;
    sh:nodeKind sh:IRI ;
    sh:severity sh:Violation ;
    sh:message "vehicleCategory: The value must be an IRI."@en ;
    era:eratvIndex "1.4" .

### SKOS SPARQLConstraint for era:vehicleCategory
era-sh:VehicleTypeShape sh:sparql era-sh:VehicleCategorySKOS .
era-sh:VehicleCategorySKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:vehicleCategory ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of vehicleCategory is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "vehicleCategory: The VehicleType {$this} with label {?label} 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/vehicle-types/Categories>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this ?concept ?label (era:vehicleCategory AS ?path)
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:vehicleCategory ?concept .
            era:vehicleCategory era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:VehicleTypeConfigParameterSetShape sh:property era-sh:ETCSBaselineCompatibility .
era-sh:VehicleTypeShape sh:property era-sh:ETCSBaselineCompatibility .
era-sh:ETCSBaselineCompatibility
    a sh:PropertyShape ;
    era:affectedProperty era:etcsBaselineCompatibility ;
    era:affectedClass era:VehicleType, era:VehicleTypeConfigParameterSet ;
    era:scope "local" ;
    rdfs:comment "Validation for the etcsBaselineCompatibility property for VehicleType and VehicleTypeConfigParameterSet."@en ;
    sh:path era:etcsBaselineCompatibility ;
    sh:nodeKind sh:IRI ;
    sh:maxCount 1 ;
    sh:severity sh:Violation ;
    sh:message "etcsBaselineCompatibility: The value must be an IRI."@en ;
    era:eratvIndex "4.13.1.2" .

### SKOS SPARQLConstraint for era:etcsBaselineCompatibility
# !!! - There is no available ConceptScheme in the ontology. Update this validation when there is one available. - !!!
era-sh:VehicleTypeConfigParameterSetShape sh:sparql era-sh:ETCSBaselineCompatibilitySKOS .
era-sh:VehicleTypeShape sh:sparql era-sh:ETCSBaselineCompatibilitySKOS .
era-sh:ETCSBaselineCompatibilitySKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:etcsBaselineCompatibility ;
    era:affectedClass era:VehicleType, era:VehicleTypeConfigParameterSet ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of etcsBaselineCompatibility is a valid SKOS concept from the linked concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "etcsBaselineCompatibility: The VehicleType/VehicleTypeConfigParameterSet {$this} with label {?label} 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/etcs-baselines/ETCSBaselines>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this ?concept ?label (era:etcsBaselineCompatibility AS ?path)
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:etcsBaselineCompatibility ?concept .
            era:etcsBaselineCompatibility era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

era-sh:VehicleTypeShape sh:property era-sh:AssessedCantDeficiency .
era-sh:VehicleTypeConfigParameterSetShape sh:property era-sh:AssessedCantDeficiency .
era-sh:AssessedCantDeficiency
    a sh:PropertyShape ;
    era:affectedProperty era:assessedCantDeficiency ;
    era:affectedClass era:VehicleType, era:VehicleTypeConfigParameterSet ;  
    era:scope "local" ;
    rdfs:comment "Validation for assessedCantDeficiency property. Cant deficiency (maximum uncompensated lateral acceleration) for which the vehicle has been assessed." ;
    sh:path era:assessedCantDeficiency ;
    sh:datatype xsd:integer ;
    sh:severity sh:Violation ;
    sh:message "assessedCantDeficiency: The value must be an integer representing cant deficiency in millimeters."@en ;
    era:eratvIndex "4.6.1" .

era-sh:VehicleTypeShape sh:property era-sh:AxleSpacing .
era-sh:AxleSpacing
    a sh:PropertyShape ;
    era:affectedProperty era:axleSpacing ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Validation for axleSpacing property. Position of the axles along the unit." ;
    sh:path era:axleSpacing ;
    sh:datatype xsd:string ;
    sh:severity sh:Violation ;
    sh:message "axleSpacing: The value must be a string describing the position of axles along the unit."@en ;
    era:eratvIndex "4.5.3.4" .

era-sh:VehicleTypeShape sh:property era-sh:BrakeWeightPercentage .
era-sh:BrakeWeightPercentage
    a sh:PropertyShape ;
    era:affectedProperty era:brakeWeightPercentage ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Validation for brakeWeightPercentage property. Brake weight percentage (lambda) or Braked mass." ;
    sh:path era:brakeWeightPercentage ;
    sh:datatype xsd:string ;
    sh:severity sh:Violation ;
    sh:message "brakeWeightPercentage: The value must be a string."@en ;
    era:eratvIndex "4.7.6" .

era-sh:VehicleTypeShape sh:property era-sh:VehicleContactForceFormula .
era-sh:VehicleTypeConfigParameterSetShape sh:property era-sh:VehicleContactForceFormula .
era-sh:VehicleContactForceFormula
    a sh:PropertyShape ;
    era:affectedProperty era:vehicleContactForceFormula ;
    era:affectedClass era:VehicleType, era:VehicleTypeConfigParameterSet ;
    era:scope "local" ;
    rdfs:comment "Validation for vehicleContactForceFormula property." ;
    sh:path era:vehicleContactForceFormula ;
    sh:datatype xsd:string ;
    sh:maxCount 1 ;
    sh:severity sh:Violation ;
    sh:message "vehicleContactForceFormula: The value must be a string."@en .

era-sh:VehicleTypeShape sh:property era-sh:VehicleTypePlatform .
era-sh:VehicleTypePlatform
    a sh:PropertyShape ;
    era:affectedProperty era:vehicleTypePlatform ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Validation for vehicleTypePlatform property. Platform for which the vehicle type is designed." ;
    sh:path era:vehicleTypePlatform ;
    sh:datatype xsd:string ;
    sh:severity sh:Violation ;
    sh:message "vehicleTypePlatform: The value must be a string."@en ;
    era:eratvIndex "4.1.4" .

# era-sh:MinVehicleImpedanceShape
era-sh:MinVehicleImpedanceShape sh:sparql era-sh:FrequencyResistanceExclusiveToVehicleTypeConfig .
era-sh:FrequencyResistanceExclusiveToVehicleTypeConfig
    a sh:SPARQLConstraint ;
    sh:prefixes era: ;
    era:affectedClass era:MinVehicleImpedance ;
    sh:message "The properties minImpedanceFrequency and minImpedanceResistance are only allowed when MinVehicleImpedance is linked from a VehicleTypeConfigParameterSet. This error is due to {$this} having one, some, or all of these 2 properties, but not being connected to a VehicleTypeConfigParameterSet."@en ;
    sh:select """
    SELECT $this (?prop AS ?path) WHERE {
      $this ?prop ?value .
      FILTER(?prop IN (era:minImpedanceFrequency, era:minImpedanceResistance))
      FILTER NOT EXISTS {
        ?config a era:VehicleTypeConfigParameterSet ;
                era:minVehicleImpedance $this .
      }
    }
  """ .

# era-sh:MinVehicleImpedanceShape
era-sh:MinVehicleImpedanceShape sh:sparql era-sh:FrequencyResistanceRequired .
era-sh:FrequencyResistanceRequired
    a sh:SPARQLConstraint ;
    sh:prefixes era: ;
    era:affectedClass era:MinVehicleImpedance ;
    sh:message "Properties minImpedanceFrequency and minImpedanceResistance are required when MinVehicleImpedance is linked from a VehicleTypeConfigParameterSet. This error is due to {$this} (being connected to {?config}) not having one or both of these 2 properties."@en ;
    sh:select """
    SELECT $this ?config (era:minVehicleImpedance AS ?path) WHERE {
      ?config a era:VehicleTypeConfigParameterSet ;
              era:minVehicleImpedance $this .
      FILTER (
        NOT EXISTS { $this era:minImpedanceFrequency ?freq . } ||
        NOT EXISTS { $this era:minImpedanceResistance ?res . }
      )
    }
  """ .


# Frequency applicability
era-sh:MinVehicleImpedanceShape sh:sparql era-sh:MinImpedanceFrequencyApplicability .
era-sh:MinImpedanceFrequencyApplicability
    a sh:SPARQLConstraint ;
    sh:prefixes era: ;
    era:affectedProperty era:minImpedanceFrequency ;
    era:affectedClass era:MinVehicleImpedance ;
    era:scope "local" ;
    rdfs:comment "minImpedanceFrequency is applicable when MinVehicleImpedance is used in a VehicleTypeConfigParameterSet."@en ;
    sh:severity sh:Violation ;
    sh:message "The VehicleTypeConfigParameterSet {?config} ({?label}) has a MinVehicleImpedance which makes minImpedanceFrequency applicable. This error is due to {$this} not having a value for such a property"@en ;
    sh:select """
        SELECT DISTINCT $this ?label ?config (era:minImpedanceFrequency AS ?path)
        WHERE {
            ?config a era:VehicleTypeConfigParameterSet ;
                    era:minVehicleImpedance $this .
            FILTER NOT EXISTS { $this era:minImpedanceFrequency ?val . }
            OPTIONAL { ?config rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
        }
    """ .

# Resistance applicability
era-sh:MinVehicleImpedanceShape sh:sparql era-sh:MinImpedanceResistanceApplicability .
era-sh:MinImpedanceResistanceApplicability
    a sh:SPARQLConstraint ;
    sh:prefixes era: ;
    era:affectedProperty era:minImpedanceResistance ;
    era:affectedClass era:MinVehicleImpedance ;
    era:scope "local" ;
    rdfs:comment "minImpedanceResistance is applicable when MinVehicleImpedance is used in a VehicleTypeConfigParameterSet."@en ;
    sh:severity sh:Violation ;
    sh:message "The VehicleTypeConfigParameterSet {?config} ({?label}) has a MinVehicleImpedance which makes minImpedanceResistance applicable. This error is due to {$this} not having a value for such a property"@en ;
    sh:select """
        SELECT DISTINCT $this ?label ?config (era:minImpedanceResistance AS ?path)
        WHERE {
            ?config a era:VehicleTypeConfigParameterSet ;
                    era:minVehicleImpedance $this .
            FILTER NOT EXISTS { $this era:minImpedanceResistance ?val . }
            OPTIONAL { ?config rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
        }
    """ .

era-sh:MinVehicleImpedanceShape sh:sparql era-sh:TrainSystemPropsExclusive .
era-sh:TrainSystemPropsExclusive
    a sh:SPARQLConstraint ;
    sh:prefixes era: ;
    era:affectedClass era:MinVehicleImpedance ;
    sh:message "The properties minVehicleInputCapacitance, minVehicleInputImpedance, and minVehicleImpedanceVoltages are only allowed when MinVehicleImpedance is linked from a TrainDetectionSystem. This error is due to {$this} having one, some, or all of these 3 properties and not being linked to a TrainDetectionSystem."@en ;
    sh:select """
    SELECT $this (?prop AS ?path) WHERE {
      $this ?prop ?value .
      FILTER(?prop IN (era:minVehicleInputCapacitance, era:minVehicleInputImpedance, era:minVehicleImpedanceVoltages))
      FILTER NOT EXISTS {
        ?train a era:TrainDetectionSystem ;
               era:minVehicleImpedance $this .
      }
    }
  """ .

era-sh:MinVehicleImpedanceShape sh:sparql era-sh:TrainSystemPropsRequired .
era-sh:TrainSystemPropsRequired
    a sh:SPARQLConstraint ;
    sh:prefixes era: ;
    era:affectedClass era:MinVehicleImpedance ;
    sh:message "The properties minVehicleInputCapacitance, minVehicleInputImpedance, and minVehicleImpedanceVoltages are required when MinVehicleImpedance is linked from a TrainDetectionSystem. This error is due to {$this} (being connected to {?train}) not having one, some, or all of these 3 properties."@en ;
    sh:select """
    SELECT $this ?train (era:minVehicleImpedance AS ?path) WHERE {
      ?train a era:TrainDetectionSystem ;
             era:minVehicleImpedance $this .
      FILTER (
        NOT EXISTS { $this era:minVehicleInputCapacitance ?cap . } ||
        NOT EXISTS { $this era:minVehicleInputImpedance ?imp . } ||
        NOT EXISTS { $this era:minVehicleImpedanceVoltages ?volt . }
      )
    }
  """ .

era-sh:VehicleTypeShape sh:property era-sh:DangerousGoodsTankCode .
era-sh:DangerousGoodsTankCode
    a sh:PropertyShape ;
    era:affectedProperty era:dangerousGoodsTankCode ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Validation for dangerousGoodsTankCode property." ;
    sh:path era:dangerousGoodsTankCode ;
    sh:datatype xsd:string ;
    sh:severity sh:Violation ;
    sh:message "dangerousGoodsTankCode (4.1.9): The value must be a string."@en ;
    era:eratvIndex "4.1.9" .

era-sh:VehicleTypeShape sh:property era-sh:LegacyRadioSystemComment .
era-sh:LegacyRadioSystemComment
    a sh:PropertyShape ;
    era:affectedProperty era:legacyRadioSystemComment ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Validation for legacyRadioSystemComment property." ;
    sh:path era:legacyRadioSystemComment ;
    sh:datatype xsd:string ;
    sh:severity sh:Violation ;
    sh:message "legacyRadioSystemComment (4.13.2.3): The value must be a string."@en ;
    era:eratvIndex "4.13.2.3" .

era-sh:VehicleTypeShape sh:property era-sh:ProtectionLegacySystemComment .
era-sh:ProtectionLegacySystemComment
    a sh:PropertyShape ;
    era:affectedProperty era:protectionLegacySystemComment ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Additional comments on Class B / Legacy train protection, control and warning systems installed."@en ;
    sh:path era:protectionLegacySystemComment ;
    sh:nodeKind sh:Literal ;
    sh:datatype xsd:string ;
    sh:severity sh:Violation ;
    sh:message "protectionLegacySystemComment (4.13.1.5): The value must be a string."@en ;
    era:eratvIndex "4.13.1.5" .

era-sh:VehicleTypeShape sh:property era-sh:TypeVersionNumber .
era-sh:TypeVersionNumber
    a sh:PropertyShape ;
    era:affectedProperty era:typeVersionNumber ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Validation for typeVersionNumber property." ;
    sh:path era:typeVersionNumber ;
    sh:datatype xsd:string ;
    sh:severity sh:Violation ;
    sh:message "typeVersionNumber: The value must be a string."@en .

era-sh:VehicleTypeShape sh:property era-sh:HasCantDefficiencyCompensation .
era-sh:HasCantDefficiencyCompensation
    a sh:PropertyShape ;
    era:affectedProperty era:hasCantDefficiencyCompensation ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Validation for hasCantDefficiencyCompensation property." ;
    sh:path era:hasCantDefficiencyCompensation ;
    sh:datatype xsd:boolean ;
    sh:severity sh:Violation ;
    sh:message "hasCantDefficiencyCompensation (4.6.2): The value must be a boolean."@en ;
    era:eratvIndex "4.6.2" .

era-sh:VehicleTypeShape sh:property era-sh:HasFlangeLubrication .
era-sh:HasFlangeLubrication
    a sh:PropertyShape ;
    era:affectedProperty era:hasFlangeLubrication ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Validation for hasFlangeLubrication property." ;
    sh:path era:hasFlangeLubrication ;
    sh:datatype xsd:boolean ;
    sh:severity sh:Violation ;
    sh:message "hasFlangeLubrication (4.9.3.1): The value must be a boolean."@en ;
    era:eratvIndex "4.9.3.1" .

era-sh:VehicleTypeShape sh:property era-sh:VehicleSubCategory .
era-sh:VehicleSubCategory
    a sh:PropertyShape ;
    era:affectedProperty era:vehicleSubCategory ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Validation for vehicleSubCategory property."@en ;
    sh:path era:vehicleSubCategory ;
    sh:nodeKind sh:IRI ;
    sh:severity sh:Violation ;
    sh:message "vehicleSubCategory (1.5): The value must be an IRI."@en ;
    era:eratvIndex "1.5" .

era-sh:VehicleTypeShape sh:sparql era-sh:VehicleSubCategorySKOS .
era-sh:VehicleSubCategorySKOS
    a sh:SPARQLConstraint ;
    era:affectedProperty era:vehicleSubCategory ;
    era:affectedClass era:VehicleType ;
    era:scope "local" ;
    rdfs:comment "Ensures that the value of vehicleSubCategory is a valid SKOS concept from the vehicle types concept scheme."@en ;
    sh:severity sh:Violation ;
    sh:message "vehicleSubCategory: The VehicleType {$this} with label {?label} 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/vehicle-types/Categories>."@en ;
    sh:prefixes era: ;
    sh:select """
        SELECT $this ?concept ?label (era:vehicleSubCategory AS ?path)
        WHERE {
            OPTIONAL { $this rdfs:label ?label0 } .
            BIND(COALESCE(?label0, "unknown label") AS ?label)
            $this era:vehicleSubCategory ?concept .
            era:vehicleSubCategory era:inSkosConceptScheme ?conceptScheme .
            FILTER (NOT EXISTS { ?concept skos:inScheme ?conceptScheme })
        }
    """ .

# ============================================================
# New minimal PropertyShapes for properties lacking shapes
# ============================================================

# certificate
era-sh:VehicleTypeShape sh:property era-sh:Certificate .
era-sh:VehicleTypeAuthorisationCaseShape sh:property era-sh:Certificate .
era-sh:Certificate
    a sh:PropertyShape ;
    era:affectedProperty era:certificate ;
    era:affectedClass era:VehicleType , era:VehicleTypeAuthorisationCase ;
    era:scope "local" ;
    rdfs:comment "Type or Design Examination Certificate."@en ;
    sh:path era:certificate ;
    sh:nodeKind sh:IRI ;
    sh:class vpa:EvidenceDocument ;
    sh:severity sh:Warning ;
    sh:message "certificate: The value must be an IRI pointing to an EvidenceDocument. CertificationLevelDocument is allowed as a subclass of EvidenceDocument."@en .

# CertificationLevelDocumentShape (new NodeShape for CertificationLevelDocument class)
era-sh:era-sh:CertificationLevelDocumentShape
    a sh:NodeShape ;
    sh:nodeKind sh:IRI ;
    sh:targetClass era:CertificationLevelDocument .

# evidence document state
era-sh:ECDeclarationShape sh:property era-sh:DocState .
era-sh:CertificationLevelDocumentShape sh:property era-sh:DocState .
era-sh:DocState
    a sh:PropertyShape ;
    era:affectedProperty era:state ;
    era:affectedClass era:CertificationLevelDocument ;
    era:scope "local" ;
    rdfs:comment "State of the Evidence Document."@en ;
    sh:path era:state ;
    sh:nodeKind sh:IRI ;
    sh:class skos:Concept ;
    sh:severity sh:Warning ;
    sh:message "state: The value must be an IRI and a SKOS concept."@en .

# ECDeclarationShape (NodeShape for ECDeclaration class)
era-sh:ECDeclarationShape
    a sh:NodeShape ;
    sh:nodeKind sh:IRI ;
    sh:targetClass era:ECDeclaration .

