DCAT-AP 3.0.1
DCAT Application Profile for data portals in Europe (DCAT-AP) extends DCAT with European-specific requirements and controlled vocabularies.
Overview
DCAT-AP provides a minimal common basis within Europe to share Datasets and Data Services cross-border and cross-domain.
Key features:
EU Controlled Vocabularies - Mandatory and recommended vocabularies
Multilingual Support - Language-tagged literals for all EU languages
HVD Support - High Value Datasets regulation compliance
Legal Metadata - Applicable legislation tracking
Official Specification: https://semiceu.github.io/DCAT-AP/releases/3.0.1/
DCAT-AP Classes
DCAT-AP extends 6 core DCAT classes:
Catalog - Extended with applicable legislation, geographical/temporal coverage
Dataset - Extended with HVD support, access rights, provenance
Distribution - Extended with availability, ODRL policies, status
DataService - Extended with applicable legislation
DatasetSeries - Extended with applicable legislation, access rights
CatalogRecord - Extended with applicable legislation
Quick Example
from dartfx.dcat import dcat_ap
# Create European catalog
catalog = dcat_ap.Catalog(id="eu-portal")
catalog.add_title("European Open Data Portal", lang="en")
catalog.add_title("Portail européen de données ouvertes", lang="fr")
catalog.add_geographical_coverage(
"http://publications.europa.eu/resource/authority/continent/EUROPE"
)
# Create dataset with EU vocabularies
dataset = dcat_ap.Dataset(id="population-stats")
dataset.add_title("European Population Statistics", lang="en")
# Add theme using EU Data Theme vocabulary (mandatory)
dataset.add_theme(
"http://publications.europa.eu/resource/authority/data-theme/SOCI"
)
# Set access rights using EU vocabulary (recommended)
dataset.set_access_rights(
"http://publications.europa.eu/resource/authority/access-right/PUBLIC"
)
# Add frequency using EU vocabulary
dataset.add_frequency(
"http://publications.europa.eu/resource/authority/frequency/ANNUAL"
)
# Create distribution
distribution = dcat_ap.Distribution(id="csv-dist")
distribution.add_download_url("http://example.org/data.csv")
distribution.add_media_type("text/csv")
# Set availability using EU vocabulary
distribution.set_availability(
"http://publications.europa.eu/resource/authority/planned-availability/AVAILABLE"
)
dataset.add_distribution(distribution)
catalog.add_dataset(dataset)
Controlled Vocabularies
DCAT-AP defines specific controlled vocabularies that MUST, SHOULD, or MAY be used:
Mandatory Vocabularies
Property |
Vocabulary |
|---|---|
Media Type |
IANA Media Types |
Frequency |
EU Frequency |
File Type |
EU File Type |
Language |
EU Languages |
Distribution Status |
EU Distribution Status |
Availability |
EU Planned Availability |
Recommended Vocabularies
Property |
Vocabulary |
|---|---|
Access Rights |
EU Access Rights |
Publisher Type |
ADMS Publisher Type |
Licence Type |
ADMS Licence Type |
Using Controlled Vocabularies
from dartfx.dcat import dcat_ap
dataset = dcat_ap.Dataset(id="dataset-1")
# Use EU Data Theme (at least 1 required)
dataset.add_theme(
"http://publications.europa.eu/resource/authority/data-theme/ECON"
)
# Use EU Access Rights (recommended)
dataset.set_access_rights(
"http://publications.europa.eu/resource/authority/access-right/PUBLIC"
)
# Use EU Frequency (mandatory if present)
dataset.add_frequency(
"http://publications.europa.eu/resource/authority/frequency/MONTHLY"
)
Multilingual Support
DCAT-AP emphasizes multilingual metadata:
dataset = dcat_ap.Dataset(id="multilingual-dataset")
# Add titles in multiple EU languages
dataset.add_title("Population Data", lang="en")
dataset.add_title("Données de population", lang="fr")
dataset.add_title("Bevölkerungsdaten", lang="de")
dataset.add_title("Datos de población", lang="es")
dataset.add_title("Dati sulla popolazione", lang="it")
# Add descriptions in multiple languages
dataset.add_description("Annual population statistics", lang="en")
dataset.add_description("Statistiques annuelles de population", lang="fr")
dataset.add_description("Jährliche Bevölkerungsstatistiken", lang="de")
Provenance and Attribution
DCAT-AP supports detailed provenance information:
dataset = dcat_ap.Dataset(id="dataset-1")
# Add provenance statement
dataset.add_provenance("http://example.org/provenance/statement-1")
# Add qualified attribution
dataset.add_qualified_attribution("http://example.org/attribution/1")
# Add source dataset
dataset.add_source("http://example.org/source-dataset")
# Add activity that generated this dataset
dataset.add_was_generated_by("http://example.org/activity/1")
ODRL Policies
DCAT-AP supports ODRL (Open Digital Rights Language) policies:
distribution = dcat_ap.Distribution(id="dist-1")
distribution.add_download_url("http://example.org/data.csv")
# Add ODRL policy
distribution.add_policy("http://example.org/policy/open-data")
distribution.add_policy("http://example.org/policy/attribution-required")
Complete Example
from dartfx.dcat import dcat_ap
# Create catalog
catalog = dcat_ap.Catalog(id="eu-catalog")
catalog.add_title("European Data Catalog", lang="en")
catalog.add_description("Catalog of European datasets", lang="en")
catalog.add_publisher(
"http://publications.europa.eu/resource/authority/corporate-body/PUBL"
)
# Create dataset
dataset = dcat_ap.Dataset(id="economic-data")
dataset.add_title("European Economic Data", lang="en")
dataset.add_description("Economic indicators for EU member states", lang="en")
# Add EU vocabularies
dataset.add_theme(
"http://publications.europa.eu/resource/authority/data-theme/ECON"
)
dataset.set_access_rights(
"http://publications.europa.eu/resource/authority/access-right/PUBLIC"
)
dataset.add_frequency(
"http://publications.europa.eu/resource/authority/frequency/QUARTERLY"
)
# Add spatial coverage
dataset.add_spatial(
"http://publications.europa.eu/resource/authority/continent/EUROPE"
)
# Create distribution
distribution = dcat_ap.Distribution(id="csv-dist")
distribution.add_download_url("http://example.org/economic-data.csv")
distribution.add_media_type("text/csv")
distribution.set_availability(
"http://publications.europa.eu/resource/authority/planned-availability/AVAILABLE"
)
distribution.set_status(
"http://publications.europa.eu/resource/authority/distribution-status/COMPLETED"
)
dataset.add_distribution(distribution)
catalog.add_dataset(dataset)
# Serialize to RDF
turtle = catalog.to_rdf(format='turtle')
Testing
The DCAT-AP implementation includes 32 comprehensive tests:
# Run all DCAT-AP tests
pytest tests/test_dcat_ap.py -v
# Run with coverage
pytest tests/test_dcat_ap.py --cov=dartfx.dcat.dcat_ap
Compliance
This implementation is fully compliant with:
✅ DCAT-AP Version 3.0.1
✅ DCAT Version 3
✅ EU Controlled Vocabularies
✅ SEMIC Standards
See Also
DCAT-AP HVD 3.0.0 - DCAT-AP HVD Implementation
DCAT 3.0 Core - DCAT Core Implementation
DCAT_AP_IMPLEMENTATION.md - Complete implementation guide