@prefix : <https://w3id.org/mobilitydcat-ap/drafts/latest#> .
@prefix mobilitydcatap: <https://w3id.org/mobilitydcat-ap#> .
@prefix geodcatap: <http://www.w3.org/ns/geodcat#> .
@prefix eli: <http://data.europa.eu/eli/ontology#> .

@prefix adms: <http://www.w3.org/ns/adms#> .
@prefix bibo: <http://purl.org/ontology/bibo/> .
@prefix cnt: <http://www.w3.org/2011/content#> .
@prefix dcat: <http://www.w3.org/ns/dcat#> .
@prefix dcatap: <http://data.europa.eu/r5r/> .
@prefix dct: <http://purl.org/dc/terms/> .
@prefix dqv: <http://www.w3.org/ns/dqv#> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix org: <http://www.w3.org/ns/org#> .
@prefix locn: <http://www.w3.org/ns/locn#> .
@prefix vcard: <http://www.w3.org/2006/vcard/ns#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix oa: <http://www.w3.org/ns/oa#> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix sh: <http://www.w3.org/ns/shacl#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix spdx: <http://spdx.org/rdf/terms#> .


<https://w3id.org/mobilitydcat-ap/drafts/latest#> 
  a owl:Ontology , adms:Asset ;
  
  owl:imports <https://semiceu.github.io/DCAT-AP/releases/3.0.1/shacl/dcat-ap-SHACL.ttl> ;

  owl:imports <https://w3id.org/mobilitydcat-ap/drafts/latest/mobilitydcat-ap_v1.1.0.ttl> ;
  owl:imports <http://www.w3.org/ns/dqv.ttl> ;
  
  owl:versionIRI <https://w3id.org/mobilitydcat-ap/drafts/latest#> ;
  
  owl:versionInfo "3.0.0" ;
  adms:status <http://publications.europa.eu/resource/dataset/dataset-status/COMPLETED> ;
  dcatap:availability dcatap:stable ;
    
  dct:conformsTo <https://www.w3.org/TR/shacl> ;
  dct:license <https://creativecommons.org/licenses/by/4.0> ;
  dct:created "2023-08-14"^^xsd:date ;
  dct:issued "2023-08-14"^^xsd:date ;
  dct:modified "2025-01-17"^^xsd:date ;
  dct:dateCopyrighted "2023"^^xsd:gYear ;
  
  dct:title "mobilityDCAT-AP 3.0.0 SHACL Constraints - Basic Validation"@en ;
  dct:description "SHACL validation constraints for mobilityDCAT-AP, extending DCAT-AP 3.0.1 with mobility-specific requirements. This file contains basic validation (cardinality, nodeKind, datatype checks). Properties inherited from DCAT-AP 3.0.1 (such as foaf:name and dct:type for Agent) are NOT redefined here - they are imported from DCAT-AP 3.0.1 SHACL."@en ;
  
  rdfs:isDefinedBy <https://w3id.org/mobilitydcat-ap/drafts/latest/> ;
  
  bibo:editor [
    a foaf:Person ;
    owl:sameAs <https://lina-molinas-comet.name/foaf/#me> ;
    owl:sameAs <https://orcid.org/0000-0001-5446-6947> ;
    foaf:name "Lina Molinas Comet"
  ] ;
  bibo:editor [     
    a foaf:Person ;
    owl:sameAs <https://github.com/Daham-Mustaf> ;
    owl:sameAs <https://orcid.org/0000-0003-1867-4428> ;
    foaf:name "Daham Mustafa"
  ] ;
  
  dct:creator [ 
    a foaf:Group ;
    foaf:name "NAPCORE SWG 4.4" ;
    foaf:page <https://github.com/mobilityDCAT-AP/mobilityDCAT-AP> 
  ] ;
  dct:publisher <https://napcore.eu/> ;
  dct:rightsHolder <https://napcore.eu/> ;

  dcat:distribution [ 
    a adms:AssetDistribution ;
    dct:format <http://publications.europa.eu/resource/authority/file-type/RDF_TURTLE> ,
               <http://www.w3.org/ns/formats/data/Turtle> ;
    dct:title "SHACL Basic Validation (Turtle)"@en ;
    dcat:downloadURL <https://w3id.org/mobilitydcat-ap/drafts/latest/shaclShapes/mobilitydcat-ap-shacl.ttl> ;
    dcat:mediaType "text/turtle"^^dct:IMT
  ] .

#===========================================================================
# MOBILITY-SPECIFIC SHAPES
# 
# This file contains ONLY mobility-specific extensions to DCAT-AP.
# Base DCAT-AP properties are inherited from DCAT-AP 3.0.1 import.
#===========================================================================

#---------------------------------------------------------------------------
# AGENT SHAPE - Mobility Extensions (Basic Validation)
#---------------------------------------------------------------------------

<https://w3id.org/mobilitydcat-ap/drafts/latest#Agent_Shape>
  a sh:NodeShape ;
  sh:targetClass foaf:Agent ;
  sh:name "Agent (mobilityDCAT-AP) - Extensions"@en ;
  sh:description "Extends DCAT-AP 3.0.1 Agent with mobility-specific contact and organizational properties. Base properties (foaf:name, dct:type) are inherited from DCAT-AP 3.0.1."@en ;
  
  sh:property 
    :Agent_Shape_address ,
    :Agent_Shape_affiliation ,
    :Agent_Shape_email ,
    :Agent_Shape_firstName ,
    :Agent_Shape_phone ,
    :Agent_Shape_surname ,
    :Agent_Shape_workplaceHomepage .

#---------------------------------------------------------------------------
# Named Property Shapes - Agent (Basic Validation)
#---------------------------------------------------------------------------

:Agent_Shape_address
  sh:path locn:address ;
  sh:nodeKind sh:BlankNodeOrIRI ;
  sh:maxCount 1 ;
  sh:name "address"@en ;
  sh:description "The postal address of the Agent. This property is analogous to an addition by GeoDCAT-AP v2.0.0."@en ;
  sh:message "Address must be a blank node or IRI and can appear at most once"@en ;
  sh:severity sh:Info .

:Agent_Shape_affiliation
  sh:path org:memberOf ;
  sh:nodeKind sh:BlankNodeOrIRI ;
  sh:name "affiliation"@en ;
  sh:description "If the agent is a person, this property specifies their organizational affiliation. This property is analogous to an addition by GeoDCAT-AP v2.0.0."@en ;
  sh:message "Affiliation must be a blank node or IRI"@en ;
  sh:severity sh:Info .

:Agent_Shape_email
  sh:path foaf:mbox ;
  sh:nodeKind sh:IRI ;
  sh:name "email"@en ;
  sh:description "The email address of the Agent, specified using fully qualified mailto: URI scheme [RFC6068]."@en ;
  sh:message "Email must be an IRI using the mailto: scheme (e.g., mailto:example@example.com)"@en ;
  sh:severity sh:Info .

:Agent_Shape_firstName
  sh:path foaf:firstName ;
  sh:nodeKind sh:Literal ;
  sh:maxCount 1 ;
  sh:name "first name"@en ;
  sh:description "If the agent is a person, this property specifies their first name."@en ;
  sh:message "First name must be a literal and can appear at most once"@en ;
  sh:severity sh:Info .

:Agent_Shape_phone
  sh:path foaf:phone ;
  sh:nodeKind sh:IRI ;
  sh:name "phone"@en ;
  sh:description "The phone number of the Agent, specified using fully qualified tel: URI scheme [RFC3966]. This property is analogous to an addition by GeoDCAT-AP v2.0.0."@en ;
  sh:message "Phone must be an IRI using the tel: scheme (e.g., tel:+1234567890)"@en ;
  sh:severity sh:Info .

:Agent_Shape_surname
  sh:path foaf:surname ;
  sh:nodeKind sh:Literal ;
  sh:maxCount 1 ;
  sh:name "surname"@en ;
  sh:description "If the agent is a person, this property specifies their surname."@en ;
  sh:message "Surname must be a literal and can appear at most once"@en ;
  sh:severity sh:Info .

