Questa analisi è stata realizzata utilizzando due server MCP (Model Context Protocol) che integrano direttamente le funzionalità di ricerca dati aperti e validazione semantica:
- CKAN MCP Server: per la ricerca e l'accesso ai dataset su portali CKAN come dati.gov.it
- Schema.gov.it MCP Server: per la valutazione della conformitĂ con le ontologie nazionali
L'integrazione di questi strumenti tramite MCP permette di:
-
Ricerca Semantica Immediata: interrogare direttamente dati.gov.it senza dover navigare manualmente il portale, con ricerche avanzate usando sintassi Solr e facet
-
Validazione Automatica: confrontare automaticamente la struttura dei dataset con gli standard nazionali (ontologie CLV, POI, CPSV) definiti su schema.gov.it
-
Workflow Integrato: in una singola sessione di lavoro è possibile:
- Cercare dataset rilevanti tra 74.000+ dataset
- Scaricare e analizzare i dati
- Validare la conformitĂ agli standard
- Proporre miglioramenti strutturati
-
Riproducibilità : l'intero processo è tracciabile e automatizzabile, garantendo analisi consistenti e ripetibili
-
InteroperabilitĂ : i dataset conformi agli standard Schema.gov.it sono immediatamente riutilizzabili da altre PA e integrabili in applicazioni semantic web
In pratica: invece di settimane di lavoro manuale per analizzare un dataset e capire come migliorarlo, si ottiene un'analisi completa in pochi minuti, con proposte concrete di adeguamento agli standard nazionali.
- Nome: Elenco Completo Farmacie
- Editore: Regione Lombardia
- URL: https://www.dati.gov.it/view-dataset/dataset?id=4782361d-bf8c-4289-bca2-c1403ce375b3
- Ultimo aggiornamento: 2026-02-05
- Licenza: CC BY 4.0
- Formato: CSV, JSON, RDF, TSV, XML
Elenco completo delle farmacie aperte al pubblico (incluse succursali, dispensari e dispensari stagionali), con dati anagrafici della farmacia (Codice Identificativo Ministeriale, Denominazione, Partita IVA) e dati di localizzazione (Indirizzo comprensivo di Via, CAP, Frazione, Comune, Provincia, Regione).
- Totale farmacie: 3.049
- Province: 17 (incluse 7 fuori regione: VR, FE, TN, RE, MO - probabilmente di confine)
- Comuni coperti: 1.237
- Campi: 12
| Provincia | N. Farmacie | % |
|---|---|---|
| Milano (MI) | 927 | 30.4% |
| Brescia (BS) | 388 | 12.7% |
| Bergamo (BG) | 335 | 11.0% |
| Varese (VA) | 249 | 8.2% |
| Monza Brianza (MB) | 234 | 7.7% |
| Pavia (PV) | 206 | 6.8% |
| Como (CO) | 171 | 5.6% |
| Mantova (MN) | 147 | 4.8% |
| Cremona (CR) | 129 | 4.2% |
| Lecco (LC) | 103 | 3.4% |
| Lodi (LO) | 79 | 2.6% |
| Sondrio (SO) | 72 | 2.4% |
| Altre (fuori regione) | 9 | 0.3% |
CODICE_FARMACIA VARCHAR Es. "BG0113"
DESCRIZIONE_FARMACIA VARCHAR Es. "CASTELLI"
PARTITA_IVA VARCHAR Es. "01410520165"
INDIRIZZO VARCHAR Es. "VIA GRIGNA, 9" (NON STRUTTURATO)
COMUNE VARCHAR Es. "MILANO"
FRAZIONE VARCHAR Es. "VERGHERA" (nullable)
CAP BIGINT Es. 20155 (PROBLEMATICO - numero)
PROVINCIA VARCHAR Es. "MI"
CODICE_ISTAT BIGINT Es. 15146 (5 cifre, mancano zeri iniziali)
LATITUDINE DOUBLE Es. 45.493062
LONGITUDINE DOUBLE Es. 9.156760
LOCATION VARCHAR Es. "POINT (9.156 45.493)" (DUPLICATO)CODICE_FARMACIA,DESCRIZIONE_FARMACIA,PARTITA_IVA,INDIRIZZO,COMUNE,FRAZIONE,CAP,PROVINCIA,CODICE_ISTAT,LATITUDINE,LONGITUDINE,LOCATION
BG0113,CASTELLI,01410520165,CORSO MONTE ROSA,SELVINO,,24020,BG,16197,45.782058514087,9.755378845034,POINT (9.755378845034 45.782058514087)
CO0365,FARMACIA DELL'OCA,02638190138,"VIA GIUSEPPE GARIBALDI, 95",FINO MORNASCO,,22073,CO,13102,45.745327191309,9.050002214056,POINT (9.050002214056 45.745327191309)
MI0903,A.F.M. N. 14,13195220150,"VIA GRIGNA, 9",MILANO,,20155,MI,15146,45.493062415855,9.15676092224,POINT (9.15676092224 45.493062415855)Problema: Campo INDIRIZZO non strutturato
Attuale: INDIRIZZO = "VIA GRIGNA, 9"
(campo unico testuale)
Standard CLV richiede:
- toponymQualifier = "Via" (DUG - Denominazione Urbanistica Generica)
- officialStreetName = "Grigna" (nome strada)
- streetNumber = "9" (numero civico)
- exponent = null (esponente: "bis", "ter", ecc.)
Riferimento: Ontologia CLV
Problema: Perde zeri iniziali
Attuale: CAP = 20155 (tipo BIGINT)
Corretto: CAP = "20155" (tipo VARCHAR/TEXT)
Rischio: I CAP che iniziano con 0 (es. 09123) diventano 9123
Standard CLV: campo postCode di tipo stringa
Problema: Mancano zeri iniziali
Attuale: CODICE_ISTAT = 15146 (5 cifre)
Corretto: CODICE_ISTAT = "015146" (6 cifre con zero iniziale)
Il codice ISTAT ufficiale è sempre di 6 cifre
Standard: vocabolario controllato cities
Problema: Nessuna classificazione economica
Dovrebbe includere:
codice_ateco = "47.73"
descrizione_ateco = "Commercio al dettaglio di medicinali in esercizi specializzati"
Riferimento: ATECO-2007
Problema: Non specificato il CRS
Attuale: LATITUDINE, LONGITUDINE (senza metadati)
Corretto: + coordinateSystem = "EPSG:4326" o "WGS84"
Standard CLV: campo coordinateSystem obbligatorio
Problema: Duplicazione dati
LOCATION = "POINT (9.156 45.493)"
Duplica le informazioni giĂ presenti in LATITUDINE + LONGITUDINE
Problema: Non conforme a ontologia POI (Points of Interest)
Campi mancanti POI:
- poi:POIID (identificativo univoco)
- poi:POIofficialName (denominazione ufficiale)
- poi:POIcategoryName (categoria POI)
- poi:POIstate (stato: attivo/inattivo)
- poi:POIdescription (descrizione)
Riferimento: Ontologia POI
Campi critici assenti:
Contatti:
- Telefono
- PEC (Posta Elettronica Certificata)
Servizi:
- Convenzionato SSN (boolean)
- Turno notturno (boolean)
- Turno festivo (boolean)
- Calendario turni (URL)
- Servizi offerti (array)
- Orari apertura (strutturato)
Stato amministrativo:
- Tipo esercizio (Farmacia/Parafarmacia/Dispensario)
- Stato (Attiva/Sospesa/Cessata)
- Data apertura
- Data cessazione
- Numero autorizzazione
- Ente autorizzante
id_farmacia VARCHAR "BG0113" (primary key)
codice_ministeriale VARCHAR "BG0113"
codice_istat_farmacia VARCHAR (se esiste registro nazionale)
partita_iva VARCHAR "01410520165"
codice_fiscale VARCHAR (se disponibile)denominazione_ufficiale VARCHAR "FARMACIA CASTELLI"
denominazione_commerciale VARCHAR "CASTELLI"
tipo_esercizio VARCHAR "Farmacia" | "Parafarmacia" | "Dispensario" | "Succursale"
codice_ateco VARCHAR "47.73"indirizzo_completo VARCHAR "Corso Monte Rosa, 24020 Selvino (BG)"
dug VARCHAR "Corso" (toponymQualifier)
via VARCHAR "Monte Rosa" (officialStreetName)
numero_civico VARCHAR "1" (streetNumber)
esponente VARCHAR "bis" | "ter" | null (exponent)
interno VARCHAR "A" (flatNumber - se appartamento)
frazione VARCHAR "VERGHERA"
cap VARCHAR "24020" (postCode)
localita VARCHAR (hasAddressArea)comune VARCHAR "Selvino"
codice_istat_comune VARCHAR "016197" (6 cifre con zero iniziale)
provincia VARCHAR "BG" (acronym)
regione VARCHAR "Lombardia"latitudine DOUBLE 45.782058
longitudine DOUBLE 9.755378
sistema_coordinate VARCHAR "EPSG:4326"telefono VARCHAR "+39 035 123456"
email VARCHAR "info@farmacia.it"
pec VARCHAR "farmacia@pec.it"convenzionato_ssn BOOLEAN true
turno_notturno BOOLEAN true
turno_festivo BOOLEAN false
calendario_turni_url VARCHAR "https://..."
orari_apertura JSON {"lun":"8:30-12:30,15:00-19:30",...}
servizi_offerti JSON ["Autoanalisi","ECG","Telemedicina"]
note TEXT (informazioni aggiuntive)stato VARCHAR "Attiva" | "Sospesa" | "Cessata"
data_apertura DATE "2010-01-15"
data_cessazione DATE null
data_aggiornamento DATE "2026-02-05"
url_info VARCHAR "https://..."id_farmacia,denominazione_ufficiale,partita_iva,codice_ateco,tipo_esercizio,dug,via,numero_civico,cap,comune,codice_istat_comune,provincia,regione,latitudine,longitudine,sistema_coordinate,telefono,email,convenzionato_ssn,stato,data_aggiornamento
"BG0113","FARMACIA CASTELLI","01410520165","47.73","Farmacia","Corso","Monte Rosa","1","24020","Selvino","016197","BG","Lombardia",45.782058,9.755378,"EPSG:4326","+39 035 123456","info@farmaciacastelli.it",true,"Attiva","2026-02-05"{
"@context": {
"clv": "https://w3id.org/italia/onto/CLV/",
"poi": "https://w3id.org/italia/onto/POI/",
"cpsv": "https://w3id.org/italia/onto/CPSV/",
"cov": "https://w3id.org/italia/onto/COV/"
},
"@type": "poi:PointOfInterest",
"@id": "https://dati.lombardia.it/farmacia/BG0113",
"poi:POIID": "BG0113",
"poi:POIofficialName": "FARMACIA CASTELLI",
"poi:POIalternativeName": "CASTELLI",
"poi:POIdescription": "Farmacia convenzionata SSN con servizi di autoanalisi",
"poi:POIstate": "Attiva",
"poi:hasPOICategory": {
"@type": "poi:PointOfInterestCategory",
"poi:POIcategoryName": "Farmacia",
"poi:POIcategoryIdentifier": "47.73"
},
"clv:hasAddress": {
"@type": "clv:Address",
"clv:fullAddress": "Corso Monte Rosa 1, 24020 Selvino (BG)",
"clv:hasStreetToponym": {
"@type": "clv:StreetToponym",
"clv:toponymQualifier": "Corso",
"clv:officialStreetName": "Monte Rosa"
},
"clv:hasNumber": {
"@type": "clv:CivicNumbering",
"clv:streetNumber": "1"
},
"clv:postCode": "24020",
"clv:hasCity": {
"@type": "clv:City",
"rdfs:label": "Selvino",
"clv:hasIdentifier": {
"@type": "clv:Identifier",
"clv:identifierType": "ISTAT",
"rdfs:label": "016197"
}
},
"clv:hasProvince": {
"@type": "clv:Province",
"rdfs:label": "Bergamo",
"clv:acronym": "BG"
},
"clv:hasRegion": {
"@type": "clv:Region",
"rdfs:label": "Lombardia"
},
"clv:hasGeometry": {
"@type": "clv:Geometry",
"clv:lat": "45.782058",
"clv:long": "9.755378",
"clv:coordinateSystem": "EPSG:4326"
}
},
"cov:taxID": "01410520165",
"schema:telephone": "+39 035 123456",
"schema:email": "info@farmaciacastelli.it",
"cpsv:hasPublicService": {
"@type": "cpsv:PublicService",
"rdfs:label": "Servizio farmaceutico territoriale",
"cpsv:serviceStatus": "Attivo",
"schema:serviceType": "Farmacia convenzionata SSN"
}
}-
Strutturare campo INDIRIZZO
- Separare in: DUG, via, numero_civico, esponente
- Script di parsing necessario (regex o NLP)
-
Correggere tipo CAP
- Da
BIGINTaVARCHAR - Preservare zeri iniziali
- Da
-
Normalizzare CODICE_ISTAT
- Aggiungere zero iniziale (6 cifre)
- Formato: "015146" non 15146
-
Aggiungere CODICE_ATECO
- Valore fisso: "47.73"
- Descrizione: "Commercio al dettaglio di medicinali in esercizi specializzati"
-
Aggiungere SISTEMA_COORDINATE
- Valore: "EPSG:4326" o "WGS84"
-
Rimuovere campo LOCATION
- Ridondante rispetto a lat/long
-
Aggiungere TIPO_ESERCIZIO
- Valori: "Farmacia" | "Parafarmacia" | "Dispensario" | "Succursale"
-
Aggiungere CONTATTI BASE
- Telefono (obbligatorio)
- Email (raccomandato)
- PEC (raccomandato per PA)
-
Aggiungere STATO
- Valori: "Attiva" | "Sospesa" | "Cessata"
- Data apertura
- Data cessazione (se applicabile)
-
Aggiungere SERVIZI
- Convenzionato SSN (boolean)
- Turno notturno (boolean)
- Turno festivo (boolean)
- Servizi offerti (array JSON)
-
Aggiungere ORARI
- Struttura JSON per giorni/orari
- Calendario turni (URL o file)
-
Aggiungere METADATI AMMINISTRATIVI
- Numero autorizzazione
- Ente autorizzante (ATS/ASL)
- Codice fiscale (se diverso da P.IVA)
-- Trasformazione da schema attuale a schema migliorato (base)
SELECT
CODICE_FARMACIA as id_farmacia,
CODICE_FARMACIA as codice_ministeriale,
DESCRIZIONE_FARMACIA as denominazione_commerciale,
'FARMACIA ' || DESCRIZIONE_FARMACIA as denominazione_ufficiale,
PARTITA_IVA as partita_iva,
'47.73' as codice_ateco,
'Farmacia' as tipo_esercizio,
-- Indirizzo (parsing semplificato - da migliorare)
INDIRIZZO as indirizzo_completo,
REGEXP_EXTRACT(INDIRIZZO, '^([A-Z]+)', 1) as dug,
REGEXP_REPLACE(INDIRIZZO, '^[A-Z]+\s+', '') as via_numero,
FRAZIONE as frazione,
LPAD(CAP::VARCHAR, 5, '0') as cap, -- Corregge CAP
COMUNE as comune,
LPAD(CODICE_ISTAT::VARCHAR, 6, '0') as codice_istat_comune, -- Corregge ISTAT
PROVINCIA as provincia,
'Lombardia' as regione,
LATITUDINE as latitudine,
LONGITUDINE as longitudine,
'EPSG:4326' as sistema_coordinate,
'Attiva' as stato,
CURRENT_DATE as data_aggiornamento
FROM read_csv('/tmp/farmacie_lombardia.csv')
WHERE PROVINCIA IN ('MI','BG','BS','CO','CR','LC','LO','MB','MN','PV','SO','VA');import re
import pandas as pd
def parse_indirizzo(indirizzo):
"""
Parsing indirizzo italiano con regex
"""
# Pattern comune: "VIA NOME, NUMERO"
pattern = r'^(VIA|VIALE|CORSO|PIAZZA|LARGO|VICOLO|STRADA)\s+([^,]+)(?:,\s*(\d+))?'
match = re.match(pattern, indirizzo.upper())
if match:
return {
'dug': match.group(1).title(),
'via': match.group(2).strip().title(),
'numero_civico': match.group(3) or '',
'esponente': None
}
else:
# Fallback: tutto nel campo via
return {
'dug': '',
'via': indirizzo,
'numero_civico': '',
'esponente': None
}
# Applicazione al dataframe
df = pd.read_csv('/tmp/farmacie_lombardia.csv')
# Parse indirizzi
parsed = df['INDIRIZZO'].apply(parse_indirizzo)
df_parsed = pd.DataFrame(parsed.tolist())
# Merge con dataset originale
df_final = pd.concat([df, df_parsed], axis=1)
# Salva risultato
df_final.to_csv('/tmp/farmacie_lombardia_parsed.csv', index=False)dcat:Dataset:
dcterms:title: "Elenco Farmacie Regione Lombardia - Conforme Schema.gov.it"
dcterms:description: |
Dataset completo delle farmacie aperte al pubblico in Regione Lombardia,
strutturato secondo gli standard nazionali Schema.gov.it (ontologie CLV, POI).
Include dati anagrafici, localizzazione strutturata, contatti e servizi offerti.
dcterms:publisher:
foaf:name: "Regione Lombardia"
dcterms:identifier: "https://www.regione.lombardia.it"
dcterms:issued: "2025-12-03"
dcterms:modified: "2026-02-05"
dcat:theme:
- "http://publications.europa.eu/resource/authority/data-theme/HEAL"
dcterms:subject:
- "Farmacie"
- "SanitĂ "
- "Servizi sanitari"
- "Salute pubblica"
dcterms:spatial:
dcterms:identifier: "https://www.geonames.org/3174618"
rdfs:label: "Lombardia"
dcterms:temporal:
schema:startDate: "2026-02-05"
dcterms:accrualPeriodicity:
- "http://publications.europa.eu/resource/authority/frequency/MONTHLY"
dcterms:license:
- "https://creativecommons.org/licenses/by/4.0/"
dcterms:conformsTo:
- "https://w3id.org/italia/onto/CLV/" # Core Location Vocabulary
- "https://w3id.org/italia/onto/POI/" # Points of Interest
- "https://w3id.org/italia/controlled-vocabulary/classifications-for-organizations/ateco-2007"
- "https://w3id.org/italia/controlled-vocabulary/territorial-classifications/cities"
dcat:keyword:
- "farmacie"
- "sanitĂ "
- "servizi sanitari"
- "salute"
- "turni"
- "masterdata"
- "open data"
dcat:distribution:
- dcat:Distribution:
dcterms:title: "Dataset Farmacie - CSV"
dcterms:format: "text/csv"
dcat:accessURL: "https://..."
dcat:downloadURL: "https://.../farmacie.csv"
- dcat:Distribution:
dcterms:title: "Dataset Farmacie - JSON-LD"
dcterms:format: "application/ld+json"
dcat:accessURL: "https://..."
dcat:downloadURL: "https://.../farmacie.jsonld"- Correggere CAP e CODICE_ISTAT → Convertire in stringhe con zeri iniziali
- Aggiungere CODICE_ATECO → Valore fisso "47.73"
- Specificare SISTEMA_COORDINATE → "EPSG:4326"
- Rimuovere LOCATION → Campo ridondante
- Strutturare INDIRIZZO → Separare DUG, via, numero civico
- Aggiungere CONTATTI → Telefono (minimo), email, PEC
- Aggiungere TIPO_ESERCIZIO → Distinguere farmacie, parafarmacie, dispensari
- Aggiungere STATO → Attiva/Sospesa/Cessata + date
- Integrare SERVIZI → Convenzione SSN, turni, servizi offerti
- Pubblicare JSON-LD → Formato linked data conforme
- Aggiornare METADATI → DCAT-AP_IT completo con conformsTo
- Creare API REST → Accesso programmatico con filtri
- âś… InteroperabilitĂ : Dataset riutilizzabile da altre PA senza trasformazioni
- âś… RicercabilitĂ : Indicizzabile da motori semantic web
- âś… QualitĂ : ConformitĂ agli standard nazionali verificabile
- âś… Riuso: Integrabile in applicazioni terze (mappe, servizi, app)
- âś… ManutenibilitĂ : Struttura chiara e validabile automaticamente
- Schema.gov.it: https://schema.gov.it/
- CLV (Core Location Vocabulary): https://w3id.org/italia/onto/CLV/
- POI (Points of Interest): https://w3id.org/italia/onto/POI/
- ATECO-2007: https://w3id.org/italia/controlled-vocabulary/classifications-for-organizations/ateco-2007
- DCAT-AP_IT: https://www.dati.gov.it/content/dcat-ap-it-v10-profilo-italiano-dcat-ap-0
- Linee Guida Open Data AgID: https://docs.italia.it/italia/daf/lg-patrimonio-pubblico/
- CKAN MCP Server: https://github.com/ondata/ckan-mcp-server
- Schema.gov.it MCP Server: https://github.com/mfortini/schema-gov-it-mcp
- DuckDB: https://duckdb.org/ (analisi dati)
- CKAN API: https://docs.ckan.org/en/latest/api/
- Fonte: Regione Lombardia - Catalogo OpenData
- URL Portale: https://www.dati.lombardia.it/
- URL Dati.gov.it: https://www.dati.gov.it/view-dataset/dataset?id=4782361d-bf8c-4289-bca2-c1403ce375b3
Documento generato il: 2026-02-05 Versione: 1.0 Analisi eseguita con: CKAN MCP Server + Schema.gov.it MCP Server Licenza: CC0 1.0 Universal (Public Domain Dedication)