LOD DCAT-AP_IT dati-semantic-assets

Da CSV a Linked Open Data
Guida pratica per la PA

Tutto ciò che serve per costruire o migliorare un CSV e generare TTL semanticamente corretto, conforme alle ontologie italiane ufficiali.

1 — Come funziona il tool

Il tool trasforma un CSV della PA in RDF/Turtle (TTL) conforme alle ontologie di dati-semantic-assets. Non richiede installazione: è una singola pagina HTML che gira nel browser.

1
Carica il CSV
Incolla o trascina il file. Separatori , ; tab pipe tutti supportati.
1b
Link dati.gov.it
Opzionale. Legge temi DCAT e migliora il rilevamento automatico.
AUTO
Detect ontologie
Il motore deterministico analizza header e valori e suggerisce le ontologie.
2
AI-Detect
Opzionale. Migliora la mappatura colonne non standard.
3
Codice IPA
Es. c_a662. Costruisce gli URI RDF univoci della PA.
4
Genera TTL
Output RDF/Turtle scaricabile, validabile, pubblicabile su dati.gov.it.
Principio chiave: le ontologie rilevate (o scelte manualmente) comandano la generazione TTL. Se il detect suggerisce POI+CLV, il TTL conterrà poi:PointOfInterest con clv:hasAddress. Se le ontologie sono sbagliate, il TTL sarà sbagliato: verificale sempre prima di generare.

2 — Partire da zero: costruire un CSV "decente"

Se la tua PA non ha ancora un CSV, segui questa metodologia per costruirne uno che generi un TTL completo e semanticamente ricco.

Passo 1 — Identifica il tipo di dataset

Prima di tutto: cosa stai pubblicando? Consulta il catalogo dei dataset ottimali e scegli il template più adatto al tuo caso.

Tipo di datoOntologie principaliColonne obbligatorie
Luoghi fisici (DAE, farmacie, uffici)POI + CLVnome, indirizzo, lat, lon
Organizzazioni, enti PACOV + CLVdenominazione, codice_ipa, comune
Statistiche, dati aggregatiQB + CLVanno, comune, valore numerico
Scuole, istitutiSMAPIT + CLV + SMcodice_meccanografico, nome_istituto, lat, lon, telefono
Strutture ricettiveACCO + CLVnome, stelle, posti_letto, indirizzo
Sensori / misure ambientaliIoT + CLV + POI + TIstazione_id, data, lat, lon, valore_misurato
Fermate TPLGTFS + CLVstop_id, stop_name, stop_lat, stop_lon
Persone (anagrafe)CPV + CLVcognome, nome, codice_fiscale, comune

Passo 2 — Scegli le intestazioni giuste

Le intestazioni delle colonne determinano tutto: il tool le riconosce e le mappa su proprietà ontologiche ufficiali. Usa i nomi standard riportati in questa guida (sezione Intestazioni chiave). Esempio per un dataset di defibrillatori:

Corretto:  id,nome,indirizzo,modello,lat,lon,stato
Evitare:  ID,Nome_Punto,Luogo,Tipo_DAE,Latitudine,Longitudine,Funzionante

La seconda riga usa nomi non standard: il tool li metterà in rdfs:comment invece di proprietà ontologiche corrette.

Passo 3 — Includi sempre le coordinate

Se il tuo dataset ha una componente geografica (quasi sempre nella PA locale), includi lat e lon come colonne separate. Questo attiva automaticamente POI e CLV.

Evitare:  geo_point
           44.4938, 11.3430      <-- tutto in una cella, non riconosciuto

Corretto:  lat,lon
              44.4938,11.3430    <-- due colonne separate, riconosciuto subito

Template CSV minimale per dataset POI (luoghi fisici)