:Agent_Shape_workplaceHomepage
  sh:path foaf:workplaceHomepage ;
  sh:nodeKind sh:IRI ;
  sh:maxCount 1 ;
  sh:name "workplace homepage"@en ;
  sh:description "The website of the Agent."@en ;
  sh:message "Workplace homepage must be an IRI and can appear at most once"@en ;
  sh:severity sh:Info .

#---------------------------------------------------------------------------
# ADDRESS SHAPE - Mobility Extensions (Basic Validation)
#---------------------------------------------------------------------------

<https://w3id.org/mobilitydcat-ap/drafts/latest#Address_Shape>
  a sh:NodeShape ;
  sh:targetClass locn:Address ;
  sh:name "Address (mobilityDCAT-AP)"@en ;
  sh:description "Postal address of an Agent. This class and its properties are analogous to additions by GeoDCAT-AP v2.0.0."@en ;
  
  sh:property 
    :Address_Shape_adminUnitL1 ,
    :Address_Shape_adminUnitL2 ,
    :Address_Shape_postCode ,
    :Address_Shape_postName ,
    :Address_Shape_thoroughfare .

#---------------------------------------------------------------------------
# Named Property Shapes - Address (Basic Validation)
#---------------------------------------------------------------------------

:Address_Shape_adminUnitL1
  sh:path locn:adminUnitL1 ;
  sh:nodeKind sh:Literal ;
  sh:maxCount 1 ;
  sh:name "country"@en ;
  sh:description "The country of an Address. Depending on the context, this may be a country name or a country code."@en ;
  sh:message "Country must be a literal and can appear at most once"@en ;
  sh:severity sh:Info .

:Address_Shape_adminUnitL2
  sh:path locn:adminUnitL2 ;
  sh:nodeKind sh:Literal ;
  sh:maxCount 1 ;
  sh:name "administrative area"@en ;
  sh:description "The administrative area of an Address. Depending on the country, this corresponds to a province, a county, a region, or a state."@en ;
  sh:message "Administrative area must be a literal and can appear at most once"@en ;
  sh:severity sh:Info .

:Address_Shape_postCode
  sh:path locn:postCode ;
  sh:nodeKind sh:Literal ;
  sh:maxCount 1 ;
  sh:name "postal code"@en ;
  sh:description "The postal code of an Address."@en ;
  sh:message "Postal code must be a literal and can appear at most once"@en ;
  sh:severity sh:Info .

:Address_Shape_postName
  sh:path locn:postName ;
  sh:nodeKind sh:Literal ;
  sh:maxCount 1 ;
  sh:name "city"@en ;
  sh:description "The city of an Address."@en ;
  sh:message "City must be a literal and can appear at most once"@en ;
  sh:severity sh:Info .

:Address_Shape_thoroughfare
  sh:path locn:thoroughfare ;
  sh:nodeKind sh:Literal ;
  sh:maxCount 1 ;
  sh:name "street address"@en ;
  sh:description "The street name and civic number of an Address."@en ;
  sh:message "Street address must be a literal and can appear at most once"@en ;
  sh:severity sh:Info .

#---------------------------------------------------------------------------
# ASSESSMENT SHAPE - Mobility Extension (Basic Validation)
#---------------------------------------------------------------------------

<https://w3id.org/mobilitydcat-ap/drafts/latest#Assessment_Shape>
  a sh:NodeShape ;
  sh:targetClass mobilitydcatap:Assessment ;
  sh:name "Assessment (mobilityDCAT-AP)"@en ;
  sh:description "An assessment procedure by an external organisation. This organisation may be a National Body in the context of EU Delegated Regulations."@en ;
  
  sh:property 
    :Assessment_Shape_assessmentDate ,
    :Assessment_Shape_assessmentResult .

#---------------------------------------------------------------------------
# Named Property Shapes - Assessment (Basic Validation)
#---------------------------------------------------------------------------

:Assessment_Shape_assessmentDate
  sh:path dct:issued ;
  sh:maxCount 1 ;
  sh:or (
    [ sh:datatype xsd:date ]
    [ sh:datatype xsd:dateTime ]
  ) ;
  sh:name "assessment date"@en ;
  sh:description "The date of the latest assessment procedure."@en ;
  sh:message "Assessment date must be either xsd:date (YYYY-MM-DD) or xsd:dateTime format, and can appear at most once"@en ;
  sh:severity sh:Info .

:Assessment_Shape_assessmentResult
  sh:path oa:hasBody ;
  sh:maxCount 1 ;
  sh:nodeKind sh:IRI ;
  sh:name "assessment result"@en ;
  sh:description "The result of the latest assessment procedure, in form of a URL linking to further details or results. Alternatively, textual information may be provided using the Embedded Textual Body construction of the Web Annotation Data Model."@en ;
  sh:message "Assessment result must be an IRI (URL) and can appear at most once"@en ;
  sh:severity sh:Info .

#---------------------------------------------------------------------------
# CATALOGUE SHAPE - Structural Validation
#---------------------------------------------------------------------------

<https://w3id.org/mobilitydcat-ap/drafts/latest#Catalogue_Shape>
  a sh:NodeShape ;
  sh:targetClass dcat:Catalog ;
  sh:name "Catalogue (mobilityDCAT-AP)"@en ;
  sh:description "Extends DCAT-AP 3.0.1 Catalogue with mobilityDCAT-AP requirements. Overrides cardinality for homepage, spatial, record, and dataset to make them mandatory. Adds identifier and language properties. Properties like description, title, publisher, licence, issued, modified, themeTaxonomy, hasPart, isPartOf are inherited from DCAT-AP 3.0.1."@en ;
  
  sh:property 
    # Cardinality overrides (making things mandatory)
    :Catalogue_Shape_dataset_mandatory ,
    :Catalogue_Shape_homepage_mandatory ,
    :Catalogue_Shape_record_mandatory ,
    :Catalogue_Shape_spatial_mandatory ,
    
    # NEW mobilityDCAT-AP properties
    :Catalogue_Shape_identifier ,
    :Catalogue_Shape_otherIdentifier ,
    :Catalogue_Shape_language ,
    
    # Language tag validation (NEW - Issue #2)
    :Catalogue_Shape_title ,
    :Catalogue_Shape_description .

#---------------------------------------------------------------------------
# Property Shapes - Cardinality Only (NO sh:class)
#---------------------------------------------------------------------------

:Catalogue_Shape_dataset_mandatory
  sh:path dcat:dataset ;
  sh:name "dataset"@en ;
  sh:message "Catalogue must have at least one dataset"@en ;
  sh:severity sh:Violation .

:Catalogue_Shape_homepage_mandatory
  sh:path foaf:homepage ;
  sh:minCount 1 ;
  sh:maxCount 1 ;
  sh:nodeKind sh:IRI ;
  sh:name "homepage"@en ;
  sh:message "Homepage is mandatory and there must be exactly one"@en ;
  sh:severity sh:Violation .

:Catalogue_Shape_record_mandatory
  sh:path dcat:record ;
  sh:minCount 1 ;
  sh:name "catalogue record"@en ;
  sh:message "Catalogue must have at least one catalogue record"@en ;
  sh:severity sh:Violation .

:Catalogue_Shape_spatial_mandatory
  sh:path dct:spatial ;
  sh:minCount 1 ;
  sh:name "spatial coverage"@en ;
  sh:message "Spatial coverage is mandatory for Catalogue"@en ;
  sh:severity sh:Violation .

:Catalogue_Shape_identifier
  sh:path dct:identifier ;
  sh:nodeKind sh:Literal ;
  sh:name "identifier"@en ;
  sh:message "Identifier is mandatory"@en ;
  sh:severity sh:Info .

:Catalogue_Shape_otherIdentifier
  sh:path adms:identifier ;
  sh:nodeKind sh:BlankNodeOrIRI ;
  sh:name "other identifier"@en ;
  sh:severity sh:Info .

:Catalogue_Shape_language
  sh:path dct:language ;
  sh:nodeKind sh:IRI ;
  sh:or (
    [ sh:class dct:LinguisticSystem ]
    [ sh:pattern "^http://publications\\.europa\\.eu/resource/authority/language/.+$" ]
  ) ;
  sh:name "language"@en ;
  sh:message "Language must be either a dct:LinguisticSystem instance or a URI from the EU language authority table"@en ;
  sh:severity sh:Info .

