Integrazione dati sul web Docente Studenti Gennaro Costaiola Raffaele Donadio Christian De Sio Angelo Caputo A.A. 2016/2017
Overview Ognuno di noi crede di conoscere tutto della propria città…ma quante volte vi è capitato di essere sorpresi quando siete venuti a conoscenza, ad esempio, di un monumento storico della vostra città, di cui non avevate la minima idea della sua esistenza? Oppure di avere la necessità di cercare una farmacia? Il nostro obiettivo è finalizzato quindi nel raccogliere varie informazioni di diversa natura su una data città, esonerando l’utente dal navigare sul web, per reperire tutte le informazioni di cui ha bisogno
Problema - 1 Quante volte ti è capitato durante una vacanza di voler sapere quali sono i monumenti storici di maggior rilievo?
Problema - 2 Ti è mai capitato di voler sapere il miglior prezzo del carburante per la tua auto nella tua città o in quelle vicine?
Problema - 3 Quante volte ti è capitato di voler sapere quali sono le farmacie di una città, dove si trovano e quali sono aperte?
Approccio classico Ricerca esaustiva, stancante e poco efficiente sul web
Soluzione - 1 Il nostro sistema è un motore di ricerca che fornisce informazioni data una città italiana su un determinato ambito
Soluzione - 2 Il nostro sistema, con un paio di click, mostra le informazioni desiderate
DEmo
Architettura
estendibilità
Le fonti Nome Metodo Descrizione Grado di volatilità Abcsalute (abc) Web Scraping sito di medicina che parla di malattie, sintomi, terapie, e fornisce la lista delle farmacie sul territorio nazionale Aggiornamento continuo Salute GOV (salute) Script file csv fornito dal governo italiano contente la lista delle farmacie in italia Aggiornamento settimanale Distributori Dat GOV (dis) file csv fornito dal governo italiano contente la lista dei distributori di carburanti in italia Aggiornamento mensile Prezzi carburanti Dat GOV (pr) file csv fornito dal governo italiano contente i prezzi dei carburanti per i vari distributori di carburanti Aggiornamento giornaliero Carburante italia (car) statistiche prezzi carburanti giornaliero Wikipedia (wi) enciclopedia on-line Monumenti Data Open (mon) file csv (dataopen.it) contenente la lista dei monumenti in italia Aggiornamento annuale Bar Data Open (br) file csv (dataopen.it) contenente la lista dei bar in italia Google Place API (gp) API strumento per mostrare i punti di interesse sulla mappa Istat (is) file csv contenente le informazioni della città
Fonte – 1 AbcSalute farmacia(nome, comune, provincia, regione, via, telefono, orario) http://www.abcsalute.it/farmacie-di-turno/campania/salerno/salerno
Fonte – 2 salute gov farmacia(codiceIdentificativo, codiceProvincia, codiceRegione, siglaProvincia, partitaIva, frazione, cap, via, nome, provincia, comune latitudine, longitudine) http://www.dati.salute.gov.it/dati/dettaglioDataset.jsp?menu=dati&idPag=5
Fonte – 3 Distributori Dat GOV distributori(idImpianto, gestore,bandiera, tipo_impianto, nome_impianto, indirizzo, comune, provincia, latitudine, longitudine) http://www.sviluppoeconomico.gov.it/index.php/it/open-data/elenco-dataset/2032336-carburanti-prezzi-praticati-e-anagrafica-degli-impianti
Fonte – 4 Prezzi carburanti Dat GOV prezzi(idImpianto, tipologia_carburante, prezzo, isSelf) http://www.sviluppoeconomico.gov.it/index.php/it/open-data/elenco-dataset/2032336-carburanti-prezzi-praticati-e-anagrafica-degli-impianti
Fonte – 5 carburanti italia statistiche(tipologiaCarburante, prezzoMedio, percentuale) http://carburanti-italia.it/
Fonte – 6 Wikipedia comune(provincia, immagineUrl, descrizione) https://it.wikipedia.org/wiki/Salerno
Fonte – 7 monumenti data open monumenti(nomeMonumento, provincia, latitudineMonumento, longitudineMonumento) http://www.datiopen.it/it/opendata/Mappa_dei_monumenti_in_Italia
Fonte – 8 Bar Data Open bar(nomeBar, latitudine, longitudine, provincia) http://www.datiopen.it/it/opendata/Mappa_dei_bar_e_caff_in_Italia
Fonte – 9 Google place api place(nome, raggio, tipologia, aperto_adesso, latitudine, longitudine) https://maps.googleapis.com/maps/api/place
fonte – 10 Istat comune(citta, provincia, regione, latitudineCitta, longitudineCitta, codiceIstat, denominazioneProvincia) https://www.istat.it/it/archivio/160039
Wrapper – 1 Abcsalute Per estrapolare le informazioni dal sito Indirizzo: //div[@class="mappatura"]//li//span[@itemprop="streetAddress" Città: //div[@class="mappatura"]//li//span[@itemprop="addressLocality” Provincia: //div[@class="mappatura"]//li//span[@itemprop="addressRegion"] Telefono: //div[@class="mappatura"]//li//span[@itemprop="telephone"] Giorni: //ul[@class="map_list small-desc"]//table//td[1] Orarigiorno: //ul[@class="map_list small-desc"]//table//td[2] Orarisera: //ul[@class="map_list small-desc"]//table//td[3]
Wrapper – 2 salute gov
wrapper – 3 Distributori Dat GOV
wrapper – 5 Carburanti italia Statistiche nazionali: //div[@id='national']/table” Statistiche provinciali: //*[@id='content']/table/tbody/tr[1]/td[1]/table/tbody
Wrapper – 6 wikipedia Citta: //div[@id='mw-content-text']/div/p[2] ImmagineUrl: //table[@class='sinottico']/descendant::img[1]/@src Descrizione: //div[@id='mw-content-text']/div/p[4] Popolazione: //div[@id='mw-content-text']/div/table[1]/tr[14]/td
Schema globale farmacia(nome, comune, provincia, regione, via, telefono, orario, latitudine, longitudine) dottori(nome, raggio, tipologia, aperto_adesso, latitudine, longitudine) citta(descrizione, stemma, provincia, nomeBar, latitudineBar, longitudineBar, nomeMonumento, latitudineMonumento, longitudineMonumento) carburante(idImpianto, gestore, bandiera, nome_impianto, indirizzo, comune, provincia, latitudine, longitudine, prezzo, tipologia_carburante, isSelf, tipologiaCarburante, prezzoMedio, percentuale) autolavaggio(nome, raggio, tipologia, aperto_adesso, latitudine, longitudine) comune(citta, provincia, regione, latitudineCitta, longitudineCitta)
Mapping gav – 1 farmacia(nome, comune, provincia, regione, via, telefono, orario, latitudine, longitudine):- abc.farmacia(nome, comune, provincia, regione, via, orario, telefono), salute.farmacia(nome, comune, provincia, regione, latitudine, longitudine) dottori(nome, raggio, tipologia, aperto_adesso, latitudine, longitudine):- gp.place(nome, raggio, tipologia, aperto_adesso, latitudine, longitudine), tipologia=“doctor” autolavaggio(nome, raggio, tipologia, aperto_adesso, latitudine, longitudine):- gp.place(nome, raggio, tipologia, aperto_adesso, latitudine, longitudine), tipologia=“car_wash” carburante(idImpianto, gestore, bandiera, nome_impianto, indirizzo, comune, provincia, latitudine, longitudine, prezzo, tipologia_carburante, isSelf, prezzoMedio, percentuale):- dis.distributore(idImpianto, gestore, bandiera, nome_impianto, indirizzo, comune, provincia, regione, latitudine, longitudine), pr.prezzi (idImpianto, prezzo, tipologiaCarburante, isSelf), car. statistiche(tipologiaCarburante, prezzoMedio, percentuale)
mapping gav – 2 citta(provincia, descrizione, stemma, nomeBar, latitudineBar, longitudineBar, nomeMonumento, latitudineMonumento, longitudineMonumento):- wi.comune(provincia, descrizione, stemma), br.bar(provincia, nomeBar, latitudineBar, longitudineBar),mon.monumenti(nomeMonumento, provincia, latitudineMonumento, longitudineMonumento) comune(citta, provincia, regione, latitudineCitta, longitudineCitta):- is.comune(citta, provincia, regione, latitudineCitta, longitudineCitta)
Mapping lav – 1 abc.farmacia(comune, provincia, regione, nome, via, telefono, orario):- farmacia(nome, comune, provincia, regione, via, telefono, orario, v3, v4) salute.farmacia(comune, provincia, regione, via, nome, latitudine, longitudine):- farmacia(nome, comune, provincia, regione, via, v1, v2, latitudine, longitudine) dis. distributori(idImpianto, gestore, bandiera, nome_impianto, indirizzo, comune, provincia, latitudine, longitudine):- carburante(idImpianto, gestore, bandiera, nome_impianto, indirizzo, comune, provincia, latitudine, longitudine, v1, v2, v3, v4, v5, v6) pr. prezzi(idImpianto, tipologia_carburante, prezzo, isSelf):- carburante(idImpianto, v1, v2, v3, v4, v5, v6, v7, prezzo, tipologia_carburante, isSelf, v8, v9, v10) car. statistiche(tipologiaCarburante, prezzoMedio, percentuale):- carburante(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, tipologiaCarburante, prezzoMedio, percentuale)
Mapping lav – 2 wi.comune(provincia, immagineUrl, descrizione):- citta(provincia, descrizione, immagineUrl, v1, v2, v3, v4, v5, v6) mon. monumenti(nomeMonumento, provincia, latitudineMonumento, longitudineMonumento):- citta(provincia, v1, v2, v3, v4, nomeMonumento, latitudineMonumento, longitudineMonumento) br.bar(provincia, nomeBar, latitudineBar, longitudineBar):- citta(provincia, v1, v2, nomeBar, latitudineBar, longitudineBar, v3, v4, v5) gp.place(nome, raggio, tipologia, aperto_adesso, latitudine, longitudine):- autolavaggio(nome, raggio, tipologia, aperto_adesso, latitudine, longitudine) gp.place(nome, raggio, tipologia, aperto_adesso, latitudine, longitudine):- dottori(nome, raggio, tipologia, aperto_adesso, latitudine, longitudine) is.comune(citta, provincia, regione, latitudineCitta, longitudineCitta):- comune(citta, provincia, regione, latitudineCitta, longitudineCitta)
query – 1 Data una città, recuperare tutte le informazioni circa i distributori di carburante presenti in quella zona, con i relativi prezzi cerca_distributori(comune, provincia, indirizzo, marca, tipologia, prezzo):- carburante(_, _, marca, _, indirizzo, comune, provincia, _, _, prezzo, tipologia, _, _, _, _), comune=“salerno”, provincia=“salerno” SELECT comune, provincia, indirizzo, marca, tipologia, prezzo FROM carburante where comune=“salerno”, provincia=“salerno”
query – 2 Data una città, recuperare le informazioni inerenti alla città, come la storia e i monumenti storici presenti informazioniCitta(storia, immagine, nomeMonumenti):- citta(provincia, storia, immagine, _, _, _, nomeMonumenti, _, _), provincia=“salerno” SELECT storia, immagine, nomeMonumenti FROM citta WHERE provincia=“salerno”
query – 3 Date le coordinate di una città, recuperare le informazioni inerenti ai dottori trovaDottori (nome, aperto, latitudine, longitudine) :- dottori(nome, raggio, tipologia, aperto, latitudine, longitudine), tipologia=“doctor”, raggio=“5”, comune(_,_,_lat,long), lat=“40.6786111“, long=” 14.765277“ SELECT nome, aperto_adesso, latitudine, longitudine FROM dottori, comune WHERE comune.latitudine=‘40.6786111’ AND comune.longitudine=‘14.765277’ AND raggio=’5’ AND tipologia=“doctor”
gav query unfolding Query sullo schema globale: cerca_distributori(comune, provincia, indirizzo, marca, tipologia, prezzo):- carburante(_, _, marca, _, indirizzo, comune, provincia, _, _, prezzo, tipologia, _, _, _, _), comune=“salerno”, provincia=“salerno” Unfolding: cerca_distributori(comune, provincia, indirizzo, marca, tipologia, prezzo):- dis.distributore(_, _, marca, _, indirizzo, comune, provincia, _, _, _), pr.prezzi (tipologia, prezzo, _, _), car. statistiche(_, _, _), comune=“salerno”, provincia=“salerno” Non ci sono semplificazioni da eseguire
lav bucket algorithm dis.distributori(idImpianto, gestore, bandiera, nome_impianto, indirizzo, comune, provincia, latitudine, longitudine):- carburante(idImpianto, gestore, bandiera, nome_impianto, indirizzo, comune, provincia, latitudine, longitudine, _, _, _, _, _, _) pr.prezzi(idImpianto, tipologia_carburante, prezzo, isSelf):- carburante(idImpianto, _, _, _, _, _, _, _, prezzo, tipologia_carburante, isSelf, _, _, _) car.statistiche(tipologiaCarburante, prezzoMedio, percentuale):- carburante(_, _, _, _, _, _, _, _, _, _, _, _, tipologiaCarburante, prezzoMedio, percentuale) Query: cerca_distributori(C, PROV, I, M, T, P):- carburante(_, _, M, _, I, C, PROV, _, _, P, T, _, _, _, _), C=“salerno”, PROV=“salerno” Bucket: [dis.distributori(ID, G, B, NM, I, C, P, LAT, LON), pr.prezzi(ID, T, P’, IS’), car.statistiche(T,PR’,PER’)]
lav bucket algorithm Unfolding produce una solo query che è quella di partenza q1= cerca_distributori(C, PROV, I, M, T, P):- carburante(_, _, M, _, I, C, PROV, _, _, P, T, _, _, _, _), C=“salerno”, PROV=“salerno”
TECNOLOGIE UTILIZZATE