id,nome,tipo,indirizzo,comune,lat,lon,telefono,email,note
1,Farmacia Centrale,farmacia,Via Roma 10,Bari,41.1171,16.8719,0801234567,farmacia@mail.it,aperta 24h
2,Defibrillatore Municipio,DAE,Piazza del Comune 1,Bari,41.1253,16.8620,,, funzionante
  • id → identificatore univoco (usato per costruire l'URI RDF)
  • nome → rdfs:label — il nome leggibile del soggetto
  • tipo → dct:type — categoria del punto di interesse
  • indirizzo → clv:fullAddress nel nodo clv:Address
  • lat, lon → geo:lat / geo:long con tipo xsd:decimal
  • telefono → sm:hasTelephone
  • email → sm:hasEmail con URI mailto:

3 — Migliorare un CSV esistente

Hai già un CSV pubblicato e vuoi aumentare la qualità del TTL generato? Segui questa checklist.

Problemi frequenti nei CSV PA

  • Coordinate in una sola cella ("44.56, 11.27")
  • Intestazioni generiche (col1, col2, valore)
  • Separatore ; invece di ,
  • Encoding ISO-8859 invece di UTF-8
  • Valori misti (numeri e testo nella stessa colonna)
  • Colonna "id" con valori come 1, 2, 3 mappata su rdfs:label
  • Indirizzo, via, comune, cap tutti in una colonna sola

Fix rapidi ad alto impatto

  • Dividi "Geo Point" → colonne lat e lon separate
  • Rinomina le intestazioni con i nomi standard (vedi tabella)
  • Converti in UTF-8 da LibreOffice: Salva con nome → UTF-8
  • Rinomina "id" in "codice" o "codice_identificativo"
  • Separa indirizzo in: via, civico, comune, cap, provincia
  • Aggiungi colonne lat/lon se hai indirizzi (geocodifica)
  • Usa punto decimale, non virgola (40.604 non 40,604)

Come leggere gli avvisi gli avvisi del validatore

Dopo aver caricato il CSV, usa il pulsante "Valida". Gli avvisi indicano cosa migliorare:

AvvisoCausaFix
Avviso: rdfs:label con valore numericoUna colonna numerica finisce come etichettaRinomina la colonna o aggiungi una colonna "nome" testuale
Avviso: colonne non mappate non mappate → rdfs:commentIntestazioni non standardRinomina con i nomi standard O usa l'AI (STEP 2)
Avviso: Colonna "Geo Point" con lat/lon unificatiCoordinate in una cellaDividi in due colonne lat e lon
Errore Encoding problematicoFile ISO-8859, non UTF-8Riesporta da Excel/LibreOffice scegliendo UTF-8
Errore Coordinate fuori rangeVirgola usata come decimaleSostituisci , con . nei valori numerici
Regola pratica: se il TTL generato ha molte righe rdfs:comment "COLONNA: valore"@it, significa che quelle colonne non sono state riconosciute. Rinominale con i nomi standard o attiva l'AI per gestirle.

4 — Quando conviene usare l'AI (STEP 2)

Il motore deterministico funziona istantaneamente e copre la grande maggioranza dei CSV PA standard. L'AI entra in gioco quando le colonne sono specifiche di dominio o non standard.

CSV con intestazioni standard
95%
CSV con intestazioni in inglese
70%
CSV di dominio specifico (sanitario, agricolo)
45%
CSV con intestazioni abbreviate o codificate
20%

Copertura stimata del motore deterministico senza AI

Usa il deterministico (senza AI) quando:

  • Il CSV usa intestazioni italiane standard (nome, indirizzo, lat, lon...)
  • Il dataset è uno dei 39 tipi nel menu esempi
  • Il validatore mostra 0 colonne non mappate
  • Il TTL atteso ha < 50 triple per soggetto
  • Vuoi velocità massima (generazione istantanea)

Quando attivare l'AI (STEP 2) (STEP 2) quando:

  • Hai ≥ 3 colonne non mappate (avviso nel validatore)
  • Le intestazioni sono abbreviazioni o codici (es. UO_AMM, COD_PRES)
  • Il dominio è specifico (sanitario, agricolo, giudiziario)
  • Vuoi la mappatura più precisa possibile
  • Il CSV ha intestazioni in inglese o miste
Provider AI supportati: Mistral (gratuito con chiave API), Groq (veloce, gratuito), Google Gemini. La chiave API va inserita nello STEP 2 — non viene salvata. Senza chiave la generazione è comunque disponibile, solo senza AI.

5 — Intestazioni chiave riconosciute

Queste intestazioni vengono mappate automaticamente su proprietà ontologiche ufficiali. Usarle correttamente è il modo più semplice per ottenere un TTL ricco senza AI.

Colonne geografiche → CLV + POI

Intestazione CSVProprietà RDFNote
lat / latitudinegeo:latPunto decimale, es. 41.117
lon / longitudinegeo:longPunto decimale, es. 16.871
indirizzoclv:fullAddressSu nodo clv:Address
comuneclv:hasCitySkippa nella generazione URI
citta / cittàclv:hasCityAlias di comune
capclv:postCodeCodice postale
codice_comunedct:spatialURI vocabolario comuni ISTAT

Colonne organizzazione → COV

Intestazione CSVProprietà RDF
codice_ipacov:IPAcode
partita_ivacov:VATnumber
ragione_sociale / denominazionecov:legalName
nome_centro / nome_strutturacov:legalName
forma_giuridicacov:hasLegalStatus + URI vocabolario
codice_atecocov:hasActivityType + URI vocabolario ATECO

Contatti → SM

Intestazione CSVProprietà RDF
emailsm:hasEmail (URI mailto:)
telefono / cellularesm:hasTelephone
sitoweb / sito_websm:hasWebSite (URI)
pecsm:hasEmail

Colonne temporali → TI

Intestazione CSVProprietà RDF
datati:startTime (xsd:date)
data_inizio / inizioti:startTime
data_fine / termineti:endTime
data_nascitacpv:dateOfBirth
anno / mesesdmx-dimension:refPeriod

Colonne statistiche → QB

Intestazione CSVProprietà RDF
valore / numero / totalesdmx-measure:obsValue
popolazione_residentesdmx-measure:obsValue
kwh_prodotti / consumo_kwhsdmx-measure:obsValue (ENER)
feriti / mortisdmx-measure:obsValue (JUST)
numero_alunnisdmx-measure:obsValue (EDUC)
superficie_hasdmx-measure:obsValue (AGRI)

Colonne sensori → IoT

Intestazione CSVProprietà RDF
pm10 / pm25 / no2 / so2iot:hasValue (xsd:decimal)
temperatura_c / umidita_perciot:hasValue
precipitazioni_mm / pressione_hpaiot:hasValue
stazione_id / nome_stazionetrigger POI (centralina geolocalizzata)
unita_misuramu:hasMeasurementUnit

6 — Metodologia: come funziona il motore

Rilevamento ontologie deterministico

Il motore analizza le intestazioni del CSV (header) e i valori delle prime righe, poi applica una cascata di regole per determinare quali ontologie usare. Le ontologie rilevate comandano la generazione TTL.

Principi chiave del rilevamento:

  • CLV scatta se ci sono colonne geografiche (lat, lon, comune, indirizzo...)
  • POI scatta se ci sono coordinate + nome del luogo
  • IoT→POI e IoT→TI scattano automaticamente (sensori geolocalizzati hanno sempre coordinate e timestamp)
  • QB richiede colonne numeriche aggregate + anno/periodo, ma non scatta su eventi puntuali con data+ora+lat
  • ACCO non scatta se il CSV è di strutture socioassistenziali (RSA, centri diurni)
  • SM scatta automaticamente se ci sono colonne telefono/email

Corpus di riconoscimento (330 fixture)

Il motore usa un corpus di 330 pattern estratti da CSV reali della PA italiana, organizzati per i 13 temi DCAT. Ogni fixture contiene header tipici e valori di esempio che guidano il rilevamento per dataset ambigui.

Il corpus copre: POI, CLV, COV, SMAPIT, IoT, QB, GTFS, ACCO, CPV, TI, RO, CPSV, PublicContract, Route, RPO, Learning, Transparency, Indicator, MU, PARK, CulturalON, ADMS, NDC, CPEV, AccessCondition, AtlasOfPaths, CulturalHeritage, Project.

Ontologie e vocabolari controllati ufficiali

Il tool usa esclusivamente le ontologie del progetto dati-semantic-assets (ex OntoPiA), verificate sui TTL ufficiali scaricati da daf-ontologie-vocabolari-controllati. I valori classificabili vengono tipizzati con URI dai vocabolari controllati di schema.gov.it (336 risorse analizzate).

# Esempio: forma_giuridica genera URI tipizzato
<...> cov:hasLegalStatus
  <https://w3id.org/italia/controlled-vocabulary/classifications-for-organizations/legal-status/comune> .

# Invece di una stringa generica
<...> dct:type "Comune"@it .

Struttura degli URI RDF generati

# Pattern URI standard
https://w3id.org/italia/data/{ipa}/{tipo-entità}/{id-riga}

# Esempi concreti
https://w3id.org/italia/data/c_a662/point-of-interest/1
https://w3id.org/italia/data/c_a662/address/1
https://w3id.org/italia/data/r_emiro/public-organization/AOU-Policlinico

Il tipo-entità dipende dall'ontologia principale: point-of-interest per POI, public-organization per COV, observation per QB, sensor per IoT, ecc.

7 — Errori comuni e come evitarli

Problema: CSV con "Geo Point" unificato

Geo Point
"44.56268, 11.27106"

Il tool mostra avviso (triangolo). Soluzione: dividi in due colonne separate lat e lon in Excel con Dati → Testo in colonne, usando la virgola come delimitatore.

Problema: Nessuna colonna "nome" o "denominazione"

id,tipo,lat,lon
1,DAE,41.117,16.871

Senza etichetta leggibile il TTL genera rdfs:label "1"@it — numerico. Aggiungi una colonna nome con testo descrittivo.

Problema: Separatore ; con portali regionali

Molti portali open data italiani esportano CSV con ; come separatore. Il tool lo gestisce automaticamente, ma il validatore mostra un avviso informativo. Nessuna azione richiesta se l'avviso è info (blu), non errore (rosso).

Attenzione: Posti letto ≠ struttura ricettiva

nome_struttura,tipo_struttura,posti_letto
RSA San Giuseppe,RSA,80

posti_letto di solito attiva ACCO (strutture ricettive), ma una RSA non è un hotel. Il tool v88 riconosce tipo_struttura + nome_struttura come struttura sociale e usa COV+POI invece di ACCO.

Attenzione: codice_istat blocca le statistiche

In versioni precedenti codice_istat bloccava il rilevamento QB. Dalla v85 questo è risolto: i CSV demografici con codice_istat vengono riconosciuti correttamente come QB+CLV.

Link dati.gov.it migliora il detect

Se il tuo dataset è già pubblicato su dati.gov.it, incolla il link nello STEP 1 BIS. Il tool legge i temi DCAT (themes_aggregate) e li usa per escludere ontologie spurie e suggerire quelle corrette. Esempio: tema HEAL suggerisce POI+CLV+SM e scarta GTFS/ACCO.

Regola d'oro: un CSV di qualità per Linked Open Data ha sempre — almeno — queste quattro colonne: nome/denominazione (etichetta testuale), indirizzo o lat+lon (localizzazione), tipo (categoria), e un identificatore univoco. Con queste quattro il tool genera TTL valido anche senza AI.