#---------------------------------------------------------------------------
# Language Tag Validation (ADDRESSES ISSUE #2)
#---------------------------------------------------------------------------

:Catalogue_Shape_title
  sh:path dct:title ;
  sh:minCount 1 ;
  sh:nodeKind sh:Literal ;
  sh:languageIn ("bg" "cs" "da" "de" "el" "en" "es" "et" "fi" "fr" "ga" "hr" "hu" "it" "lt" "lv" "mt" "nl" "pl" "pt" "ro" "sk" "sl" "sv") ;
  sh:uniqueLang true ;
  sh:minLength 1 ;
  sh:name "title"@en ;
  sh:description "A name given to the Catalogue. Must have valid EU language tag, cannot be empty, each language can appear only once (§8)."@en ;
  sh:message "Title is mandatory, must have a valid EU language tag (BCP47), cannot be empty, and each language can appear only once"@en ;
  sh:severity sh:Violation .

:Catalogue_Shape_description
  sh:path dct:description ;
  sh:minCount 1 ;
  sh:nodeKind sh:Literal ;
  sh:languageIn ("bg" "cs" "da" "de" "el" "en" "es" "et" "fi" "fr" "ga" "hr" "hu" "it" "lt" "lv" "mt" "nl" "pl" "pt" "ro" "sk" "sl" "sv") ;
  sh:uniqueLang true ;
  sh:minLength 1 ;
  sh:name "description"@en ;
  sh:description "A free-text account of the Catalogue. Must have valid EU language tag, cannot be empty, each language can appear only once (§8)."@en ;
  sh:message "Description is mandatory, must have a valid EU language tag (BCP47), cannot be empty, and each language can appear only once"@en ;
  sh:severity sh:Violation .

#---------------------------------------------------------------------------
# CATALOGUE RECORD SHAPE - Mobility Extensions (Basic Validation)
#---------------------------------------------------------------------------

<https://w3id.org/mobilitydcat-ap/drafts/latest#CatalogueRecord_Shape>
  a sh:NodeShape ;
  sh:targetClass dcat:CatalogRecord ;
  sh:name "Catalogue Record (mobilityDCAT-AP)"@en ;
  sh:description "Extends DCAT-AP 3.0.1 Catalogue Record with mobilityDCAT-AP requirements. Adds creation date and publisher properties. Makes language mandatory. Properties like modification date, primary topic, and source metadata are inherited from DCAT-AP 3.0.1."@en ;
  
  # Cardinality override
  sh:property 
    :CatalogueRecord_Shape_language_mandatory ,
    
  # NEW properties
    :CatalogueRecord_Shape_creationDate ,
    :CatalogueRecord_Shape_publisher .

#---------------------------------------------------------------------------
# Cardinality Override (NO sh:class)
#---------------------------------------------------------------------------

:CatalogueRecord_Shape_language_mandatory
  sh:path dct:language ;
  sh:minCount 1 ;
  sh:name "language (mandatory)"@en ;
  sh:description "Language is mandatory in mobilityDCAT-AP (changed from optional in DCAT-AP 3.0.1). Refers to a language used in the textual metadata. The sh:class constraint is inherited from DCAT-AP ranges."@en ;
  sh:message "Language is mandatory. At least one language must be provided"@en ;
  sh:severity sh:Violation .

#---------------------------------------------------------------------------
# NEW Properties (Basic Validation)
#---------------------------------------------------------------------------

:CatalogueRecord_Shape_creationDate
  sh:path dct:created ;
  sh:minCount 1 ;
  sh:maxCount 1 ;
  sh:or (
    [ sh:datatype xsd:date ]
    [ sh:datatype xsd:dateTime ]
  ) ;
  sh:name "creation date"@en ;
  sh:description "The date stamp when the metadata entry was created for the first time. Should be generated by the system. This property is analogous to an addition by GeoDCAT-AP v2.0.0."@en ;
  sh:message "Creation date is mandatory. Exactly one creation date must be provided as xsd:date or xsd:dateTime"@en ;
  sh:severity sh:Violation .

:CatalogueRecord_Shape_publisher
  sh:path dct:publisher ;
  sh:nodeKind sh:BlankNodeOrIRI ;
  sh:maxCount 1 ;
  sh:name "publisher"@en ;
  sh:description "An entity (organisation or person) responsible for creation and maintenance of the metadata entry. This property is analogous to an addition by GeoDCAT-AP v2.0.0."@en ;
  sh:message "Publisher must be a blank node or IRI and can appear at most once"@en ;
  sh:severity sh:Info .

#---------------------------------------------------------------------------
# CATEGORY SHAPE - Mobility Extension (Basic Validation)
#---------------------------------------------------------------------------

<https://w3id.org/mobilitydcat-ap/drafts/latest#Category_Shape>
  a sh:NodeShape ;
  sh:targetClass skos:Concept ;
  sh:name "Category (mobilityDCAT-AP)"@en ;
  sh:description "A category of a dataset, i.e. a specific subject, theme, or class about its content. This class is typically used in the context of dcat:theme. This is a mobilityDCAT-AP extension - NOT defined in DCAT-AP 3.0.1."@en ;
  
  sh:property 
    :Category_Shape_prefLabel ,
    :Category_Shape_inScheme .

#---------------------------------------------------------------------------
# Named Property Shapes - Category (Basic Validation)
#---------------------------------------------------------------------------

:Category_Shape_prefLabel
  sh:path skos:prefLabel ;
  sh:minCount 1 ;
  sh:nodeKind sh:Literal ;
  sh:name "preferred label"@en ;
  sh:description "A preferred label of the Category. This property can be repeated for parallel language versions of the label."@en ;
  sh:message "Preferred label is mandatory. At least one preferred label must be provided as a literal"@en ;
  sh:severity sh:Violation .

:Category_Shape_inScheme
  sh:path skos:inScheme ;
  sh:maxCount 1 ;
  sh:nodeKind sh:BlankNodeOrIRI ;
  sh:name "category scheme"@en ;
  sh:description "The Category Scheme to which the Category belongs. This property is analogous to an addition by GeoDCAT-AP v2.0.0."@en ;
  sh:message "Category scheme must be a blank node or IRI and can appear at most once"@en ;
  sh:severity sh:Violation .

#---------------------------------------------------------------------------
# CATEGORY SCHEME SHAPE - Mobility Extension (Basic Validation)
#---------------------------------------------------------------------------

<https://w3id.org/mobilitydcat-ap/drafts/latest#CategoryScheme_Shape>
  a sh:NodeShape ;
  sh:targetClass skos:ConceptScheme ;
  sh:name "Category Scheme (mobilityDCAT-AP)"@en ;
  sh:description "A categorisation scheme (classification or taxonomy) listing all potential categories. The class skos:ConceptScheme exists in DCAT-AP 3.0.1 but has no properties defined. mobilityDCAT-AP extends it by adding the mandatory title property."@en ;
  
  sh:property 
    :CategoryScheme_Shape_title .

#---------------------------------------------------------------------------
# Named Property Shapes - Category Scheme (Basic Validation)
#---------------------------------------------------------------------------

:CategoryScheme_Shape_title
  sh:path dct:title ;
  sh:minCount 1 ;
  sh:nodeKind sh:Literal ;
  sh:name "title"@en ;
  sh:description "A name of the Category Scheme. May be repeated for different versions of the name."@en ;
  sh:message "Title is mandatory. At least one title must be provided as a literal"@en ;
  sh:severity sh:Violation .

