Med Python-biblioteket datacatalogtordf, kan du lett generere datakatalogar i DCAT-formatet.
Dette er blant anna bruk at NAV til å eksportere sin katalog slik at data-beskrivingane også vert synlege i data.norge.no så fleire kan finne dei, og NAV slepp å ajourføre informasjon fleire stader.
Eksempel på bruk — straumforbruk i kommunale bygg
Vi brukte biblioteket til å generere ein datakatalog for fire nesten like data-beskrivingar, så vi slapp å manuelt føre inn og oppdatere desse.
I anledning Open Data Challenge i mars 2022, vart det lagt til rette datasett om straumforbruk frå fire ulike kommunar. Vi ville få desse data-beskrivingane inn i data-katalogen på data.norge.no. Data-beskrivelsen for kvar kommune var heilt lik, med unntak av at det var forskjellige kommunar og kommune-namnet var bytta ut i lenkene til datasetta. Kvar data-beskrivelse peika så vidare til fire ulike datasett.
DCAT - kjapp repetisjon
DCAT er standard-formatet for datakatalogar, eller «Standard for beskrivelse av datasett, datatjenester og datakataloger (DCAT-AP-NO)» på fint.
Overordna (og forenkla) består ein DCAT-katalog av
TODO: boks-skisse som viser katalog som kan ha opptil fleire Dataset, og desse kan ha opptil fleire Distribusjonar.
Lage ein katalog med datacatalogtordf
For å lage ein katalog, må vi først lage topp-nivå-objektet, Catalog, og setje verdiane på dette.
catalog = Catalog()
catalogIdentifier = "https://example.com/kommunedata/energi"
catalog.identifier = catalogIdentifier
catalog.dct_identifier = catalogIdentifier
catalog.title = {
"nb": "Energimålingar i kommunale bygg",
"en": "Energy usage datasets from municipality buildings"
}
catalog.description = {
"nb": "Datasett frå kommunar, på samme format. Frå SamÅpne-prosjektet. Lansert til Open data challenge 2022.",
"en": "Datasets from municipalities in the same format. From the SamÅpne-project. Launched for Open data challenge 2022."
}
Her ser du at for mange tekst-felt, som på tittel og beskrivelse, kan ein legge inn tekst på ulike språk.
For å oppgje kven som er utgjevar av katalogn, må vi lage eit Agent-objekt og knytte til Catalog-objektet.
agent = Agent()
agent.identifier = "https://data.brreg.no/enhetsregisteret/enhet/991825827"
agent.name = {
"nb": "Digitaliseringsdirektoratet",
"en": "The Norwegian Digitalisation Agency"
}
catalog.publisher = agent
No kan vi opprette Dataset-objekt og legge dei til i Catalog.
Slik opprettar ein Dataset:
code_text
# Values
municipalities = [
("Bodø", "bodo", "972418013"),
("Drammen", "drammen", "921234554"),
("Stavanger", "stavanger", "964965226"),
("Trondheim", "trondheim", "942110464")]
datahotelDatasets = [("location-measurement-points", "Location measurement points"), ("locations", "Locations"), ("measurement-points", "Measurement points"), ("measurements", "Measurements")]
# [...]
# Create datasets:
for (municipalityName, municipalityShortname, orgnr) in municipalities:
dataset = Dataset()
dctIdentifier = "https://example.com/kommunedata/energi/" + municipalityShortname
dataset.identifier = dctIdentifier
dataset.dct_identifier = dctIdentifier
agent = Agent()
agent.identifier = "https://data.brreg.no/enhetsregisteret/api/enheter/" + orgnr
agent.name = {
"nb": municipalityName + " kommune",
"en": municipalityName + " municipality"
}
dataset.publisher = agent
contact = Contact()
contact.email = "erlend.stav@sintef.no"
contact.name = {"nb": "Erlend Stav"}
contact.url = "https://www.sintef.no/alle-ansatte/ansatt/erlend.stav/"
dataset.contactpoint = contact
dataset.title = {
"nb": "Energimålinger kommunale bygg",
"en": "Energy usage in municipal buildings"}
dataset.description = {
"nb": """
Datasettene i denne katalogen er samordnet basert på kiledata fra kommunene.
Det er fire typer datasett som hører sammen.
- Location: Beskriver en lokasjon (vanligvis et bygg) som det finnes energidata for.
- MeasurementPoint: Beskriver et målepunkt med en unik id, hva målepunktet er og enhet det måles i.
- LocationMeasurementPoint: Knytter et målepunkt til en lokasjon og gir et lokalt navn for målepunktet. Enkelte målepunkt brukes av mange lokasjoner, f.eks. temperaturmålere fra offisielle målestasjoner fra meteorilogisk institutt (met.no)
- Measurements: Tidsstemplede målinger fra målepunkt
Beskrivelse av hvert av datasettene med deres felter følger under.
For nærmere beskrivelse av hvert datasett, se dokumentasjon på GitHub:
https://github.com/opendatalab-no/open-municipal-data/blob/main/coordinated-data/README.md
""",
"en" : """
The datasets in this directory are coordinated based on data sources from the municipalities.
There are four types of data sets that belong together.
- Location: Describes a location (usually a building) that has energy data.
- MeasurementPoint: Describes a measurement point with a unique id, what it is and the unit measurements are performed in.
- LocationMeasurementPoint: Connects a measurement point with a location and assigns a local namee for the measurement point. Some measurement points are used by multiple locations, e.g. for temperature measurements from official measurement stations from met.no.
- Measurements: Timestamped measurements from measurement points.
Follow this link for a description of each dataset with their attributes:
https://github.com/opendatalab-no/open-municipal-data/blob/main/coordinated-data/README_en.md
"""
}
dataset.access_rights = "http://publications.europa.eu/resource/authority/access-right/PUBLIC"
dataset.theme = [
"http://publications.europa.eu/resource/authority/data-theme/ENER",
"http://publications.europa.eu/resource/authority/data-theme/GOVE"
]
dataset.keyword = {"nb": "energimåling"}
dataset.landing_page = ["https://github.com/opendatalab-no/open-municipal-data"]
# Create distributions
for (datasetId, datasetName) in datahotelDatasets:
dist = Distribution()
datasetHotelId = municipalityShortname + "/energy/" + datasetId
accessUrl = "https://hotell.difi.no/?dataset=" + datasetHotelId
dist.identifier = accessUrl
dist.access_URL = accessUrl
dist.download_URL = "https://hotell.difi.no/download/" + datasetHotelId
dist.title = {
"nb": datasetName,
"en": datasetName
}
dist.description = {
"nb": "API i formatene JSON, XML, CSV og YAML. Komplett nedlasting som CSV",
"en": "API supporting JSON, XML, CSV and YAML. Complete download as CSV"
}
dist.formats = [
"https://www.iana.org/assignments/media-types/text/csv",
"https://www.iana.org/assignments/media-types/application/xml",
"https://www.iana.org/assignments/media-types/application/yaml",
"https://www.iana.org/assignments/media-types/application/json"
]
dist.license = "https://data.norge.no/nlod/no/2.0"
dataset.distributions.append(dist)
# Add dataset to catalog:
catalog.datasets.append(dataset)
# get rdf representation in turtle (default)
rdf = catalog.to_rdf()
# print(rdf.decode())
# change working directory to same as script
# https://stackoverflow.com/a/1432949
abspath = os.path.abspath(__file__)
dname = os.path.dirname(abspath)
os.chdir(dname)
print(os.getcwd())
# write to file
f = open("kommuneenergi.ttl", "w")
f.write(rdf.decode())
f.close()
Fila med heile scriptet for å lage DCAT finn du her:
https://github.com/opendatalab-no/open-municipal-data/blob/main/catalog/datanorgekatalog.py
Output frå scriptet i TTL-format finn du her:
https://github.com/opendatalab-no/open-municipal-data/blob/main/catalog/kommuneenergi.ttl
TODO: skriv om bruk av URL-ar med example.com, som er eit domene reservert.
https://en.wikipedia.org/wiki/Example.com