#---------------------------------------------------------------------------
# DATASET SHAPE - Mobility Extensions (Basic Validation)
#---------------------------------------------------------------------------
<https://w3id.org/mobilitydcat-ap/drafts/latest#Dataset_Shape>
  a sh:NodeShape ;
  sh:targetClass dcat:Dataset ;
  sh:name "Dataset (mobilityDCAT-AP)"@en ;
  sh:description "Extends DCAT-AP 3.0.1 Dataset with mobilityDCAT-AP requirements. Properties like identifier, issued, modified are fully inherited from DCAT-AP 3.0.1 and not redefined here."@en ;
  
  sh:property 
    # === MANDATORY PROPERTIES (§4.10.1) ===
    :Dataset_Shape_description ,
    :Dataset_Shape_distribution ,
    :Dataset_Shape_accrualPeriodicity ,
    :Dataset_Shape_mobilityTheme ,
    :Dataset_Shape_spatial ,
    :Dataset_Shape_title ,
    :Dataset_Shape_publisher ,
    
    # === RECOMMENDED PROPERTIES (§4.10.2) ===
    :Dataset_Shape_georeferencingMethod ,
    :Dataset_Shape_contactPoint ,
    :Dataset_Shape_keyword ,
    :Dataset_Shape_networkCoverage ,
    :Dataset_Shape_referenceSystem ,
    :Dataset_Shape_rightsHolder ,
    :Dataset_Shape_theme ,
    :Dataset_Shape_temporal ,
    :Dataset_Shape_transportMode ,
    :Dataset_Shape_inSeries ,
    :Dataset_Shape_page ,
    :Dataset_Shape_source ,
    
    # === OPTIONAL PROPERTIES (§4.10.3) ===
    :Dataset_Shape_applicableLegislation ,
    :Dataset_Shape_assessmentResult ,
    :Dataset_Shape_hasVersion ,
    :Dataset_Shape_identifier ,
    :Dataset_Shape_intendedInformationService ,
    :Dataset_Shape_isReferencedBy ,
    :Dataset_Shape_language ,
    :Dataset_Shape_otherIdentifier ,
    :Dataset_Shape_relation ,
    :Dataset_Shape_issued ,
    :Dataset_Shape_modified ,
    :Dataset_Shape_version ,
    :Dataset_Shape_versionNotes ,
    :Dataset_Shape_hasQualityAnnotation .

#---------------------------------------------------------------------------
# MANDATORY PROPERTIES - Named Shapes (§4.10.1)
#---------------------------------------------------------------------------

:Dataset_Shape_description
  sh:path dct:description ;
  sh:minCount 1 ;
  sh:nodeKind sh:Literal ;
  sh:languageIn ("bg" "cs" "da" "de" "el" "en" "es" "et" "fi" "fr" "ga" "hr" "hu" "it" "lt" "lv" "mt" "nl" "pl" "pt" "ro" "sk" "sl" "sv") ;
  sh:uniqueLang true ;
  sh:minLength 1 ;
  sh:name "description"@en ;
  sh:description "This property contains more information about the dataset as a brief, free-text description. This property can be repeated for parallel language versions of the description (§8)."@en ;
  sh:message "Description is mandatory, must have a valid EU language tag, cannot be empty, and each language can appear only once"@en ;
  sh:severity sh:Violation .

:Dataset_Shape_distribution
  sh:path dcat:distribution ;
  sh:minCount 1 ;
  sh:nodeKind sh:BlankNodeOrIRI ;
  sh:name "dataset distribution"@en ;
  sh:description "This property links the dataset to an available distribution. In mobilityDCAT-AP, it is mandatory that each dataset has at least one distribution."@en ;
  sh:message "Distribution is mandatory. At least one distribution must be provided"@en ;
  sh:severity sh:Violation .

:Dataset_Shape_accrualPeriodicity
  sh:path dct:accrualPeriodicity ;
  sh:minCount 1 ;
  sh:maxCount 1 ;
  sh:nodeKind sh:IRI ;
  sh:or (
    [ sh:pattern "^http://publications\\.europa\\.eu/resource/authority/frequency/.+$" ]
    [ sh:pattern "^https://w3id\\.org/mobilitydcat-ap/update-frequency/.+$" ]
  ) ;
  sh:name "frequency"@en ;
  sh:description "This property describes how often the delivered content is updated. The obligation of this property is raised to 'mandatory' in mobilityDCAT-AP (§4.10.1)."@en ;
  sh:message "Frequency is mandatory. Exactly one value from EU Frequency vocabulary (http://publications.europa.eu/resource/authority/frequency/*) or mobilityDCAT-AP update-frequency vocabulary must be provided"@en ;
  sh:severity sh:Violation .

:Dataset_Shape_mobilityTheme
  sh:path mobilitydcatap:mobilityTheme ;
  sh:minCount 1 ;
  sh:nodeKind sh:IRI ;
  sh:pattern "^https://w3id\\.org/mobilitydcat-ap/mobility-theme/.+$" ;
  sh:name "mobility theme"@en ;
  sh:description "This property refers to the mobility-related theme (i.e., a specific subject, category, or type) of the delivered content. A dataset may be associated with multiple themes (§4.10.1)."@en ;
  sh:message "Mobility theme is mandatory. At least one theme from the controlled vocabulary (https://w3id.org/mobilitydcat-ap/mobility-theme/*) must be provided"@en ;
  sh:severity sh:Violation .

:Dataset_Shape_spatial
  sh:path dct:spatial ;
  sh:minCount 1 ;
  sh:nodeKind sh:BlankNodeOrIRI ;
  sh:name "spatial / geographic coverage"@en ;
  sh:description "This property refers to a geographic region that is covered by the delivered content. The obligation of this property is raised to 'mandatory' in mobilityDCAT-AP (§4.10.1)."@en ;
  sh:message "Spatial coverage is mandatory. At least one geographical area must be provided"@en ;
  sh:severity sh:Violation .

:Dataset_Shape_title
  sh:path dct:title ;
  sh:minCount 1 ;
  sh:nodeKind sh:Literal ;
  sh:uniqueLang true ;
  sh:minLength 1 ;
  sh:name "title"@en ;
  sh:description "This property contains a name given to the dataset in a generic term. The name should be a meaningful, unique and unambiguous label. This property can be repeated for parallel language versions (§8)."@en ;
  sh:message "Title is mandatory, must have a valid EU language tag (e.g., @en), cannot be empty, and each language can appear only once"@en ;
  sh:severity sh:Violation .

:Dataset_Shape_publisher
  sh:path dct:publisher ;
  sh:minCount 1 ;
  sh:maxCount 1 ;
  sh:nodeKind sh:BlankNodeOrIRI ;
  sh:name "publisher"@en ;
  sh:description "This property refers to an entity (company and person) that publishes the corresponding dataset. The obligation of this property is raised to 'mandatory' in mobilityDCAT-AP (§4.10.1)."@en ;
  sh:message "Publisher is mandatory. Exactly one publisher must be provided"@en ;
  sh:severity sh:Violation .

#---------------------------------------------------------------------------
# RECOMMENDED PROPERTIES - Named Shapes (§4.10.2)
#---------------------------------------------------------------------------

:Dataset_Shape_georeferencingMethod
  sh:path mobilitydcatap:georeferencingMethod ;
  sh:nodeKind sh:IRI ;
  sh:pattern "^https://w3id\\.org/mobilitydcat-ap/georeferencing-method/.+$" ;
  sh:name "georeferencing method"@en ;
  sh:description "This property SHOULD be used to specify the georeferencing method used in the dataset (§4.10.2)."@en ;
  sh:message "Georeferencing method must be from the controlled vocabulary (https://w3id.org/mobilitydcat-ap/georeferencing-method/*)"@en ;
  sh:severity sh:Warning .

:Dataset_Shape_contactPoint
  sh:path dcat:contactPoint ;
  sh:nodeKind sh:BlankNodeOrIRI ;
  sh:name "contact point"@en ;
  sh:description "This property contains contact information that can be used for communication with a company or person responsible for the dataset (§4.10.2)."@en ;
  sh:message "Contact point must be a blank node or IRI"@en ;
  sh:severity sh:Warning .

:Dataset_Shape_keyword
  sh:path dcat:keyword ;
  sh:nodeKind sh:Literal ;
  sh:languageIn ("bg" "cs" "da" "de" "el" "en" "es" "et" "fi" "fr" "ga" "hr" "hu" "it" "lt" "lv" "mt" "nl" "pl" "pt" "ro" "sk" "sl" "sv") ;
  sh:minLength 1 ;
  sh:name "keyword / tag"@en ;
  sh:description "This property contains a keyword or tag describing the Dataset (§4.10.2)."@en ;
  sh:message "Keywords must have valid EU language tags and cannot be empty"@en ;
  sh:severity sh:Warning .

:Dataset_Shape_networkCoverage
  sh:path mobilitydcatap:networkCoverage ;
  sh:nodeKind sh:IRI ;
  sh:pattern "^https://w3id\\.org/mobilitydcat-ap/network-coverage/.+$" ;
  sh:name "network coverage"@en ;
  sh:description "This property describes the part of the transport network that is covered by the delivered content (§4.10.2)."@en ;
  sh:message "Network coverage must be from the controlled vocabulary (https://w3id.org/mobilitydcat-ap/network-coverage/*)"@en ;
  sh:severity sh:Warning .

:Dataset_Shape_referenceSystem
  sh:path geodcatap:referenceSystem ;
  sh:nodeKind sh:IRI ;
  sh:pattern "^http://www\\.opengis\\.net/def/crs/EPSG/0/.+$" ;
  sh:name "reference system"@en ;
  sh:description "The spatial reference system used in the delivered content. To be specified via the EPSG coordinate reference systems register operated by OGC."@en ;
  sh:message "Reference system must be from the OGC EPSG register (http://www.opengis.net/def/crs/EPSG/0/*)"@en ;
  sh:severity sh:Info .

:Dataset_Shape_rightsHolder
  sh:path dct:rightsHolder ;
  sh:nodeKind sh:BlankNodeOrIRI ;
  sh:name "rights holder"@en ;
  sh:description "This property refers to an entity that legally owns or holds the rights of the data provided in a dataset (§4.10.2)."@en ;
  sh:message "Rights holder must be a blank node or IRI"@en ;
  sh:severity sh:Warning .

:Dataset_Shape_theme
  sh:path dcat:theme ;
  sh:nodeKind sh:IRI ;
  sh:pattern "^http://publications\\.europa\\.eu/resource/authority/data-theme/.+$" ;
  sh:name "theme / category"@en ;
  sh:description "This property refers to the generic theme (i.e., a specific subject, category, or type) of the delivered content. The category is described via a controlled vocabulary 'Data Themes' by the Publications Office of the European Union (§4.10.2)."@en ;
  sh:message "Theme must be from the EU Data Themes vocabulary (http://publications.europa.eu/resource/authority/data-theme/*)"@en ;
  sh:severity sh:Warning .

:Dataset_Shape_temporal
  sh:path dct:temporal ;
  sh:nodeKind sh:BlankNodeOrIRI ;
  sh:name "temporal coverage"@en ;
  sh:description "This property refers to a temporal period, i.e., the beginning and the end, of the time reference of the delivered content (§4.10.2)."@en ;
  sh:message "Temporal coverage must be a blank node or IRI"@en ;
  sh:severity sh:Warning .

:Dataset_Shape_transportMode
  sh:path mobilitydcatap:transportMode ;
  sh:nodeKind sh:IRI ;
  sh:pattern "^https://w3id\\.org/mobilitydcat-ap/transport-mode/.+$" ;
  sh:name "transport mode"@en ;
  sh:description "This property describes the transport mode that is covered by the delivered content (§4.10.2)."@en ;
  sh:message "Transport mode must be from the controlled vocabulary (https://w3id.org/mobilitydcat-ap/transport-mode/*)"@en ;
  sh:severity sh:Warning .

:Dataset_Shape_inSeries
  sh:path dcat:inSeries ;
  sh:nodeKind sh:IRI ;
  sh:name "in series"@en ;
  sh:severity sh:Info .

:Dataset_Shape_page
  sh:path foaf:page ;
  sh:nodeKind sh:IRI ;
  sh:name "documentation"@en ;
  sh:severity sh:Info .

:Dataset_Shape_source
  sh:path dct:source ;
  sh:nodeKind sh:BlankNodeOrIRI ;
  sh:name "source"@en ;
  sh:severity sh:Info .

#---------------------------------------------------------------------------
# OPTIONAL PROPERTIES - Named Shapes (§4.10.3)
#---------------------------------------------------------------------------

:Dataset_Shape_applicableLegislation
  sh:path dcatap:applicableLegislation ;
  sh:nodeKind sh:IRI ;
  sh:name "applicable legislation"@en ;
  sh:description "This property MAY refer to one or several legal frameworks being relevant for the dataset (§4.10.3)."@en ;
  sh:message "Applicable legislation must be an IRI"@en ;
  sh:severity sh:Info .

:Dataset_Shape_assessmentResult
  sh:path mobilitydcatap:assessmentResult ;
  sh:maxCount 1 ;
  sh:nodeKind sh:BlankNodeOrIRI ;
  sh:name "assessment result"@en ;
  sh:description "This property MAY refer to the results and outcomes from an assessment process by some organisation (§4.10.3)."@en ;
  sh:message "Assessment result must be a blank node or IRI and can appear at most once"@en ;
  sh:severity sh:Info .

:Dataset_Shape_hasVersion
  sh:path dcat:hasVersion ;
  sh:nodeKind sh:BlankNodeOrIRI ;
  sh:name "has version"@en ;
  sh:description "This property MAY refer to a related dataset that is a version, edition, or adaptation of the described dataset (§4.10.3)."@en ;
  sh:message "Has version must be a blank node or IRI"@en ;
  sh:severity sh:Info .

:Dataset_Shape_identifier
  sh:path dct:identifier ;
  sh:maxCount 1 ;
  sh:nodeKind sh:Literal ;
  sh:name "identifier"@en ;
  sh:description "This property MAY contain an identifier for the dataset. This property SHOULD be populated by the URI used within the RDF statement (§4.10.3)."@en ;
  sh:message "Identifier must be a literal and can appear at most once"@en ;
  sh:severity sh:Info .

:Dataset_Shape_intendedInformationService
  sh:path mobilitydcatap:intendedInformationService ;
  sh:nodeKind sh:IRI ;
  sh:pattern "^https://w3id\\.org/mobilitydcat-ap/intended-information-service/.+$" ;
  sh:name "intended information service"@en ;
  sh:description "This property MAY describe predefined information services, which the data content is intended to support (§4.10.3)."@en ;
  sh:message "Intended information service must be from the controlled vocabulary (https://w3id.org/mobilitydcat-ap/intended-information-service/*)"@en ;
  sh:severity sh:Info .

:Dataset_Shape_isReferencedBy
  sh:path dct:isReferencedBy ;
  sh:nodeKind sh:IRI ;
  sh:name "is referenced by"@en ;
  sh:description "This property MAY reference, cite, or otherwise point to another, related dataset (§4.10.3)."@en ;
  sh:message "Is referenced by must be an IRI"@en ;
  sh:severity sh:Info .

:Dataset_Shape_language
  sh:path dct:language ;
  sh:nodeKind sh:IRI ;
  sh:or (
    [ sh:class dct:LinguisticSystem ]
    [ sh:pattern "^http://publications\\.europa\\.eu/resource/authority/language/.+$" ]
  ) ;
  sh:name "language"@en ;
  sh:message "Language must be either a dct:LinguisticSystem instance or a URI from the EU language authority table"@en ;
  sh:severity sh:Info .

:Dataset_Shape_otherIdentifier
  sh:path adms:identifier ;
  sh:nodeKind sh:BlankNodeOrIRI ;
  sh:name "other identifier"@en ;
  sh:description "This property MAY be used as an additional identifier, besides dct:identifier (§4.10.3)."@en ;
  sh:message "Other identifier must be a blank node or IRI"@en ;
  sh:severity sh:Info .

:Dataset_Shape_relation
  sh:path dct:relation ;
  sh:nodeKind sh:IRI ;
  sh:name "related resource"@en ;
  sh:description "This property MAY reference, cite, or otherwise point to another, related dataset (§4.10.3)."@en ;
  sh:message "Related resource must be an IRI"@en ;
  sh:severity sh:Info .

:Dataset_Shape_issued
  sh:path dct:issued ;
  sh:maxCount 1 ;
  sh:or (
    [ sh:datatype xsd:date ]
    [ sh:datatype xsd:dateTime ]
  ) ;
  sh:name "release date"@en ;
  sh:description "This property contains the date of formal issuance (e.g., publication) of the Dataset (§4.10.3)."@en ;
  sh:message "Release date must be either xsd:date or xsd:dateTime and can appear at most once"@en ;
  sh:severity sh:Info .

:Dataset_Shape_modified
  sh:path dct:modified ;
  sh:maxCount 1 ;
  sh:or (
    [ sh:datatype xsd:date ]
    [ sh:datatype xsd:dateTime ]
  ) ;
  sh:name "update / modification date"@en ;
  sh:description "This property MAY contain the most recent date on which the content of a dataset was changed or modified (§4.10.3)."@en ;
  sh:message "Modification date must be either xsd:date or xsd:dateTime and can appear at most once"@en ;
  sh:severity sh:Info .

:Dataset_Shape_version
  sh:path dcat:version ;
  sh:maxCount 1 ;
  sh:nodeKind sh:Literal ;
  sh:name "version"@en ;
  sh:description "This property MAY contain a version number or other version designation of the dataset (§4.10.3)."@en ;
  sh:message "Version must be a literal and can appear at most once"@en ;
  sh:severity sh:Info .

:Dataset_Shape_versionNotes
  sh:path adms:versionNotes ;
  sh:nodeKind sh:Literal ;
  sh:name "version notes"@en ;
  sh:description "This property MAY contain a textual description of the differences between this version and a previous version of the dataset (§4.10.3)."@en ;
  sh:message "Version notes must be a literal"@en ;
  sh:severity sh:Info .

:Dataset_Shape_hasQualityAnnotation
  sh:path dqv:hasQualityAnnotation ;
  sh:nodeKind sh:BlankNodeOrIRI ;
  sh:name "quality description"@en ;
  sh:description "This property MAY describe any quality aspects regarding the delivered content (§4.10.3)."@en ;
  sh:message "Quality annotation must be a blank node or IRI"@en ;
  sh:severity sh:Info .

#---------------------------------------------------------------------------
# DATASET SERIES SHAPE - New in v3.0.0 (§7.6)
#---------------------------------------------------------------------------
<https://w3id.org/mobilitydcat-ap/drafts/latest#DatasetSeries_Shape>
  a sh:NodeShape ;
  sh:targetClass dcat:DatasetSeries ;
  sh:name "Dataset Series (mobilityDCAT-AP)"@en ;
  sh:description "A collection of datasets published separately but sharing common characteristics. New in mobilityDCAT-AP v3.0.0."@en ;

  sh:property
    :DatasetSeries_Shape_description ,
    :DatasetSeries_Shape_publisher ,
    :DatasetSeries_Shape_title ,
    :DatasetSeries_Shape_contactPoint ,
    :DatasetSeries_Shape_spatial ,
    :DatasetSeries_Shape_temporal ,
    :DatasetSeries_Shape_mobilityTheme ,
    :DatasetSeries_Shape_applicableLegislation ,
    :DatasetSeries_Shape_modified ,
    :DatasetSeries_Shape_issued .

:DatasetSeries_Shape_description
  sh:path dct:description ;
  sh:minCount 1 ;
  sh:nodeKind sh:Literal ;
  sh:languageIn ("bg" "cs" "da" "de" "el" "en" "es" "et" "fi" "fr" "ga" "hr" "hu" "it" "lt" "lv" "mt" "nl" "pl" "pt" "ro" "sk" "sl" "sv") ;
  sh:uniqueLang true ;
  sh:minLength 1 ;
  sh:name "description"@en ;
  sh:message "Description is mandatory, must have a valid EU language tag, cannot be empty, and each language can appear only once"@en ;
  sh:severity sh:Violation .

:DatasetSeries_Shape_publisher
  sh:path dct:publisher ;
  sh:minCount 1 ;
  sh:maxCount 1 ;
  sh:nodeKind sh:BlankNodeOrIRI ;
  sh:name "publisher"@en ;
  sh:message "Publisher is mandatory. Exactly one publisher must be provided"@en ;
  sh:severity sh:Violation .

:DatasetSeries_Shape_title
  sh:path dct:title ;
  sh:minCount 1 ;
  sh:nodeKind sh:Literal ;
  sh:uniqueLang true ;
  sh:minLength 1 ;
  sh:name "title"@en ;
  sh:message "Title is mandatory, must have a valid EU language tag, cannot be empty, and each language can appear only once"@en ;
  sh:severity sh:Violation .

:DatasetSeries_Shape_contactPoint
  sh:path dcat:contactPoint ;
  sh:nodeKind sh:BlankNodeOrIRI ;
  sh:name "contact point"@en ;
  sh:severity sh:Info .

:DatasetSeries_Shape_spatial
  sh:path dct:spatial ;
  sh:nodeKind sh:BlankNodeOrIRI ;
  sh:name "geographical coverage"@en ;
  sh:severity sh:Info .

:DatasetSeries_Shape_temporal
  sh:path dct:temporal ;
  sh:nodeKind sh:BlankNodeOrIRI ;
  sh:name "temporal coverage"@en ;
  sh:severity sh:Info .

:DatasetSeries_Shape_mobilityTheme
  sh:path mobilitydcatap:mobilityTheme ;
  sh:nodeKind sh:IRI ;
  sh:pattern "^https://w3id\\.org/mobilitydcat-ap/mobility-theme/.+$" ;
  sh:name "mobility theme"@en ;
  sh:severity sh:Info .

:DatasetSeries_Shape_applicableLegislation
  sh:path dcatap:applicableLegislation ;
  sh:nodeKind sh:IRI ;
  sh:name "applicable legislation"@en ;
  sh:severity sh:Info .

:DatasetSeries_Shape_modified
  sh:path dct:modified ;
  sh:maxCount 1 ;
  sh:or ( [ sh:datatype xsd:date ] [ sh:datatype xsd:dateTime ] ) ;
  sh:name "modification date"@en ;
  sh:severity sh:Info .

:DatasetSeries_Shape_issued
  sh:path dct:issued ;
  sh:maxCount 1 ;
  sh:or ( [ sh:datatype xsd:date ] [ sh:datatype xsd:dateTime ] ) ;
  sh:name "release date"@en ;
  sh:severity sh:Info .

#---------------------------------------------------------------------------
# KIND SHAPE - vcard:Kind (§7.8)
#---------------------------------------------------------------------------
<https://w3id.org/mobilitydcat-ap/drafts/latest#Kind_Shape>
  a sh:NodeShape ;
  sh:targetClass vcard:Kind ;
  sh:name "Kind (mobilityDCAT-AP)"@en ;
  sh:description "Contact information following the VCARD-RDF specification. vcard:fn and vcard:hasEmail are mandatory."@en ;

  sh:property
    :Kind_Shape_email ,
    :Kind_Shape_name ,
    :Kind_Shape_address ,
    :Kind_Shape_affiliation ,
    :Kind_Shape_phone ,
    :Kind_Shape_url .

:Kind_Shape_email
  sh:path vcard:hasEmail ;
  sh:minCount 1 ;
  sh:maxCount 1 ;
  sh:nodeKind sh:IRI ;
  sh:name "email"@en ;
  sh:message "Email is mandatory. Exactly one email must be provided as an IRI (mailto: scheme)"@en ;
  sh:severity sh:Violation .

:Kind_Shape_name
  sh:path vcard:fn ;
  sh:minCount 1 ;
  sh:maxCount 1 ;
  sh:nodeKind sh:Literal ;
  sh:name "name"@en ;
  sh:message "Name is mandatory. Exactly one name must be provided as a literal"@en ;
  sh:severity sh:Violation .

:Kind_Shape_address
  sh:path vcard:hasAddress ;
  sh:maxCount 1 ;
  sh:nodeKind sh:BlankNodeOrIRI ;
  sh:name "address"@en ;
  sh:severity sh:Info .

:Kind_Shape_affiliation
  sh:path vcard:organization-name ;
  sh:maxCount 1 ;
  sh:nodeKind sh:Literal ;
  sh:name "affiliation"@en ;
  sh:severity sh:Info .

:Kind_Shape_phone
  sh:path vcard:hasTelephone ;
  sh:nodeKind sh:IRI ;
  sh:name "phone"@en ;
  sh:severity sh:Info .

:Kind_Shape_url
  sh:path vcard:hasURL ;
  sh:nodeKind sh:IRI ;
  sh:name "URL"@en ;
  sh:severity sh:Info .

#---------------------------------------------------------------------------
# RIGHTS STATEMENT SHAPE - dct:RightsStatement (§8.17)
#---------------------------------------------------------------------------
<https://w3id.org/mobilitydcat-ap/drafts/latest#RightsStatement_Shape>
  a sh:NodeShape ;
  sh:targetClass dct:RightsStatement ;
  sh:name "Rights Statement (mobilityDCAT-AP)"@en ;
  sh:description "A statement about intellectual property rights. dct:type (conditions for access and usage) is mandatory."@en ;

  sh:property
    :RightsStatement_Shape_type ,
    :RightsStatement_Shape_description .

:RightsStatement_Shape_type
  sh:path dct:type ;
  sh:minCount 1 ;
  sh:nodeKind sh:IRI ;
  sh:pattern "^https://w3id\\.org/mobilitydcat-ap/conditions-for-access-and-usage/.+$" ;
  sh:name "conditions for access and usage"@en ;
  sh:message "Conditions for access and usage is mandatory. Must be from the mobilityDCAT-AP controlled vocabulary"@en ;
  sh:severity sh:Violation .

:RightsStatement_Shape_description
  sh:path dct:description ;
  sh:nodeKind sh:Literal ;
  sh:name "rights statement text"@en ;
  sh:severity sh:Info .

#---------------------------------------------------------------------------
# LICENSE DOCUMENT SHAPE - dct:LicenseDocument (§7.9)
#---------------------------------------------------------------------------
<https://w3id.org/mobilitydcat-ap/drafts/latest#LicenseDocument_Shape>
  a sh:NodeShape ;
  sh:targetClass dct:LicenseDocument ;
  sh:name "Licence Document (mobilityDCAT-AP)"@en ;
  sh:description "A legal document giving official permission to do something with a resource."@en ;

  sh:property
    :LicenseDocument_Shape_identifier ,
    :LicenseDocument_Shape_label .

:LicenseDocument_Shape_identifier
  sh:path dct:identifier ;
  sh:maxCount 1 ;
  sh:nodeKind sh:IRI ;
  sh:name "standard licence"@en ;
  sh:message "Standard licence must be an IRI from the EU Licence vocabulary and can appear at most once"@en ;
  sh:severity sh:Info .

:LicenseDocument_Shape_label
  sh:path rdfs:label ;
  sh:nodeKind sh:Literal ;
  sh:name "licence text"@en ;
  sh:severity sh:Info .

#---------------------------------------------------------------------------
# DISTRIBUTION SHAPE - Mobility Extensions (Basic Validation)
#---------------------------------------------------------------------------
<https://w3id.org/mobilitydcat-ap/drafts/latest#Distribution_Shape>
  a sh:NodeShape ;
  sh:targetClass dcat:Distribution ;
  sh:name "Distribution (mobilityDCAT-AP)"@en ;
  
  sh:property 
    :Distribution_Shape_accessURL ,
    :Distribution_Shape_mobilityDataStandard ,
    :Distribution_Shape_format ,
    :Distribution_Shape_rights ,
    :Distribution_Shape_applicationLayerProtocol ,
    :Distribution_Shape_description ,
    :Distribution_Shape_licence ,
    :Distribution_Shape_characterEncoding ,
    :Distribution_Shape_communicationMethod ,
    :Distribution_Shape_dataFormatNotes ,
    :Distribution_Shape_downloadURL ,
    :Distribution_Shape_grammar ,
    :Distribution_Shape_sample ,
    :Distribution_Shape_temporal ,
    :Distribution_Shape_title ,
    :Distribution_Shape_page ,
    :Distribution_Shape_language ,
    :Distribution_Shape_modified ,
    :Distribution_Shape_issued ,
    :Distribution_Shape_status .

#---------------------------------------------------------------------------
# Mandatory Properties (Basic Validation)
#---------------------------------------------------------------------------
:Distribution_Shape_accessURL
  sh:path dcat:accessURL ;
  sh:minCount 1 ;
  sh:maxCount 1 ;
  sh:nodeKind sh:IRI ;
  sh:name "access URL"@en ;
  sh:description "A URL that gives access to a Distribution of the Dataset."@en ;
  sh:message "Access URL is mandatory. Exactly one access URL must be provided as an IRI"@en ;
  sh:severity sh:Violation .

:Distribution_Shape_mobilityDataStandard
  sh:path mobilitydcatap:mobilityDataStandard ;
  sh:minCount 1 ;
  sh:maxCount 1 ;
  sh:or (
    [
      # Option 1: Direct URI from vocabulary
      sh:nodeKind sh:IRI ;
      sh:pattern "^https://w3id\\.org/mobilitydcat-ap/mobility-data-standard/.+$" ;
    ]
    [
      # Option 2: MobilityDataStandard class instance (with version/schema properties)
      sh:class mobilitydcatap:MobilityDataStandard ;
    ]
  ) ;
  sh:name "mobility data standard"@en ;
  sh:description "The mobility data standard applied for the delivered content (§4.18)."@en ;
  sh:message "Mobility data standard is mandatory. Must be either a URI from https://w3id.org/mobilitydcat-ap/mobility-data-standard/ vocabulary OR a mobilitydcatap:MobilityDataStandard instance"@en ;
  sh:severity sh:Violation .

:Distribution_Shape_format
  sh:path dct:format ;
  sh:minCount 1 ;
  sh:maxCount 1 ;
  sh:nodeKind sh:IRI ;
  sh:pattern "^http://publications\\.europa\\.eu/resource/authority/file-type/.+$" ;  
  sh:name "format"@en ;
  sh:description "The technical syntax of the delivered content. Made mandatory in mobilityDCAT-AP (§4.11.1). Must be from EU File Type vocabulary (§5.2)."@en ;
  sh:message "Format is mandatory. Exactly one format from http://publications.europa.eu/resource/authority/file-type/* must be provided"@en ;
  sh:severity sh:Violation .

:Distribution_Shape_rights
  sh:path dct:rights ;
  sh:minCount 1 ;
  sh:maxCount 1 ;
  sh:nodeKind sh:BlankNodeOrIRI ;
  sh:name "rights"@en ;
  sh:description "A Rights Statement about intellectual property rights. Made mandatory in mobilityDCAT-AP (§4.11.1)."@en ;
  sh:message "Rights is mandatory. Exactly one rights statement must be provided"@en ;
  sh:severity sh:Violation .

#---------------------------------------------------------------------------
# Recommended Properties (Basic Validation)
#---------------------------------------------------------------------------
:Distribution_Shape_applicationLayerProtocol
  sh:path mobilitydcatap:applicationLayerProtocol ;
  sh:nodeKind sh:IRI ;  
  sh:maxCount 1 ;
  sh:pattern "^https://w3id\\.org/mobilitydcat-ap/application-layer-protocol/.+$" ;
  sh:name "application layer protocol"@en ;
  sh:description "The transmitting channel (Application Layer Protocol) of the distribution (§4.11.2)."@en ;
  sh:message "Application layer protocol must be from the controlled vocabulary and can appear at most once"@en ;
  sh:severity sh:Warning .

:Distribution_Shape_description
  sh:path dct:description ;
  sh:nodeKind sh:Literal ;
  sh:languageIn ("bg" "cs" "da" "de" "el" "en" "es" "et" "fi" "fr" "ga" "hr" "hu" "it" "lt" "lv" "mt" "nl" "pl" "pt" "ro" "sk" "sl" "sv") ;
  sh:uniqueLang true ;
  sh:minLength 1 ;
  sh:name "description"@en ;
  sh:description "A free-text account of the Distribution. May be repeated for parallel language versions (§4.11.2)."@en ;
  sh:message "Description must have valid EU language tag, cannot be empty, each language only once"@en ;
  sh:severity sh:Warning .

:Distribution_Shape_licence
  sh:path dct:license ;
  sh:maxCount 1 ;
  sh:nodeKind sh:BlankNodeOrIRI ;
  sh:name "licence"@en ;
  sh:description "The licence under which the Distribution is made available (§4.11.2)."@en ;
  sh:message "Licence must be a blank node or IRI and can appear at most once"@en ;
  sh:severity sh:Warning .

#---------------------------------------------------------------------------
# Optional Properties (Basic Validation)
#---------------------------------------------------------------------------

:Distribution_Shape_characterEncoding
  sh:path cnt:characterEncoding ;
  sh:maxCount 1 ;
  sh:nodeKind sh:Literal ;
  sh:name "character encoding"@en ;
  sh:description "The technical encoding format (e.g., UTF-8). This is a mobilityDCAT-AP extension (§4.11.3)."@en ;
  sh:message "Character encoding must be a literal and can appear at most once"@en ;
  sh:severity sh:Info .

:Distribution_Shape_communicationMethod
  sh:path mobilitydcatap:communicationMethod ;
  sh:nodeKind sh:IRI ;  
  sh:maxCount 1 ;
  sh:pattern "^https://w3id\\.org/mobilitydcat-ap/communication-method/.+$" ;
  sh:name "communication method"@en ;
  sh:description "Indicates if the data interface functions in push or pull mode (§4.11.3)."@en ;
  sh:message "Communication method must be from the controlled vocabulary and can appear at most once"@en ;
  sh:severity sh:Info .

:Distribution_Shape_dataFormatNotes
  sh:path mobilitydcatap:dataFormatNotes ;
  sh:nodeKind sh:Literal ;
  sh:name "data format notes"@en ;
  sh:description "Additional textual information about the format (§4.11.3)."@en ;
  sh:message "Data format notes must be a literal and can appear at most once"@en ;
  sh:severity sh:Info .

:Distribution_Shape_downloadURL
  sh:path dcat:downloadURL ;
  sh:nodeKind sh:IRI ;
  sh:name "download URL"@en ;
  sh:description "A URL that is a direct link to a downloadable file in a given format (§4.11.3)."@en ;
  sh:message "Download URL must be an IRI"@en ;
  sh:severity sh:Info .

:Distribution_Shape_grammar
  sh:path mobilitydcatap:grammar ;
  sh:nodeKind sh:IRI ;  
  sh:maxCount 1 ;
  sh:pattern "^https://w3id\\.org/mobilitydcat-ap/grammar/.+$" ;
  sh:name "grammar"@en ;
  sh:description "The technical data grammar format (§4.11.3)."@en ;
  sh:message "Deprecated! Grammar must be from the controlled vocabulary and can appear at most once"@en ;
  sh:severity sh:Info .

:Distribution_Shape_sample
  sh:path adms:sample ;
  sh:nodeKind sh:IRI ;
  sh:name "sample"@en ;
  sh:description "A sample Distribution of the Dataset (§4.11.3)."@en ;
  sh:message "Sample must be an IRI (resource)"@en ;
  sh:severity sh:Info .

:Distribution_Shape_temporal
  sh:path dct:temporal ;
  sh:maxCount 1 ;
  sh:nodeKind sh:BlankNodeOrIRI ;
  sh:name "temporal coverage"@en ;
  sh:description "The time interval when a data service is delivered (§4.11.3)."@en ;
  sh:message "Temporal coverage must be a blank node or IRI and can appear at most once"@en ;
  sh:severity sh:Info .

:Distribution_Shape_title
  sh:path dct:title ;
  sh:nodeKind sh:Literal ;
  sh:languageIn ("bg" "cs" "da" "de" "el" "en" "es" "et" "fi" "fr" "ga" "hr" "hu" "it" "lt" "lv" "mt" "nl" "pl" "pt" "ro" "sk" "sl" "sv") ;
  sh:uniqueLang true ;
  sh:minLength 1 ;
  sh:name "title"@en ;
  sh:description "A name given to the Distribution. May be repeated for parallel language versions (§4.11.3)."@en ;
  sh:message "Title must be a literal"@en ;
  sh:severity sh:Info .

:Distribution_Shape_page
  sh:path foaf:page ;
  sh:nodeKind sh:IRI ;
  sh:name "documentation"@en ;
  sh:severity sh:Info .

:Distribution_Shape_language
  sh:path dct:language ;
  sh:nodeKind sh:IRI ;
  sh:name "language"@en ;
  sh:severity sh:Info .

:Distribution_Shape_modified
  sh:path dct:modified ;
  sh:maxCount 1 ;
  sh:or ( [ sh:datatype xsd:date ] [ sh:datatype xsd:dateTime ] ) ;
  sh:name "modification date"@en ;
  sh:severity sh:Info .

:Distribution_Shape_issued
  sh:path dct:issued ;
  sh:maxCount 1 ;
  sh:or ( [ sh:datatype xsd:date ] [ sh:datatype xsd:dateTime ] ) ;
  sh:name "release date"@en ;
  sh:severity sh:Info .

:Distribution_Shape_status
  sh:path adms:status ;
  sh:maxCount 1 ;
  sh:nodeKind sh:IRI ;
  sh:name "status"@en ;
  sh:severity sh:Info .



#-------------------------------------------------------------------------
# Controlled Vocabulary Declarations (keep as-is)
#-------------------------------------------------------------------------
<https://w3id.org/mobilitydcat-ap/application-layer-protocol> a skos:ConceptScheme ;
  skos:prefLabel "Application layer protocol"@en .

<https://w3id.org/mobilitydcat-ap/communication-method> a skos:ConceptScheme ;
  skos:prefLabel "Communication method"@en .

<https://w3id.org/mobilitydcat-ap/conditions-for-access-and-usage> a skos:ConceptScheme ;
  skos:prefLabel "Conditions for access and usage"@en .

<https://w3id.org/mobilitydcat-ap/mobility-theme> a skos:ConceptScheme ;
  skos:prefLabel "Mobility Theme"@en .

<https://w3id.org/mobilitydcat-ap/mobility-data-standard> a skos:ConceptScheme ;
  skos:prefLabel "Mobility Data Standard"@en .

<https://w3id.org/mobilitydcat-ap/georeferencing-method> a skos:ConceptScheme ;
  skos:prefLabel "Georeferencing Method"@en .

<https://w3id.org/mobilitydcat-ap/grammar> a skos:ConceptScheme ;
  skos:prefLabel "Grammar"@en .

<https://w3id.org/mobilitydcat-ap/network-coverage> a skos:ConceptScheme ;
  skos:prefLabel "Network coverage"@en .

<https://w3id.org/mobilitydcat-ap/intended-information-service> a skos:ConceptScheme ;
  skos:prefLabel "Intended Information Service"@en .

<https://w3id.org/mobilitydcat-ap/transport-mode> a skos:ConceptScheme ;
  skos:prefLabel "Transport mode"@en .

<https://w3id.org/mobilitydcat-ap/update-frequency> a skos:ConceptScheme ;
  skos:prefLabel "Update frequency"@en .

<http://publications.europa.eu/resource/authority/data-theme> a skos:ConceptScheme ;
  skos:prefLabel "Data Themes"@en , "Dataset Theme Vocabulary"@en .

<http://publications.europa.eu/resource/authority/access-right> a skos:ConceptScheme ;
  skos:prefLabel "Access right"@en .

<http://publications.europa.eu/resource/authority/frequency> a skos:ConceptScheme ;
  skos:prefLabel "Frequency"@en .

<http://www.opengis.net/def/crs/EPSG/0/> a skos:ConceptScheme ;
  skos:prefLabel "OGC EPSG Coordinate Reference Systems Register"@en .

<http://publications.europa.eu/resource/authority/file-type> a skos:ConceptScheme ;
  skos:prefLabel "File Type"@en .

<http://publications.europa.eu/resource/authority/language> a skos:ConceptScheme ;
  skos:prefLabel "Language"@en .

<http://publications.europa.eu/resource/authority/corporate-body> a skos:ConceptScheme ;
  skos:prefLabel "Corporate body"@en .

<http://publications.europa.eu/resource/authority/continent> a skos:ConceptScheme ;
  skos:prefLabel "Continents"@en .

<http://publications.europa.eu/resource/authority/country> a skos:ConceptScheme ;
  skos:prefLabel "Countries"@en .

<http://publications.europa.eu/resource/authority/place> a skos:ConceptScheme ;
  skos:prefLabel "Places"@en .

<http://sws.geonames.org/> a skos:ConceptScheme ;
  skos:prefLabel "GeoNames"@en .

<http://nuts.geovocab.org/> a skos:ConceptScheme ;
  skos:prefLabel "NUTS (Nomenclature of Territorial Units for Statistics)"@en .

<http://purl.org/adms/publishertype/> a skos:ConceptScheme ;
  skos:prefLabel "ADMS publisher type"@en .

<https://eur-lex.europa.eu/eli-register/eu_publications_office.html> a skos:ConceptScheme ;
  skos:prefLabel "European Legislation Identifier (ELI)"@en .