Università degli Studi di Brescia
Facoltà di Ingegneria
Corso di Laurea in Ingegneria Elettronica
Dipartimento di Elettronica per l’Automazione
Tesi di Laurea
Metodi e strumenti per
l’interrogazione di ontologie di
dominio
Relatore:
Ch.ma Prof.ssa Valeria De Antonellis
Correlatori:
Dott. Michele Melchiori
Dott.ssa Sabrina De Capitani di Vimercati
Laureando:
Pietro Martinelli
matricola 35043
Anno Accademico 2001-2002
Questo lavoro rappresenta, naturalmente, la conclusione di un cammino
iniziato cinque anni fa, tra incertezze, dubbi e, forse, un po’ di paura. D’altra
parte, esso conclude anche un periodo della mia vita, legato a doppio filo
al mio ruolo di studente, e mi “costringe”, in qualche modo, a “diventare
grande”. . . Esso può dunque essere una buona occasione per ringraziare le
persone che, in un modo o nell’altro, mi hanno accompagnato in tutti questi
anni, che mi sono state vicine, con la loro presenza, il loro affetto, il loro
pensiero. . . o che, per qualunque motivo, sono state e sono importanti per
me, e per la mia vita. . .
Grazie dunque, prima di tutto, ai miei genitori, che in tutto questo tempo
hanno sempre costituito un punto di riferimento ed un aiuto insostituibili,
nei momenti di “scelta” come nella vita di ogni giorno, e che mi hanno reso
possibile arrivare fin qui. E grazie a Maddalena, mia amica prima che mia
sorella, che mi sopporta quotidianamente, pur sostenendo che “non c’è niente
di più inutile di un ingegnere”. . .
Grazie poi a tutti i miei amici, ed in particolare (in rigoroso ordine alfabetico) ai più cari: ad Antonella, amica. . . e non solo, a Beppe, per il nostro
essere in sintonia su tutto, tranne che sul calcio, e a Nicola, splendido e
paziente compagno di scuola da tredici anni a questa parte...
Vorrei poi ringraziare tutta la mia famiglia, in primis i miei cugini, per la
loro simpatia, e poi i miei zii, zie e nonni, quelli che ci sono e quelli che non
ci sono più, per essere stati sempre, per me, un esempio ed un riferimento
assai importante.
A proposito di questo lavoro, vorrei ringraziare la prof.ssa De Antonellis,
per la gentilezza e la competenza con la quale mi ha seguito fin dall’inizio,
il Dr. Melchiori, per la precisione e la puntualità delle sue correzioni e dei
suoi consigli, e tutti i ragazzi che hanno lavorato in laboratorio “sulla sedia
accanto alla mia”, rendendo divertenti e meno faticosi questi mesi di intensa
attività: grazie dunque a Devis, Antonio, Paolo, Denise e, ovviamente !, alla
mitica coppia Nicola & Nicola, compagni insostituibili di mille elaborati.
Grazie poi a Mike & Scalo, per aver sofferto, pianto e gioito con me
durante e dopo le partite dell’Inter, aiutandomi ad accantonare, per un po’,
la tensione di queste ultime settimane. E grazie a tutte le ragazze ed i ragazzi
che hanno diviso con me, negli ultimi cinque anni, lezioni ed esami, paure e
preoccupazioni.
Infine, un grazie a Francesco Guccini e Fabrizio De Andrè, per aver scritto
una canzone per ogni possibile stato d’animo, e per avermi aiutato cosı̀ ad
imparare “la mia distanza dalle stelle”; a Leonardo da Vinci, per aver inventato la bicicletta, compagna splendida ed insostituibile di tanti chilometri e
di tante emozioni; ad Ernesto Guevara, per la sua vita e non solo; a René Descartes, per aver inventato la geometria analitica, passione insolita ma non
i
per questo meno bella; a Dante Alighieri ed Isaac Asimov, grandissimi ed
irraggiungibili maestri di che cosa significhi sognare.
Grazie anche a tutti gli altri, alle innumerevoli persone che avrei voluto
ricordare ma non ho citato per il semplice motivo che tutta questa sfilza di
nomi mi sembra già abbastanza noiosa e melensa. In ogni caso, loro lo sanno.
Pietro.
ii
E respirava difficile, come un ciclista in salita,
un respiro che era ritmo sporco e pena.
Alessandro Baricco,“City”
Mi piace sentirmi parlare. È una delle cose
che mi diverte di più. Spesso sostengo lunghe
conversazioni con me stesso e sono cosı̀ intelligente che a volte non capisco nemmeno una
parola di quello che dico.
Oscar Wilde,“Il razzo illustre”
iii
Indice
1 Introduzione
1
2 Ontologie e ingegneria dell’informazione
2.1 Definizione di ontologia . . . . . . . . . . . . . . . .
2.2 Prospettive di utilizzo di ontologie . . . . . . . . . .
2.3 Cenni sulla costruzione di ontologie . . . . . . . . .
2.4 Linguaggi logici per la rappresentazione di ontologie
2.5 Il linguaggio concettuale X-Formalism . . . . . . . .
2.6 Il linguaggio ODLI 3 . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3
. 3
. 5
. 8
. 11
. 15
. 21
3 Utilizzo di ontologie
3.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . .
3.2 Modalità di utilizzo di ontologie: descrizione dettagliata .
3.3 L’architettura di ontologia a tre livelli in ARTEMIS . . .
3.4 Modalità di utilizzo di ontologie e linguaggi di ARTEMIS
.
.
.
.
.
.
.
.
.
.
.
.
29
29
30
34
36
4 Sviluppo di primitive per l’utilizzo di
4.1 Navigazione strutturale dell’ontologia
4.2 Ricerca di istanze di concetti . . . . .
4.3 Criteri di ricerca . . . . . . . . . . .
4.4 Primitive e categorie di utenti . . . .
4.5 Conclusioni . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
40
40
43
45
48
49
.
.
.
.
51
52
54
57
64
ontologie
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
5 Modello di ricerca per ontologie
5.1 Introduzione: un motore di ricerca basato su ontologie
5.2 OQL per ontologie . . . . . . . . . . . . . . . . . . . .
5.3 Interfacce per comporre Query OQL . . . . . . . . . .
5.4 Gestione di una Query OQL: costruzione della risposta
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
6 Progetto e implementazione di interrogazioni in ARTEMIS 72
6.1 Introduzione . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
iv
6.2
6.3
6.4
6.5
6.6
Analisi e descrizione dei concetti rilevanti .
Progetto delle classi . . . . . . . . . . . . .
Traduzione di Query:rappresentazione delle
Traduzione di Query: algoritmi . . . . . .
Realizzazione dell’interfaccia utente . . . .
. . . .
. . . .
scelte
. . . .
. . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
72
79
90
92
98
7 Esempi di interrogazione su ontologie in ARTEMIS
109
7.1 L’ontologia di esempio . . . . . . . . . . . . . . . . . . . . . . 109
7.2 Alcune interrogazioni di esempio . . . . . . . . . . . . . . . . . 112
8 Conclusioni e sviluppi futuri
119
A Sintassi completa di ODLI 3
121
B Sintassi completa di OQL - Object Query Language
136
C La tecnologia CORBA
139
D Architettura dell’interfaccia grafica
143
E Codice completo degli esempi
148
E.1 Codice completo dell’ontologia utilizzata negli esempi . . . . . 148
E.2 Codice completo dello schema integrato utilizzato negli esempi 161
E.3 Codice completo delle interrogazioni di esempio . . . . . . . . 181
Bibliografia
189
v
Capitolo 1
Introduzione
La diffusione delle tecnologie Web rende accessibile ad un numero sempre
crescente di utenti un insieme di informazioni sempre più grande, potenzialmente illimitato, distribuito su sorgenti indipendenti ed eterogenee. Infatti,
in questi ultimi anni, numerose organizzazioni hanno iniziato a sperimentare
il Web a scopo di cooperazione e di ampliamento delle attività commerciali,
migliorando il volume e l’efficienza nello scambio di informazioni. Di conseguenza, i sistemi informativi aziendali sono stati (parzialmente) migrati
verso il Web ed è sorta quindi l’esigenza di disporre di metodi e strumenti
per accedere efficacemente ai dati informativi differenti ora resi disponibili
su Web da sorgenti informative autonome ed eterogenee.
In questo scenario, nasce la necessità di descrivere ed accedere le informazioni mediante un modello integrato, che dia una rappresentazione globale,
integrata e condivisa delle informazioni relative ad un particolare dominio,
astraendo dalle sorgenti cui le informazioni effettivamente appartengono.
In particolare, nell’ambito del progetto Artemis, sviluppato in una collaborazione tra il Dipartimento di Elettronica per l’Automazione dell’Università degli Studi di Brescia ed il Dipartimento di Scienze dell’Informazione
dell’Università di Milano, questi requisiti vengono soddisfatti definendo un
modello di ontologia a tre livelli, costruita a partire da sorgenti XML in
un dato dominio, che fornisce uno spazio di ricerca strutturato e permette l’interrogazione di sorgenti multiple senza che l’utente debba conoscere
preventivamente la loro locazione, il loro vocabolario ed i loro contenuti.
L’obiettivo di questa tesi è mettere a punto metodi e sviluppare strumenti
allo scopo di interrogare tale modello integrato, ovvero di rendere possibile
sfruttare l’ontologia a tre livelli per ottenere informazioni, sia sul modello
stesso, sia sul contenuto delle sorgenti che esso descrive.
Il nostro lavoro si rivolge in particolare nella direzione di realizzare strumenti di interrogazione indipendenti dal dominio modellato ed indipendenti
1
dalle sorgenti integrate. Tali strumenti devono rendere possibile un accesso
semplice, immediato e naturale alle informazioni che il modello contiene, indipendentemente dalle conoscenze pregresse dell’utente relative al processo
di modellazione ed al dominio modellato.
Per fare questo, è stato necessario fare uso di un insieme di linguaggi atti a
modellare concettualmente domini informativi, a darne una rappresentazione
ricca ed esauriente, e ad esprimere interrogazioni tanto sull’ontologia quanto
sulle sorgenti integrate. In tal senso, si fa uso del linguaggio X-Formalism per
modellare concettualmente l’ontologia, mentre la sua rappresentazione logica
è data mediante il linguaggio ODLI 3 , derivato dall’ambito della modellazione
di basi di dati ad oggetti. Infine, le interrogazioni sui modelli ontologici e
quelle sulle sorgenti locali sono espresse utilizzando il linguaggio OQL (Object
Query Language), anch’esso nato nell’ambito delle basi di dati ad oggetti.
Di seguito è illustrata l’organizzazione della tesi.
Nel Capitolo 2 si introduce il concetto di ontologia, illustrandone il possibile utilizzo in vari ambiti dell’Ingegneria dell’Informazione. Il Capitolo 3
prende quindi in esame le modalità di interazione con modelli di questo genere, valutando le peculiarità dovute alle diverse categorie di utenti e contestualizzando il tutto nell’ambito dei linguaggi utilizzati nel progetto Artemis.
Nel Capitolo 4 si passa poi allo sviluppo di una serie di primitive che rendono
possibile utilizzare in modo semplice un’ontologia nell’ottica delle modalità
di interazione individuate ed approfondite nel capitolo precedente. Il Capitolo 5 sviluppa quindi un modello di ricerca di informazioni in ontologie
basato sull’utilizzo del linguaggio d’interrogazione OQL; contestualizza poi
il concetto di query al caso specifico dei modelli ontologici; chiarisce di quali
informazioni è necessario disporre per passare da interrogazioni sul modello
ad interrogazioni sulle sorgenti di partenza, e propone infine un formalismo
concettuale per la rappresentazione di tali informazioni. Il Capitolo 6 descrive il progetto e l’implementazione di due moduli software che realizzano
le funzioni analizzate nel corso dei capitoli precedenti. I moduli forniscono
all’utente un’interfaccia che rende possibile navigare i concetti dell’ontologia e interrogare in modo naturale e flessibile l’ontologia stessa, curando la
riformulazione delle interrogazioni poste, in termini di interrogazioni da sottomettere alle singole sorgenti integrate. Un esempio di utilizzo di tali moduli
viene infine illustrato nel Capitolo 7.
2
Capitolo 2
Ontologie e ingegneria
dell’informazione
2.1
Definizione di ontologia
In letteratura si trovano spesso definizioni lievemente diverse di ontologia. In
genere, tali differenze sono motivate dal diverso punto di vista degli autori,
i quali tendono a spiegare questo concetto alla luce di ciò che nei loro lavori
interessa proporre ed enunciare. Volendo tenere conto di diverse definizioni,
una ontologia
1. è un vocabolario
2. è un modello di un particolare dominio della realtà
3. è una specificazione esplicita e formale di una concettualizzazione condivisa e comune
In particolare un’ontologia definisce in modo esplicito e formale un insieme di termini relativi ad un particolare dominio, dà un insieme di relazioni
tra questi termini, ed un insieme di regole semantiche che precisano i ruoli
ed i comportamenti dei concetti definiti nel dominio di interesse. Un’ontologia fornisce una base comune che può essere comunicata e che permette di
scambiare informazioni espresse in forme diverse [11].
Per quanto riguarda alcune possibili interpretazione del concetto di ontologia, specialmente alla luce delle esigenze che ne determinano l’importanza
(come discusso nella sezione seguente), si veda [20]. Per un esempio di utilizzo
di una definizione formale di ontologia come insieme di concetti e relazioni,
si veda (ad esempio) [19]. Infine, per una definizione di ontologia come
vocabolario con particolari caratteristiche si veda [16].
3
2.1.1
Motivazioni di fondo
Dato che, come si è detto, la definizione di ontologia dipende essenzialmente
dal punto di vista che si adotta, ed è dunque legata a ciò che con un’ontologia
ci si propone di fare, vediamo da quali esigenze pratiche è nato il concetto di
ontologia, in modo da capirne meglio il significato.
Sono molti i contesti nei quali esiste una grande varietà di informazioni
difficili da scambiare e da integrare a causa del differente linguaggio nel quale
sono espresse. Naturalmente una situazione di questo genere risulta spiacevole, per esempio perchè il fatto di non potersi scambiare della conoscenza fa sı̀
che tale conoscenza debba essere ricostruita ex-novo quando necessaria, e in
certi casi può non esserci affatto la possibilità di ricostruire una conoscenza.
Il concetto di ontologia nasce dalla necessità e dalla volontà di trovare
un modo per porre rimedio a situazioni nelle quali è impossibile, o quantomeno difficile, condividere e scambiare informazioni a seguito di differenze
tra i linguaggi parlati dai diversi agenti che operano in un ben determinato
dominio di conoscenza. Esso dunque rappresenta essenzialmente un mezzo
che permette di integrare informazioni provenienti da fonti eterogenee, e basa
la sua funzione su una conoscenza della semantica del dominio di interesse,
ovvero dei concetti e delle relazioni tra concetti che in tale contesto risultano
rilevanti, nonchè della terminologia ad essi relativa. Ora vedremo come la
necessità di utilizzare concetti come le ontologie possa nascere da differenti
tipologie di eterogeneità tra i linguaggi dei diversi agenti che si trovano a
voler condividere conoscenza.
Si è detto che il problema consiste essenzialmente nella differenza tra i
linguaggi parlati dai diversi agenti. In realtà, per differenza di linguaggio si
può intendere una incompatibilità di diversi tipi. Infatti, può darsi il caso di
agenti che parlino due lingue diverse: è il caso di un soggetto umano italiano
ed uno tedesco, che si trovino a non conoscere nessuna lingua comune, o di
due agenti automatici che utilizzino formati di ingresso ed uscita incompatibili. In questo caso è abbastanza evidente come la differenza di linguaggio sia
un problema. Tuttavia, per linguaggio si può intendere anche la terminologia
utilizzata da due agenti: si pensi al caso di due persone che parlano la stessa
lingua ma indichino gli stessi concetti con termini diversi, oppure utilizzino
gli stessi termini con sfumature semantiche diverse. Chiaramente, se nel caso
di due agenti umani che dialogano può aver luogo una forma di semantizzazione progressiva, ovvero un processo mediante il quale, nel corso del dialogo,
i due interlocutori si rendono conto delle differenze terminologiche e risolvono
il problema, nel caso di agenti automatici una situazione di incomprensione
di questo tipo, oltre ad essere potenzialmente molto più pericolosa di quella
indicata in precedenza, non si presta certo ad una soluzione spontanea ed
4
automatica da parte dei due interlocutori. Ancora, si può pensare a forme di
informazioni relative ad uno stesso dominio, espresse mediante analoga terminologia ma mediante formalismi diversi: si pensi per esempio all’utilizzo
di diversi formati per i documenti prodotti durante le diverse fasi del ciclo
di vita di un software (linguaggio naturale ed alberi di decomposizione per
l’analisi dei requisiti, diagrammi UML per la fase di progettazione, schemi
di collaudo basati su linguaggio naturale per la fase di test, . . . ), quando
chiaramente sarebbe comodo poter avere una vista complessiva sull’insieme
di tutte le varie fasi e dei vari documenti. Anche in questo caso, se questa
difficoltà può essere superata, con un certo costo, mediante l’intervento di esseri umani, è chiaramente difficile immaginare la possibilità di automatizzare
tale attività di integrazione.
Abbiamo presentato alcuni casi pratici nei quali risulta necessario porsi il
problema di trovare una base comune che permetta lo scambio di informazioni
e di conoscenza tra soggetti diversi che operano sullo stesso dominio ma, per
qualche motivo, non si capiscono. Come detto in precedenza, il concetto
di ontologia come noi lo intendiamo nasce da esigenze di questo genere, e
risulta pertanto definibile come una concettualizzazione formale e condivisa
del dominio di interesse. Nel seguito, dopo aver presentato in generale il
ciclo di vita della conoscenza, mostreremo come alcuni dei processi che lo
compongono possano essere realizzati con grande efficacia mediante l’utilizzo
di modelli ontologici.
Esempi dell’utilità delle ontologie per risolvere problemi come quelli qui
ricordati si trovano nella maggioranza degli articoli che di ontologie trattano.
In particolare, [20] costituisce in questo senso un’introduzione molto generale
ed articolata. [11] propone invece alcuni esempi di utilizzo di ontologie come
base per un’architettura orientata al commercio elettronico (tra aziende e
tra privati ed aziende). [16] discute dell’utilità di modelli di tipo ontologico
nell’ottica dell’integrazione di sorgenti web.
2.2
Prospettive di utilizzo di ontologie
Presentiamo ora alcuni esempi di particolari contesti di utilizzo di ontologie.
Essi, oltre a chiarire con maggiore precisione che cosa si intenda per ontologia,
daranno anche un’idea dell’utilità di tale concetto in situazioni pratiche.
2.2.1
Ontologie come strumento di comunicazione
Come ampiamente ricordato in precedenza, l’utilizzo di ontologie riduce la
confusione concettuale e terminologica, rendendo disponibile una base di la5
voro unitaria ed esplicita all’interno di un dato dominio. In questo modo, esso
rende possibile la comprensione e la comunicazione tra persone con differenti
esigenze e punti di vista, dovuti ai rispettivi contesti. Ecco alcuni aspetti
di uso di ontologie che facilitano la comunicazione tra persone all’interno di
una organizzazione.
• Modello normativo: all’interno di un sistema software di grandi dimensioni, è sensato immaginare che parecchie persone siano nella necessità di avere una comprensione condivisa del sistema e delle sue
finalità. Come già visto, l’utilizzo di ontologie permette, attraverso
la realizzazione di un modello normativo del sistema, di creare una
definizione semantica del sistema stesso, e dunque di rendere disponibile un modello estendibile che può essere successivamente raffinato, il
quale permette trasformazioni semantiche tra differenti contesti (“viste” dei diversi soggetti). In questo modo, un modello incentrato su
regole di trasformazione (assimilabili alle regole di mapping ricordate
in precedenza) rende possibile la suddetta comprensione condivisa del
sistema, senza forzare le persone coinvolte a cambiare il loro punto di
vista sul sistema stesso, ma ponendosi semplicemente come mediatore
tra le “viste” che i diversi soggetti hanno.
• Rete semantica: è poi possibile utilizzare le ontologie per creare una
rete di relazioni semantiche, che tenga traccia dei collegamenti tra le
diverse entità di un dominio, e per rendere possibile una semplice navigazione di tale rete. E’ chiaro che una rete di questo genere è comunque
implicita in un dato dominio o sistema, tuttavia differenti soggetti possono avere di tale rete di relazioni implicita una percezione diversa, a
seconda dei loro punti di vista ed interessi (od esigenze) particolari e
delle loro diverse assunzioni. Tutto ciò è dovuto essenzialmente alla
mancanza di un accordo condiviso a proposito delle relazioni chiave
all’interno del sistema. Tutto questo è particolarmente importante per
quanto riguarda sistemi che utilizzino diverse ontologie provenienti da
differenti domini: le ontologie servono a questo punto per esplicitare tutte le assunzioni alla base dei modelli e delle reti di relazioni, in
modo da identificare le connessione logiche tra gli elementi di modelli
diversi. Ancora una volta, il ruolo dell’ontologia è quello di mediatore,
questa volta essenzialmente tra diversi insiemi di assunzioni a proposito
di modelli e relazioni tra entità.
• Consistenza e mancanza di ambiguità: uno dei ruoli più importanti che le ontologie giocano nella comunicazione è quello di costituire
una definizione priva di ambiguità per i termini utilizzati in un dominio
6
o in un sistema software. Inoltre, il carattere di formalità di tale definizione rende possibile interventi di verifica e mantenimento automatici
della consistenza dell’insieme stesso di definizioni.
2.2.2
Ontologie ed interoperabilità (persone, tools) Ontologie come INTERLINGUA
Alcune applicazioni delle ontologie sono rivolte a permettere l’interoperabilità tra differenti utenti con la necessità di scambiare dati o di utilizzare
differenti sistemi software. Un tema assai importante in questo senso è quello di realizzare un substrato, un ambiente integrato, che permetta di far
cooperare differenti sistemi software, i quali in partenza utilizzano formati e
terminologie non direttamente compatibili. E’ chiaro che pensare ad una cooperazione tra n sistemi che “non si capiscono” senza utilizzare alcuno strato
intermedio rende necessario sviluppare interfacce di comunicazione tra ogni
coppia di sistemi, ovvero in totale n (n - 1) / 2 traduttori specifici. Come
è noto dalla conoscenza dei criteri base della progettazione di compilatori,
l’utilizzo di un “linguaggio intermedio” tra i vari linguaggi possibili riduce il
numero di traduttori necessari a 2n (n nel caso di interfacce di conversione
bidirezionali). Tale linguaggio intermedio, naturalmente, costituisce l’ambiente integrato entro il quale far collaborare i diversi sistemi o soggetti, ed è
realizzabile mediante l’utilizzo di una ontologia per la traduzione dei diversi
formati (di nuovo, mediante regole di mapping). Ancora una volta, l’ontologia si candida ad essere un efficace mediatore tra soggetti che non siano in
grado di “capirsi” direttamente. L’aspetto interessante è che un tale approccio all’integrazione di sistemi diversi con la necessità di cooperare non rende
necessario apportare alcuna modifica ai sistemi stessi, ma solo realizzare il
substrato comune e le varie interfacce di traduzione verso i formati specifici
dei diversi sistemi. In pratica, si tratta di realizzare un’ontologia del dominio
di interesse e di scrivere le regole di traduzione (di mapping) per ogni sistema
interessato all’integrazione.
2.2.3
Ontologie e Ingegneria del Software
Una comprensione concordata e condivisa del problema da risolvere può assistere con profitto nella specificazione di un sistema software. Ad esempio,
il Businnes System Development Method (BSDM) della IBM utilizza un’ontologia dell’organizzazione come base per progetto e sviluppo nell’ambito
dell’Information Technology. Naturalmente, il ruolo dell’ontologia nella specifica varia con il grado di formalità e di automatizzazione che si utilizza
7
nella metodologia di progetto. In un approccio informale, le ontologie facilitano la comprensione dei processi e l’identificazione dei requisiti del sistema,
nonchè la comprensione delle relazioni tra le componenti del sistema. Ciò
è particolarmente importante nel caso di sistemi sviluppati da team distinti
che operano su domini diversi. Ancora una volta, il ruolo dell’ontologia come
mediatore si dimostra assai utile. In un approccio più formale, un’ontologia permette di fornire una specifica dichiarativa del sistema che si intende
realizzare. Anche in questo caso, la possibilità di operare verifiche automatiche su una specifica formale risulta assai importante (si pensi per esempio
alle metodologie di specifica formale dei requisiti utilizzate nell’Ingegneria
del Software). In questo modo, è possibile fornire garanzie di robustezza e
di completezza delle specifiche, con chiare, positive conseguenze sulla qualità
del prodotto finale. D’altro canto, è sensato pensare che ad una specifica
formale dei requisiti di un sistema software si possa far corrispondere, entro
certi limiti, uno svolgimento automatico, o pseudo-automatico, dei successivi
passi dello sviluppo del software.
2.3
2.3.1
Cenni sulla costruzione di ontologie
Le metodologie
L’aspetto principale da tenere in considerazione quando si costruisce un’ontologia è la sua caratteristica di concettualizzazione condivisa tra più soggetti.
Di conseguenza, le diverse tipologie di approccio alla progettazione ed alla
realizzazione di un modello ontologico si differenziano, tra l’altro, in base al
grado di partecipazione di tali diversi soggetti allo sforzo di concettualizzazione del dominio di interesse. In particolare, considerando anche il punto di
vista adottato dagli sviluppatori rispetto alle particolari istanze del dominio
che si vuole andare a rappresentare, si possono distinguere cinque approcci
principali (più eventuali soluzioni ibride) alla progettazione di ontologie:
• Approccio “ispirato” un solo sviluppatore parte da una premessa
circa il perchè sia richiesta un’ontologia e, basandosi esclusivamente
sulla propria immaginazione e creatività, e sul proprio punto di vista a
proposito del dominio d’interesse, progetta e sviluppa l’ontologia.
• Approccio induttivo: l’ontologia è sviluppata osservando, esaminando ed analizzando casi specifici (istanze) nel dominio d’interesse.
• Approccio deduttivo: al contrario, un approccio deduttivo è concepito adottando alcuni principi generali ed applicandoli adattativamente
8
fino a costruire una ontologia orientata ad un dominio specifico. In pratica, prevede la specializzazione ad un particolare dominio di un insieme
di nozioni di validità generale.
• Approccio sintetico: uno sviluppatore identifica un insieme di ontologie, scelte in modo che nessuna costituisca un sottoinsieme di un’altra.
L’insieme delle caratteristiche di queste ontologie di base, insieme ad
altri concetti selezionati che si riferiscono al dominio che dev’essere descritto, viene sintetizzato in modo da costruire una ontologia unificata.
Un’operazione di questo tipo coinvolge fasi di integrazione sistematica
dei concetti, di eliminazione delle incompatibilità e di riconciliazione
delle diverse terminologie.
• Approccio collaborativo: in questo caso, lo sviluppo dell’ontologia è il risultato dello sforzo congiunto di tutti, o comunque di molti,
i possibili utilizzatori dell’ontologia stessa, allo scopo di rispecchiare
esperienze e punti di vista di persone diverse che cooperano in modo
da ottenere una rappresentazione il più possibile generale e flessibile del
dominio d’interesse. In particolare, un’attività di questo tipo può proficuamente essere incentrata attorno alla figura di un progettista o di
un gruppo di progettisti che realizzano un prototipo iniziale dell’ontologia (ad esempio, basandosi su uno degli approcci visti in precedenza);
compito di tale o tali progettisti è poi quello di proporre ad ogni soggetto che collabora allo sviluppo il prototipo iniziale, e di recepire quindi
le indicazioni di tutti i collaboratori a proposito delle aggiunte o delle
variazioni necessarie per perfezionare il prototipo. Questi due passi,
distribuzione del prototipo corrente e raccolta di opinioni (variazioni
ed aggiunte), vengono auspicabilmente svolti in modo iterativo, onde
pervenire all’ontologia tramite una serie di raffinamenti incrementali.
In pratica, l’idea è quella di un gruppo di esperti di ontologie che guidi
un gruppo di esperti del dominio nei passi necessari ad ottenere un
modello completo e soddisfacente.
2.3.2
Commenti e confronti critici
In generale, è evidente come la scelta di uno di questi approcci non dipenda
da criteri generali di validità, bensı̀ principalmente da considerazioni relative alle particolari caratteristiche e necessità del caso pratico in questione.
Ad esempio, è abbastanza chiaro che un approccio come quello cosiddetto
ispirato risulta assolutamente sensato ed efficace qualora il punto di vista
dello sviluppatore sia molto simile, o meglio ancora uguale, a quello degli
9
utilizzatori dell’ontologia. In caso contrario, un approccio di questo genere può costringere i soggetti diversi dallo sviluppatore ad adattarsi al suo
punto di vista, il che rischia di fare perdere quei vantaggi di mediazione tra
“viste” diverse che abbiamo indicato, ripetutamente, come l’essenza dell’utilizzo di ontologie. In questo senso è quindi facile pensare che un approccio
più vantaggioso possa essere quello cosiddetto collaborativo, che permette
una miglior copertura dei punti di vista di possibili diverse tipologie di utenza. Un modello ontologico costruito in questo modo, dunque, si propone
potenzialmente come il migliore dal punto di vista della generalità, essendo
originato da uno sforzo di comunicazione e di precisazione di diverse aspetti
del dominio di interesse ad opera di persone diverse. Tuttavia, l’approccio
collaborativo comporta anche alcuni aspetti svantaggiosi, correlati in particolare al numero di persone coinvolte nel progetto, certo maggiore di quanto
non sia negli altri casi. Un incremento eccessivo di tale numero di persone
comporta tempi sensibilmente allungati per quanto riguarda ogni iterazione
delle fasi di presentazione del prototipo e di raccolta del feedback. D’altra
parte, può condurre in certi casi ad una fase di stallo, nel momento in cui le
esigenze ed i punti di vista di diversi collaboratori dei progettisti “centrali”
si trovino ad essere in qualche modo incompatibili. In sostanza, dunque, una
scelta come quella di approccio collaborativo alla realizzazione di ontologie
rende di vitale importanza l’abilità dell’esperto nel coordinare i diversi soggetti che collaborano alla realizzazione dell’ontologia, e nel mediare tra le
diverse spinte derivanti dal contrapporsi di punti di vista diversi a proposito
del modello da realizzare.
Per quanto riguarda le altre tipologie di approccio, è necessario sottolineare come nessuna di esse sembri poter condurre a modelli la cui generalità
sia paragonabile a quella di ontologie costruite mediante approccio collaborativo. Il caso di approccio induttivo, ad esempio, ha il chiaro pregio di
conformarsi bene a casi reali di utilizzo dell’ontologia. Tuttavia, questo pregio costituisce in qualche misura anche il limite principale di una scelta di
progetto come questa: infatti, la validità del risultato ottenuto dipende essenzialmente dalla generalità e dalla completezza (rispetto alla totalità dei
casi possibili o almeno probabili) dei casi pratici considerati come punto di
partenza dello sviluppo. D’altra parte, approcci come quello deduttivo o
come quello sintetico hanno il grosso limite di essere scollegati sia da casi
particolari (istanze del dominio di riferimento), sia dal rapporto con esperti
del dominio da modellare. In pratica, la bontà e la completezza del risultato
finale dipendono in misura estremamente elevata dall’abilità dell’esperto di
ontologie che si occupa della modellazione, dalle caratteristiche e dalla validità dei principi generali o delle ontologie preesistenti che si utilizzano come
punto di partenza, e dunque anche dal tipo di dominio su cui si opera (più o
10
meno astratto, più o meno in evoluzione). In pratica, approcci come questi
risultano probabilmente interessanti ed azzeccati in casi molto particolari,
ma non sembrano dimostrare caratteristiche di validità generale.
Una panoramica dei diversi approcci che è possibile adottare per sviluppare un’ontologia è presentata in [15], con particolare attenzione per quanto
riguarda l’approccio collaborativo, a proposito del quale è dato anche un
esempio di modus operandi da parte dell’esperto di ontologie.
2.4
2.4.1
Linguaggi logici per la rappresentazione
di ontologie
Concetti di base
Una distinzione estremamente importante che è necessario tenere in considerazione parlando di linguaggi di rappresentazione di ontologie, è quella tra
livello di rappresentazione concettuale e logica. Il livello concettuale, in particolare, si riferisce (si pensi ai diagrammi Entity - Relationship nel caso di
basi di dati) ai concetti presenti nella realtà che si vuole rappresentare, ed
alle relazioni che tra questi concetti intercorrono. Si tratta dunque di una
rappresentazione legata non tanto ad una esigenza implementativa, quanto
invece ad una esigenza descrittiva. Il livello logico, al contrario, rappresenta
in qualche modo una implementazione di quanto espresso a livello concettuale, il cui scopo è quello di fornire una rappresentazione di una determinata
realtà che sia utilizzabile e gestibile automaticamente, o risulti comunque
formalizzata in modo più preciso e meno di alto livello di quella concettuale.
Quanto detto nelle sezioni precedenti è stato volto essenzialmente a dare
un’idea dei concetti con cui ci si trova a trattare nell’ambito dei modelli ontologici. La presente sezione si propone invece di illustrare come sia possibile
dare una rappresentazione di una ontologia da un punto di vista logico, ovvero una rappresentazione scritta in un linguaggio ben definito, utilizzabile
come punto di partenza concreto dell’utilizzo del modello.
2.4.2
Tipologie di linguaggi ed esempi
È necessario prima di tutto distinguere tra due principali filoni di linguaggi. Infatti, se esistono linguaggi pensati genericamente per rappresentare
ontologie, la tipologia di applicazione dei modelli ontologici basata su web,
genericamente indicata sotto l’etichetta di Semantic - Web, ha portato allo
sviluppo di linguaggi specifici per la rappresentazione di ontologie su web.
11
In particolare, tali linguaggi condividono in genere la caratteristica di appoggiarsi per quanto riguarda la sintassi su linguaggi preesistenti e general
purpose, dei quali costituiscono una sorta di estensione ottenuta mediante
costrutti e vincoli specifici. È il caso ad esempio di linguaggi come OIL, la cui
sintassi è basata su quella di RDF (definizioni di tipo per documenti XML), o
SHOE, la cui sintassi è basata su SGML ed XML, o come RDF stesso il quale, in quanto linguaggio utilizzato per definire tipi, si presta abbastanza bene
a rappresentare nozioni di natura semantica come concetti, strutturazione
di concetti e relazioni (link) fra concetti (cosı̀ come DTD, altro formalismo
per la definizione di tipi basato su XML). Ancora, possiamo ricordare XOL,
linguaggio di definizione di ontologie basato su XML, che differisce da un
linguaggio dedicato come Ontolingua essenzialmente per il fatto che utilizza
una sintassi di tipo XML invece che una sintassi propria (ad esempio, con
notazione funzionale, tipo Lisp). A titolo esemplificativo di questa categoria,
per dare un’idea del tipo di formalismo coinvolto, proponiamo un esempio in
XOL:
<class>
<name>person</name>
</class>
<slot>
<name>age</name>
<domain>person</domain>
<value-type>integer</value-type>
<numeric-max>150</numeric-max>
</slot>
<individual>
<name>Fred</name>
<type>person</type>
<slot-values>
<name>age</name>
<value>35</value>
</slot-values>
</individual>
A proposito invece dei linguaggi pensati appositamente per la rappresentazione di ontologie, sembra interessante illustrare le principali tipologie che
è possibile individuare, dal punto di vista della filosofia di fondo del linguaggio e del tipo di concetti che esso utilizza. È tuttavia indispensabile notare
12
come, accanto ad un utilizzo diretto dei linguaggi per rappresentare ontologie, sia assai importante anche il filone di progetti e strumenti applicativi
incentrati attorno al tema dell’utilizzo di ontologie, il cui scopo in genere è
quello di automatizzare la gestione di un certo numero di sorgenti di informazioni presenti su web (è il caso ad esempio del progetto Ontobroker, che
utilizza come formato di rappresentazione la Frame - logic, linguaggio basato
su frame del quale si darà esempio dopo), oppure quello di permettere la costruzione e l’utilizzo di ontologie senza necessariamente dover interagire con
un linguaggio logico formale, ma basandosi esclusivamente su un interfaccia
di tipo grafico (è il caso, ad esempio, del sistema Protege 2000, che si basa
per la rappresentazione interna su RDF e SHOE).
Una rassegna completa e dettagliata delle tipologie di linguaggi di rappresentazione di ontologie, e di esempi, è presente in [5].
Si prenderanno ora in considerazione linguaggi basati su frame e linguaggi basati su un’architettura ad oggetti, tipologie fondamentali dei linguaggi
dedicati alla rappresentazione di ontologie, dando esempio di casi particolari
dell’uno e dell’altro tipo, nonchà di eventuali progetti che utilizzano l’uno
piuttosto che l’altro tipo di formalismo.
Linguaggi basati su Frame
Si tratta di linguaggi che prevedono primitive per la gestione di definizione,
estensione ed istanziazione di classi, definizione di attributi, specifica di valori, definizione di predicati e regole. In genere, predicati e regole, cosı̀ come, in
un secondo momento, le interrogazioni, vengono rappresentati mediante una
sintassi derivata dalla logica del primo ordine, per la quale esistono importanti e ben noti risultati teorici a proposito delle possibilità e delle tecniche
di computazione e di ottimizzazione del calcolo automatico. In particolare,
le regole prevedono l’utilizzo dei consueti connettivi logici (AND, OR, NOT,
implicazione), e di variabili quantificate universalmente od esistenzialmente.
È il caso, ad esempio, di Ontolingua, o del linguaggio Frame - logic utilizzato per rappresentare ontologie all’interno del progetto Ontobroker, del quale
mostriamo ora un esempio di rappresentazione di un’ontologia:
Object[].
Person :: Object.
Employee :: Person.
Researcher :: Employee.
Student :: Person.
Publication :: Object.
Organization :: Object.
13
Person
[
firstName =>> STRING;
lastName =>> STRING;
eMail =>> STRING;
publication =>> Publication;
].
Employee
[
affiliation =>> Organization;
].
Researcher
[
cooperatesWith =>> Researcher;
worksFor =>> Organization;
]
Publication
[
author =>> Person;
title =>> STRING;
year =>> NUMBER;
abstract =>> STRING;
]
FORALL Person1, Person2
Person1:Researcger[cooperatesWith ->> Person2] <Person2:Researcher[cooperatesWith ->> Person1].
FORALL Person1, Publi
Person1:Person[publication ->> Publi] <->
Publi:Publication[author ->> Person1].
Esempio di interrogazione (ricerca di informazioni):
FORALL Obj, LN, EM <Obj: Researcher[firstName ->> "Pietro";
lastName ->> LN;
14
email ->> EM],
che richiede cognome ed e - mail di tutti i ricercatori di nome Pietro.
Linguaggi orientati agli oggetti
Sono linguaggi la cui funzione è quella di rappresentare un insieme di entità (concetti ed istanze in corrispondenza di classi ed oggetti) mediante
un’architettura analoga a quella dei comuni linguaggi di programmazione ad
oggetti (come Java o C++). In questo senso, uno sforzo normativo è dato
dall’esistenza di standard internazionali che fungono da riferimento per la
descrizione di sistemi ad oggetti, standard che possono essere estesi allo scopo di risolvere il problema specifico della rappresentazione di ontologie. E’
il caso ad esempio del linguaggio logico ODLI3, sviluppato come estensione
dello standard ODMG-93 per la rappresentazione di architetture ad oggetti.
Nella sezione 2.6 forniamo, a titolo di esempio completo di linguaggio per la
rappresentazione di ontologie, una panoramica completa delle potenzialità e
dei costrutti principali di tale linguaggio.
2.5
Il linguaggio concettuale X-Formalism
Il linguaggio X-formalism è stato definito nell’ambito del progetto Artemisper la rappresentazione concettuale di schemi di dati XML. Il linguaggio
X-formalism prevede tre tipi principali di entità, definiti X-type, X-class
ed EXF Frame (EXF sta per eXtended X-Formalism), quest’ultimo definito
semplicemente come insieme di X-types ed X-classes. Di tali concetti viene
data una definizione formale, in termini di parti che li costituiscono: per
esempio, un X-type è definito come una quadrupla, che comprende un nome
(eventualmente con un tipo padre), un modello del contenuto (una sorta di
struttura di quanto segue), una lista di proprietà (ognuna con nome, tipo ed
eventuale tipo padre, cardinalità, lista di attributi), un insieme di attributi.
Ogni attributo è visto a sua volta come una tripla, formata da un nome, un
tipo ed una cardinalità. Definizione dello stesso genere viene quindi data per
una X-class.
È importante sottolineare come definizioni di questo genere permettano
di rappresentare con estrema facilità i DTD e gli XML-Schema, la cui struttura ricalca quella formalizzata nelle definizioni di X-type ed X-class. Come
appare evidente, questo genere di rappresentazione, estremamente comodo
se si tratta di rappresentare, magari automaticamente, la struttura di DTD
ed XML-Schema, e dunque poi di ricavare conoscenza da documenti XML
che a tali modelli del contenuto si rifanno, risulta abbastanza ostica per una
15
lettura immediata da parte di una persona. Si è pensato dunque di dare una
rappresentazione grafica di ogni concetto utilizzato in X-formalism (classi,
attributi, proprietà, link tra classi. . . ), onde semplificare il più possibile l’approccio umano a questo tipo di rappresentazione concettuale di ontologie. Di
seguito, diamo una breve spiegazione testuale dei concetti che intervengono
nella definizione di una X-class, e le primitive di traduzione in un linguaggio
grafico (figura 2.1). Quindi, riportiamo un esempio di XML-schema (figura
2.2.(a)) ed uno di DTD per documenti XML (figura 2.2.(b)), la concettualizzazione del secondo mediante X-formalism (figura 2.3) e la rappresentazione
grafica di tale concettualizzazione (figura 2.4). Una X-classe rappresenta
un insieme di elementi con una struttura comune. Per struttura si intende
un insieme di proprietà e/o di nomi di X-classi referenziate. Una proprietà
(property) di una X-classe descrive una caratteristica di un elemento rappresentato dalla X-classe; essa è costituita, come già ricordato, da un nome,
un tipo, una cardinalità ed una lista di attributi. Una X-classe referenziata
(referenced X-class) per una X-classe c è una X-classe c’ che appare nella
struttura di c; un concetto di questo tipo serve per esprimere una relazione
tra la X-classe c e la X-classe c’. Un link, caratterizzato da nome e tipo, serve per descrivere relazioni tra diversi documenti. Un attributo (attribute),
caratterizzato da nome e tipo, descrive una caratteristica addizionale di una
proprietà, di un link, di una X-classe. Tali concetti vengono rappresentati
graficamente mediante le primitive riportate in figura 2.1
Concept
Graphical representation
X-class
=⇒
property
link
attribute
referenced class
or
union structure
and
sequence structure
Figura 2.1: Primitive per la rappresentazione grafica di X-formalism
(Si noti che per union structure si intende l’alternativa tra due (o più)
16
strutture, mentre per sequence structure si intende la concatenazione di due
(o più) strutture. In particolare, se s1 ,s2 ,. . . ,sn sono strutture, dal punto di
vista formale (s1 ,s2 ,. . . ,sn ) è una sequence structure, mentre (s1 |s2 ) è una
union structure).
Per una definizione formale completa di X-formalism, si vedano [4] e [7].
Accanto a quanto è stato detto a proposito di DTD ed X-formalism,
ricordiamo che un’estensione di tale linguaggio (X-formalism esteso) è
stata successivamente introdotta allo scopo di modellare in modo semplice ed
efficace una diversa tipologia di rappresentazione della struttura generale di
documenti XML, chiamata XML Schema. L’idea di fondo rimane ovviamente
sempre quella di fornire un modello formale della struttura di documento in
questione, allo scopo di integrare poi facilmente le informazioni contenute
nei documenti che istanziano lo schema in questione. Le estensioni principali
rispetto ad X-formalism riguardano una gestione più dettagliata e fine dei
meccanismi di tipizzazione, per esempio la possibilità di definire liste, gruppi
di elementi, meccanismi di indicizzazione mediante chiavi e chiavi esterne,
derivazione di nuovi tipi da tipi esistenti, ed altre caratteristiche ancora.
Per una presentazione più completa e dettagliata a proposito di X-formalism
esteso, si veda [12].
È importante infine notare come un meccanismo di traduzione del modello formale in un modello grafico sia stato elaborato anche per X-formalism
esteso: com’è facile immaginare, le primitive grafiche (figura 2.5) sono strettamente collegate a quelle già mostrate in precedenza, dalle quali d’altra
parte derivano. Di seguito, diamo un elenco di tali primitive, ed un esempio
di modello grafico di un XML Schema.
17
<?xml version=‘‘1.0’’ ?>
<!DOCTYPE products SYSTEM ‘‘product.dtd’’>
<products>
<computer brand=‘‘toshiba’’>
<PC>
<name>Satellite Pro 4200</name>
<spec>Pentium III 450 MHz</spec>
<price> $ 3.000</price>
</PC>
<PC>
<name>Portege 7200CT</name>
<spec>Pentium III 600 MHz</spec>
<price> $ 4.000</price>
</PC>
</computer>
<software>
<item>
<name>GNU Emacs 20.5.1</name>
<note>Linux</note>
<tohome xlink:href=‘‘http://www.gnu.org’’>
GNU’s home page
</tohome>
</item>
</software>
</products>
(a)
<!DOCTYPE products [
<!ELEMENT products (computer+,software)>
<!ELEMENT computer (PC)+>
<!ELEMENT software (item)+>
<!ELEMENT PC (name,spec,price)>
<!ELEMENT item (name,note,price?,tohome?)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT spec (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ELEMENT tohome (#PCDATA)>
<!ELEMENT note (#PCDATA)>
<!ATTLIST tohome
xmlns:xlink CDATA #FIXED http://www.w3.org/1999/xlink
xlink:href CDATA #REQUIRED>
<!ATTLIST computer
brand CDATA #REQUIRED>
]>
(b)
Figura 2.2: Esempio di DTD
18
hproducts, (computer+, software),{},{},{computer,software},{}i
Figura 2.3: Esempio di rappresentazione mediante X-formalism
PRODUCTS
(1,n)
brand
COMPUTER
SOFTWARE
(1,n)
(1,n)
ITEM
PC
name
spec
price name
note
(0,1)
price
(0,1)
tohome
href
Figura 2.4: Esempio di X-formalism rappresentato graficamente
Figura 2.5: Primitive per la rappresentazione grafica di X-formalism esteso
19
Figura 2.6: Esempio di X-formalism esteso rappresentato graficamente
20
2.6
Il linguaggio ODLI 3
ODLI 3 è il linguaggio di rappresentazione interna utilizzato da Artemis. Il
linguaggio è conforme allo standard ODMG-93 (Object Database Standard),
che per alcuni aspetti estende.
Concetti fondamentali di ODMG-93 sono i consueti concetti di classe,
oggetto, attributo e metodo, tipici della programmazione ad oggetti e, più in
generale, di una qualunque architettura basata su di una struttura ad oggetti.
Essenziali ovviamente sono anche i concetti di ereditarietà e specializzazione.
class Persona
{
String nome;
Date dataDiNascita;
// Metodi
Persona(); // Costruttore: nasce una nuova persona
int età(); // Restituisce un tipo atomico
};
class Atleta: Persona // Una sottoclasse di Persona
{
String disciplina;
String categoria;
// Metodi
int ultimoRisultato();
};
class Podio // Una classe con valori complessi
{
String nomeGara;
Persona primoClassificato;
Persona secondoClassificato;
Persona terzoClassificato;
};
Si noti come il meccanismo delle classi con valori complessi corrisponda
abbastanza esattamente a quello che in X-formalism era il significato delle
referenced XClass.
Lo standard che stiamo prendendo in esame permette di stabilire delle
21
relazioni tra oggetti. Esse hanno il ruolo dei puntatori nei linguaggi di programmazione, arricchito tuttavia da alcuni aspetti essenziali, come la persistenza e la possibilità di realizzare verifiche di integrità, le cui condizioni
possono essere espresse nello schema e gestite automaticamente. Ciò viene
fatto dichiarando che una relazione è simmetrica.
class Animale
{
String razza;
String nome;
Ref <Proprietario> appartieneA inverse possiede;
}
class Proprietario:
Persona
{
Ref <Animale> possiede inverse appartieneA;
}
nell’ipotesi che ogni proprietario possieda un solo animale, e viceversa.
Volendo invece rappresentare una relazione uno a molti, o molti a molti,
è necessario introdurre prima i costrutti che permettono di modellare collezioni di oggetti (ordinate - List - o non ordinate - Set -).
Set < Ref < Atleta > > Squadra;
Set < Ref < Animale > > Animali;
List < Ref < Persona> > Persone;
In questo modo, è possibile rappresentare relazioni multiple come segue:
class Persona
{
String nome;
Date dataDiNascita;
Set < Ref < Persona > > genitori inverse figli;
Set < Ref < Persona > > figli inverse genitori;
Set < Ref < Animale > > possiede inverse appartieneA;
// Metodi
Persona();
int età(); // Restituisce un tipo atomico
void sposa (Ref <Persona> consorte);
}
22
Accanto all’ODL (Object Definition Language) sommariamente presentato,
lo standard ODMG-93 introduce un linguaggio di query, OQL (Object Query
Language), il quale risulta essere in sostanza un soprainsieme della sezione
di query di SQL’92.
Tale linguaggio permette di sottomettere ad un sistema, genericamente
organizzato secondo un’architettura client - server, interrogazioni relative agli
oggetti in esso contenuti, secondo una sintassi estremamente simile a quella
di SQL. In particolare, una della caratteristiche di OQL è quella di mantenere la compatibilità con le query SQL. Accanto a questa, senza dubbio
importantissima è la caratteristica di indipendenza fisica e logica dalle strutture dati sottostanti, caratteristica peraltro essenziale, in genere, per tutti i
linguaggi logici. Chiaramente, un sistema di questo genere si presta molto
bene a far sı̀ che le interrogazioni possano essere ottimizzate da un apposito
modulo del server OQL, e semplifica dunque notevolmente tanto la scrittura
di applicazioni dedicate quanto l’eventuale utilizzo di OQL in interrogazioni
cosiddette embedded (per esempio, all’interno di applicazioni C++).
Di seguito presentiamo alcuni esempi di interrogazioni OQL, il cui significato appare estremamente chiaro a chi abbia una minima conoscenza
di SQL. Notiamo che l’accesso agli elementi interni ad oggetti complessi è reso possibile mediante l’utilizzo della tradizionale notazione puntata
(nomeOggetto.nomeAttributo o nomeOggetto.nomeRelazione) o, equivalentemente, mediante la notazione ->.
select p.nome
from Animali a, a.appartieneA f
select f.nome
from Persone p,p.figli f
il cui risultato chiaramente non è un valore atomico bensı̀ un insieme, più
precisamente del tipo Bag < String >, ovvero un insieme che può contenere
elementi ripetuti.Per avere ciò che logicamente può interessare in un caso
del genere, ovvero l’insieme (nel senso proprio del termine) dei figli di una
persona, si avrà
select distinct f.nome
from Persone p,p.figli
Complicando un po’ gli esempi,
select a.nome, a.razza
from Persone p, p.possiede a
23
where p.nome = Giovanni Rossi and
count (p.figli) >= 2
select p.nome
from Persone p,
select distinct p.possiede) as a
where p.nome = a.nome
Una grande differenza rispetto ad SQL consiste nel fatto di poter creare
qualunque genere di valore complesso come risultato finale di una interrogazione, cosı̀ come risultato intermedio all’interno di una query.
select struct (
io: p.nome
miaEtà:p.età
mieiGenitori: (select struct (
nome: f.nome,
età: f.età
)
from p.genitori f)
)
from Persone p
Come si vede, quest’ultima interrogazione crea come risultato una struttura
che corrisponde ad un sottoinsieme dei valori complessi di Persona. In particolare, il tipo dei valori restituiti dalla precedente query è
struct TipoRisultante
{
String io;
int miaEt’a;
Bag < struct
{
String nome;
int et’a;
}
> mieiGenitori;
}
Ancora, nelle interrogazioni OQL è possibile invocare metodi sugli oggetti.
Inoltre, l’architettura object oriented permette di sfruttare il cosiddetto po24
limorfismo, e dunque di avere una scelta dinamica della classe sulla quale invocare un determinato metodo (ovvero, un metodo invocato formalmente su
una certa classe potrebbe in realtà essere invocato su un oggetto appartenente
ad una sottoclasse di tale classe: la scelta avviene dinamicamente).
class Persona
{
// Attributi
//...
// Metodi
//...
virtual Set < String > attività;// Un metodo ridefinibile
}
class Atleta
{
// Attributi
//...
// Metodi
//...
virtual Set < String > attività;
// Il metodo è stato ridefinito
}
class Impiegato
{
// Attributi
//...
// Metodi
//...
virtual Set < String > attivit’a;
// Il metodo è stato ridefinito
}
select p.attività
from Persone p
Chiaramente, l’invocazione di metodo p.attività può far riferimento indifferentemente ad un oggetto di tipo Persona, ad uno di tipo Atleta o ad
uno di tipo Impiegato.
Ancora, come in SQL, esiste la possibilità di creare viste intermedie
(define nomeVista as select .........) sulle quali operare successiva25
mente nuove interrogazioni. Chiaramente, è possibile anche effettuare la
stessa ricerca complessiva annidando due differenti query.
OQL prevede poi la possibilità di comporre operatori con l’unico vincolo
di rispettare le corrispondenze tra i tipi.
Infine, come SQL, OQL include operatori su insiemi (union,intersect,except),
quantificatori (for all, exists), operatori aggregati (min, max, count,
sum, avg), caratteristiche di raggruppamento (group by) e di ordinamento
(order by) all’interno delle interrogazioni.
Diamo ora di seguito qualche accenno a proposito delle principali estensioni
introdotte da ODLI 3 rispetto ad ODMG-93.
• Optional constructor: denotato mediante (?), è introdotto per classi che hanno un attributo opzionale (cioè la cui presenza in un’istanza
non è necessaria). Anche in questo caso, l’esigenza di fondo è quella di
catturare le caratteristiche di dati semistrutturati. Si veda ad esempio
la seguente dichiarazione:
{
attribute String city;
attribute String street;
attribute String zipcode;
}
union
{
string;
},
che rappresenta il fatto che un indirizzo può essere semplicemente una
stringa di caratteri, oppure essere scomposto in tre parti distinte.
• Terminological relationships: esprimono relazioni tra la terminologia delle diverse sorgenti di informazioni integrate. Esse sono definite
tra classi ed attributi, e sono specificate considerando i nomi di attributi e classi, denotati come termini. In particolare, ODLI 3 permette
di specificare i tre seguenti tipi di relazione terminologica:
– SYN (synonym-of), definita tra due distinti termini t ed u che
sono sconsiderati sinonimi in ogni sorgente considerata.
– BT (Broader Terms, o hypernymy), definite tra due termini t ed
u tali che t ha un significato più ampio e generale di u.
26
– RT (Related Term), o associazione positiva, utilizzata per termini che sono utilizzati genericamente nello stesso contesto nelle
sorgenti considerate.
Si considerino ad esempio due sorgenti di informazioni ED ed FD. Relazioni terminologiche sono ad esempio
<ED.FastFood RT ED.Owner>
<FD.Restaurant BT FD.Bistrot>
Cosa assai importante, esiste la possibilità di derivare automaticamente
nuove relazioni terminologiche implicite in un insieme di relazioni date.
• Rules (regole): ODLI 3 introduce due generi di regola: regole if then,
per esprimere in maniera dichiarativa vincoli di integrità interni alle
sorgenti e tra sorgenti distinte; regole di mapping, per esprimere le
relazioni tra la schema description dello schema d’integrazione e la
schema description delle sorgenti originali. Esempio: regola if then
rule Rule1 forall X in FoodPlace:
X.category = ’High’) then X.price > 100;
Esempio: regole di mapping
attribute integer price
mapping rule (S.car.ItalianPrice union
S.car.USPrice
on Rule2)
rule Rule2
{
case of S.car.country:
Italy: S.car.ItalianPrice;
US: S.car.USPrice;
}
O ancora, considerando l’esempio di due sorgenti di informazioni ED
ed FD,
interface FoodPlace
{
attribute name
mapping rule
ED.FastFood.name,
FD.Restaurant.name,
27
FD.Brasserie.name;
attribute category
mapping rule ED.FastFood.category,
FD.Restaurant.category,
FD.Bistro.type;
attribute zone
mapping rule ED.FastFood = ’Pacific Coast’,
FD.Restaurant = ’Atlantic Coast’,
FD.Bistro = ’Atlantic Coast’,
FD.Brasserie =’Atlantic Coast’;
}
regole la cui utilità è evidente nel momento in cui si debbano “convertire” interrogazioni sottoposte allo schema globale in interrogazioni
da sottoporre ai singoli schemi relativi alle sorgenti di partenza.
28
Capitolo 3
Utilizzo di ontologie
3.1
Introduzione
Accostandosi al problema dell’utilizzo di una ontologia, si possono individuare alcune principali categorie di utilizzo, che permettono di inquadrare
in modo preciso le varie problematiche che vengono a porsi, a proposito
per esempio dei formalismi necessari per interfacciare l’ontologia verso i suoi
utenti.
Si tratta per esempio di distinguere i diversi livelli di astrazione ai
quali vogliamo rendere possibile l’accesso alle informazioni contenute in una
ontologia. Cosı́ si puó immaginare la necessitá di effettuare ricerche di informazioni a partire da un concetto, oppure a partire da un particolare termine
o, ancora, da un insieme di concetti compresi nell’ontologia.
A proposito invece del tipo di informazione che si desidera ricavare,
si puó pensare di voler accedere alle informazioni strutturali dell’ontologia,
per esempio alle relazioni tra due concetti dati, e d’altra parte é logico immaginare un utilizzo volto al reperimento di riferimenti a particolari istanze
di questo o quel concetto, o insieme o categoria di concetti, istanze presenti
in una o piú delle sorgenti di informazioni che l’ontologia integra.
D’altro canto, sembra importante tenere in considerazione anche il ruolo e la tipologia dell’utente dell’ontologia: infatti un differente grado di
esperienza a proposito del concetto stesso di ontologia, e dei formalismi e
delle strutture che esso comporta, porta a diverse possibilitá di utilizzo della
nostra concettualizzazione di un dominio. Mentre un esperto di ontologie
può muoversi con una certa facilitá, per esempio, tra i concetti di relazione,
categoria, concetto, sorgente di conoscenza, solo per citarne alcuni, e probabilmente ha anche una certa esperienza di formalismi di rappresentazione di
tutti questi concetti, un utente esperto del dominio ma assolutamente digiu-
29
no del concetto stesso di ontologia necessita di poter far uso di questo potente
modello senza doverne essere cosciente.
Infine, altra distinzione è quella tra utenti di tipo umano ed utenti “automatici”, ovvero moduli software che desiderano fare uso delle potenzialitá
offerte dal modello ontologico.
3.2
Modalità di utilizzo di ontologie: descrizione dettagliata
Vediamo ora, più dettagliatamente, le diverse tipologie di utilizzo di ontologie
sopra indicate. Come apparirà chiaro, le classificazioni di seguito approfondite non sono tutte mutuamente esclusive ma, al contrario, si possono articolare
in gruppi tra loro ortogonali, a seconda della peculiarità presa in considerazione (per esempio, il tipo di utente è ortogonale al tipo di approccio alla
ricerca di informazioni). Per comodità, nella seguente descrizione le tipologie
di utilizzo relative alle diverse caratteristiche distintive considerate saranno
raggruppate tra di loro.
3.2.1
Differenti livelli di astrazione
Come si è accennato prima, una distinzione tra le tipologie di utilizzo di una
ontologia è relativa al livello di astrazione dal quale si desidera partire per
ricercare ed ottenere informazioni.
Ricerca in base a categorie di concetti
Una prima possibilità, in questo senso, è quella di voler ottenere informazioni
partendo da una categoria di concetti molto generale, che comprenda un
insieme più o meno vasto di concetti dell’ontologia. Si tratta in qualche
modo di considerare una particolare vista dell’ontologia, ovvero di valutarne il
contenuto informativo partendo da un livello di astrazione superiore a quello
degli stessi concetti che l’ontologia considera e lega tra di loro.
Si pensi ad esempio ad una ontologia che rappresenti la tassonomia del
mondo animale (una tassonomia è, ovviamente, un caso particolare di ontologia). Una ricerca del tipo di quella qui descritta può essere ad esempio
quella di chi voglia ricercare informazioni sugli animali domestici : infatti,
tale categoria non esiste come elemento della tassonomia scientifica, e tuttavia individua un insieme di concetti (specie animali nel caso in questione)
organico e definito, ovvero quella che si è chiamata una vista sull’ontologia.
30
Ricerca in base a concetti
Una seconda possibilità, naturalmente, consiste nel voler ricercare informazioni a proposito di un particolare concetto contenuto nell’ontologia: è questo
forse il genere di utilizzo più semplice da immaginare, che permette un accesso alle informazioni dell’ontologia ad un livello di astrazione che è lo stesso
al quale sono identificati e correlati i concetti al suo interno.
Sempre facendo riferimento alla tassonomia del mondo animale, una ricerca di questo genere è per esempio quella effettuata focalizzando la propria
attenzione sul concetto di gatto europeo: si tratta infatti di due concetti della
nostra ontologia, in base ai quali si desidera ricercare informazioni.
Ricerca keyword-driven
Si può poi pensare ad un accesso keyword-driven all’ontologia, ovvero ad una
ricerca di informazioni che parta da un insieme di termini, non necessariamente corrispondenti a concetti o relazioni dell’ontologia. In questo caso, si
utilizzano le relazioni semantiche tra i concetti dell’ontologia, e la conoscenza di relazioni tra termini (per esempio, di sinonimia) per fare il matching
tra le keyword dell’interrogazione e la terminologia dell’ontologia, onde poter
fornire le informazioni desiderate.
Ancora a proposito dell’ontologia di cui negli esempi precedenti, è di
questo genere una ricerca effettuata in base al termine micio: si tratta infatti
di un termine che non si riferisce direttamente ad un concetto dell’ontologia,
ma che per sinonimia è chiaramente legato ad un concetto, quello di gatto,
che all’ontologia appartiene.
3.2.2
Differenza nella tipologia di informazioni ricercata
Un altro criterio di classificazione delle tipologie di utilizzo di un’ontologia si
basa, come indicato in precedenza, sul tipo di informazione che dall’ontologia
si desidera ottenere.
Ricerca di particolari istanze di concetti dell’ontologia
Una modalità di utilizzo abituale di una qualunque metodologia di ricerca di informazioni è quella che comporta la ricerca di particolari istanze di
informazioni, ovvero nel caso ontologico di istanze dei concetti presenti nell’ontologia: ciò significa che, a partire da una categoria di concetti, da un
concetto o da un insieme di keyword, si desidera ricercare un insieme di riferimenti a particolari oggetti collegati a questi concetti (categorie, keyword).
31
Ad esempio, è il caso di voler trovare un elenco di riferimenti a pagine web
collegate al concetto di Animale domestico, oppure ai termini gatto, cane,
canarino.
Ricerca di informazioni strutturali sull’ontologia
Più legata al modello ontologico utilizzato per fornire informazioni ad un
utente, invece, è la modalità di navigazione dell’ontologia orientata al reperimento di informazioni strutturali sull’ontologia stessa: si tratta di valutare
non le caratteristiche estensionali dell’insieme di fonti di dati che l’ontologia integra, bensı̀ le caratteristiche intensionali del modello utilizzato per
integrarle.
Da una parte, dunque, l’esigenza può essere quella di partire da un concetto per conoscerne le proprietà o le eventuali relazioni con altri specifici
oggetti.
Dall’altra, può darsi il caso di voler avere informazioni a proposito della
tassonomia dei concetti rappresentati dall’ontologia, ovvero di voler conoscere
tutti i concetti sussunti da un dato concetto, o che lo sussumono, o ad esso
legati mediante altri tipi di relazione.
In ogni caso, si tratta di una tipologia di acceso ben diversa da quella
precedente, in quanto fornisce informazioni qualitative sui legami (eventuali)
tra concetti e sulle caratteristiche strutturali e tassonomiche di un concetto
(o tipologia di concetti, ovviamente, o concetti collegabili a parole chiave. . . ),
e non informazioni estensionali sulle particolari istanze di un concetto.
3.2.3
Differente grado di esperienza dell’utente
Naturalmente, differenti gradi di esperienza dell’utente, sia relativamente al
dominio cui l’ontologia si riferisce, sia relativamente alle ontologie stesse,
comportano differenti modalità di utilizzo di questo strumento di integrazione di sorgenti di conoscenza. Un utente esperto del concetto di ontologia e di
quanto esso comporta in termini di formalizzazione e modellazione di domini
possiede buone capacità di interagire col modello anche mediante linguaggi
ed interfacce di basso livello, al contrario di un utente digiuno delle problematiche relative alla realizzazione ed all’utilizzo di ontologie. Un utente esperto
(dello strumento, non necessariamente del dominio), ovviamente, è più facilmente in grado di classificare le diverse modalità di utilizzo del modello
ricordate in questa sezione. In questo modo, è evidente come ad un utente
esperto forse del dominio, ma inesperto a proposito delle ontologie, sia necessario offrire possibilità di utilizzo dei servizi offerti dall’ontologia (in ultima
analisi, interfacce) in grado di supplire a questa sua inesperienza: dunque è
32
sensato pensare ad interfacce di tipo grafico, che semplifichino al massimo,
per esempio, l’individuazione delle tipologie di utilizzo desiderato, possibilmente evitando all’utente di dover diventare anche solo in parte esperto delle
problematiche del modello utilizzato per fornirgli informazioni.
3.2.4
Differente tipologia di utente: utente umano ed
utente automatico
Infine, è chiaro che una forte discriminante nell’individuazione di modalità
di utilizzo di modelli di tipo ontologico quella che distingue utenti di tipo
umano e di tipo automatico.
Infatti, è possibile voler sfruttare automaticamente le potenzialità offerte
da una modellazione di un dato dominio come quella di cui si discute. Si
pensi per esempio all’utilizzo di un’ontologia allo scopo di integrare diversi
tool software che si occupano di problematiche affini ma con terminologie e
formati anche solo leggermente diversi.
Evidentemente, la realizzazione di un mediatore tra questi strumenti, basato su una rappresentazione ontologica della semantica del dominio, costituisce una interessante possibilità di integrare detti strumenti senza doverli
modificare. Chiaramente, un mediatore di questo genere deve poter utilizzare le opportunità di mediazione fornite dall’ontologia in modo automatico,
senza richiedere l’intervento di un utente umano. Per quanto riguarda l’utilizzo di ontologie in quest’ottica, si veda [18]. Dunque, è necessario valutare
anche la possibilità di fornire differenti primitive di accesso ad una ontologia,
o meglio primitive di livelli diversi, a seconda che l’utente sia umano o meno.
Per un modulo software è necessario infatti avere a disposizione un’interfaccia formale e ben definita, magari anche di basso livello; si può pensare poi
alla costruzione di un’interfaccia grafica, per utenti umani, che permetta di
tradurre azioni sugli oggetti grafici ed azioni di navigazione all’interno di tale
interfaccia in chiamate alla primitive di basso livello utilizzabili direttamente
da uno strumento automatizzato. In [21] viene presentato un approccio di
questo genere, nel quale un’interfaccia grafica permette di costruire in modo
semplice e trasparente per l’utente query espresse in un linguaggio formale di
basso livello: in particolare, il linguaggio in questione è mutuato dall’Intelligenza Artificiale, e si basa su una variante sintattica della logica del primo
ordine. D’altra parte, la scelta di utilizzare linguaggi di query di questo
genere è comune anche ad altri casi presenti in letteratura.
Riportiamo ora un paio di esempi tratti da [18], che illustrano più chiaramente le due diverse modalità di interazione con un’ontologia appena illustrate.
33
Per quanto riguarda un’interazione estremamente formale, l’articolo indicato utilizza come già detto una sintassi basata sulla FOL (First Order
Logic), ed in particolare presenta un linguaggio, chiamato F.logic, che viene
utilizzato tanto per esprimere conoscenza (per esempio, vincoli di integrità
sull’ontologia) quanto per esprimere interrogazioni all’ontologia stessa. Un
esempio di interrogazione è il seguente:
FORALL Public <- EXISTS ResearcherID
researcherID:Researcher[lastName ->>Martinelli;publication ->> Public].
o, ancora,
FORALL resID1, ResID2 <ResID1:Researcher[cooperateWith ->> ResID2]
and ResID2:Researcher.
In entrambi i casi, ovviamente, la sintassi presentata rappresenta il fatto
che il concetto Researcher possiede gli attributi lastName e publication,
e la relazione cooperateWith.
Appare chiaro che utilizzare un’interfaccia di questo genere risulta fondamentale quando gli utenti siano moduli automatizzati, in genere moduli
software.
Per contro, come si è già detto in precedenza, il problema di un utente
umano è quello di essere facilitato da un’interfaccia di tipo grafico piuttosto
che dal dover utilizzare un linguaggio formale (a proposito del quale tra
l’altro nasce anche una questione di esperienza, di cui si d̀etto in 3.2.3). A
questo proposito, l’articolo [18] presenta quanto messo a punto in portali che
forniscono all’utente un’interfaccia grafica basata sulla geometria iperbolica,
che permette di navigare tra i concetti dell’ontologia, e su un insieme di
check-box e menu a tendina, che permettono di visualizzare le proprietà e le
relazioni di un concetto, di interagirvi e dunque di comporre con facilità le
query. Le query vengono costruite selezionando in apposite finestre grafiche
gli attributi ed i valori per essi desiderati, in relazione ad uno o più concetti.
3.3
L’architettura di ontologia a tre livelli in
ARTEMIS
In questa sezione presentiamo l’architettura di ontologia a tre livelli in Artemis; nelle sezioni successive presenteremo invece i linguaggi concettuali e
34
logici utilizzati per descrivere tale architettura e per rappresentare l’ontologia.
ARTEMIS considera un’architettura di ontologia a tre livelli [5], basata
per quanto riguarda le fonti di informazioni su standard di strutturazione
semantica di documenti legati a DTD ed XML-Schema, le descrizioni di tipi
di dato più comunemente usate per documenti XML.
L’architettura a tre livelli comprende un livello cosiddetto Semantic
mapping layer, ovvero un livello di mapping semantico, che si occupa di
organizzare le diverse sorgenti di conoscenza, o meglio le X-classi che ne rappresentano il contenuto, in cluster di X-classi, ovvero in insiemi di X-classi
affini (benchè in generale di provenienza diversa). A questo punto, i cluster
sono mappati in X-classi globali, che rappresentano in pratica una sorta
di riconciliazione ed unificazione di concetti affini, rappresentati dalle diverse X-classi del cluster, in un solo concetto di livello più alto: questo livello
dell’architettura si dice Interorganizational knowledge layer o Mediation layer. Infine, l’architettura di ARTEMIS prevede un terzo livello, più
astratto, al fine di organizzare la conoscenza sottostante in diverse viste particolari, dipendenti per esempio dal particolare punto di vista che una certa
utenza ha rispetto al dominio che l’ontologia modella. Questo livello, che
permette in pratica ad ogni utente di identificare l’ontologia con l’insieme di
concetti di suo interesse, è detto Subject category layer. L’architettura
di ARTEMIS prevede poi la presenza di link (relazioni) tra i diversi concetti. In particolare, essi possono essere classificati secondo due criteri tra loro
ortogonali:
• link di tipo synonymy (i due concetti sono da considerare equivalenti)
35
• link di tipo hypernymy (relazione di tipo is-a)
• link di tipo hyponymy (relazione inversa della precedente)
• link di tipo positive association (ogni altro tipo di relazione)
- link tra concetti dello stesso livello (es, tra due X-classi globali). Tali
link realizzano in pratica, livello per livello, la struttura tassonomica
dell’insieme di concetti del dominio che l’ontologia modella.
- link tra concetti di diverso livello (es, tra una subject category ed una
X-classe globale). Tali link rappresentano invece i passi di astrazione
tra concetti appartenenti ai diversi livelli dell’ontologia, e permettono
di mantenere un collegamento, navigabile, tra tali livelli.
3.4
Modalità di utilizzo di ontologie e linguaggi di ARTEMIS
Analizziamo ora le suddescritte modalità di utilizzo di una ontologia alla luce
di quanto enunciato a proposito del progetto ARTEMIS. In particolare, è utile considerare che il linguaggio logico ODLI 3 viene utilizzato come linguaggio
di rappresentazione interno ad ARTEMIS di quanto viene espresso a livello
concettuale mediante X-formalism: di conseguenza, le considerazioni che nel
seguito saranno fatte a proposito del ruolo dei costrutti di X-formalism in relazione all’utilizzo di ontologie possono considerate valide anche a proposito
dei costrutti di ODLI 3 .
Pertanto, concentreremo la nostra attenzione sui legami tra il linguaggio
concettuale X-Formalism e le diverse modalità di utilizzo di ontologie, sottintendendo che legami analoghi possono essere individuati tra tali modalità
ed il linguaggio logico di rappresentazione ODLI 3 , tranne nel caso in cui alcuni aspetti di quest’ultimo risultino particolarmente interessanti e rilevanti
rispetto a quanto già detto per X-formalism.
3.4.1
Differenti livelli di astrazione
Ricerca in base a categorie di concetti
Si tratta di utilizzare il livello di astrazione indicato come Categorization
layer: il suo scopo infatti è proprio quello di mostrare all’esterno delle particolari viste sull’ontologia, dalle quali è poi possibile ottenere le informazioni
desiderate navigando i link, sia di tipo intra-layer sia di tipo inter-layer.
36
Ricerca in base a concetti
Chiaramente, il meccanismo di navigazione dei vari tipi di link tra concetti
funziona anche in questo caso; l’unica differenza rispetto al caso precedente
è data dal punto di partenza di questa navigazione: non più una subject
category, bensı̀ una X-classe globale.
Ricerca di informazioni keyword - driven
In questo caso, come si è detto, il problema essenziale consiste nel riportare i
termini utilizzati per definire la ricerca nella terminologia utilizzata dall’ontologia: ancora una volta i link, in particolare quelli di sinonimia, permettono
di realizzare quanto richiesto per fornire le informazioni richieste dall’utente.
Ovviamente, anche i link di tipo hypernymy ed hyponymy contribuiscono
alla traslazione della terminologia della query in quella dell’ontologia.
3.4.2
Differenza nella tipologia di informazioni ricercata
Ricerca di particolari istanze di concetti dell’ontologia
Come detto, la costruzione dei tre livelli dell’architettura di Artemis si basa
su una sorta di livello zero, costituito dalle informazioni esportate, mediante formalismi XML, da sorgenti eterogenee e distribuite. Chiaramente, al
momento della costruzione delle X-classi, si mantiene un collegamento tra
queste nuove entità e le sorgenti di informazioni di partenza; ancora, a livello
della costruzione delle X-classi globali, si mantiene un collegamento con i cluster di X-classi la cui unificazione ha portato alla definizione della X-classe
globale; questo modo, discendendo la tassonomia del modello ontologico fino
al livello delle X-classi, è possibile recuperare e fornire come risposta alla
richiesta sottomessa all’ontologia i riferimenti alle sorgenti di base, istanze
dei concetti che l’ontologia modella.
Ricerca di informazioni strutturali sull’ontologia
Le informazioni richieste vengono reperite navigando i link presenti all’interno
dell’ontologia: link tra concetti del medesimo livello permettono di reperire
informazioni relative alla tassonomia dell’insieme dei concetti che l’ontologia
modella, mentre link tra concetti appartenenti a modelli diversi permettono
di ricostruire le informazioni strutturali relative a concetti di un certo livello
partendo da concetti di livelli diversi, ed ancora di fornire notizie sui legami
37
tra concetti modellati a livelli di astrazione differenti (informazioni sui passi
di astrazione all’interno della modellazione).
3.4.3
Differente grado di esperienza dell’utente
Come detto prima, differenti caratteristiche dell’utente dell’ontologia in termini tanto di conoscenza del dominio quanto di esperienza nel campo dei modelli ontologici rendono sensato pensare alla possibilità di creare viste sull’ontologia: esse, come detto, rendono possibile personalizzare ciò che l’ontologia
mostra ad un determinato utente (o categoria di utenti).
Appare evidente come la caratteristica architetturale di Artemis che più
si presta a venire in contro a questa esigenza sia la possibilità di definire delle
subject categories: il Categorization layer, come detto, è essenzialmente
un meccanismo di creazione di viste sui concetti dell’ontologia, allo scopo di
permettere all’utente di identificare l’ontologia con l’insieme di concetti di
suo interesse. Questo è esattamente ciò di cui si ha bisogno nell’ottica di
affrontare al meglio utilizzi della medesima ontologia da parte di tipologie
diverse di utente. Accanto a questo, considerando specificamente le differenze tra due utenti in fatto di esperienza di modelli ontologici, si vede come un
utente esperto di questi strumenti possa senza problemi far uso di linguaggi di
basso livello, per esempio di un linguaggio di interrogazione con una sintassi
ricalcata sulla logica del primo ordine (FOL) ed un lessico ed una semantica
legati alla rappresentazione formale di X-Formalism. Un utente poco esperto
o addirittura digiuno in fatto di modelli ontologici, al contrario, necessita
di un’interfaccia rispetto a tali strumenti di tipo meno tecnico e più intuitivo: in questo senso, la possibilità di dare una rappresentazione grafica della
concettualizzazione effettuata mediante X-Formalism sembra poter essere un
buon punto di partenza. Infine, il linguaggio logico ODLI 3 , il quale come
detto deriva dallo standard ODMG-93 e risulta dunque collegato anche ad
un linguaggio di interrogazione SQL-like, OQL, si può porre in questo senso
come una sorta di via di mezzo tra l’estremo tecnicismo di un interfaccia
mediante costrutti di tipo FOL ed una interfaccia puramente grafica: OQL
dunque è il mezzo adatto per semplificare l’interazione con una ontologia,
pur mantenendola su un piano formale, preciso e molto espressivo, per un
utente che non sia esperto di ontologie ma per esempio abbia una discreta
conoscenza di linguaggi logici come SQL.
38
3.4.4
Differente tipologia di utente: utente umano ed
utente automatico
Come detto in precedenza, dal punto di vista di questa distinzione tra tipologie di utilizzo dell’ontologia si tratta essenzialmente di poter fornire primitive
di accesso al modello ontologico di diverso livello di astrazione. Da un lato,
come abbiamo visto, X-Formalism costituisce di per sè un linguaggio estremamente formale, che permette dunque di pensare facilmente ad interazioni
tra l’ontologia ed utenti automatizzati. La possibilità tuttavia di dare una
semplice ed efficace rappresentazione grafica dei concetti di X-Formalism non
esclude dall’utilizzo di tale formalizzazione un utente umano: infatti, come
detto nella sezione 3.2.4, l’idea principale sulla quale insistere per far coesistere i due tipi di utenza è quella di sviluppare un’interfaccia grafica che
permetta una costruzione semplice e trasparente di interazioni a livello più
basso. È chiaro come una corrispondenza forte tra X-formalism e sua rappresentazione vada, seppur ancora a livello concettuale, in questa direzione.
Infine, anche in questo caso è possibile, a proposito di ODLI 3 , fare un discorso simile a quello fatto nella sezione 3.4.3: anche in questo caso infatti
OQL rappresenta una possibilità di interfacciamento tra utente ed ontologia
che risulta d’altra parte molto più amichevole per un utente umano. D’altra
parte, è importante notare che strumenti automatizzati che utilizzino il linguaggio SQL per interrogare database relazionali potrebbero essere utilizzati
agevolmente, previo “aggiornamento” relativo all’utilizzo di sistemi ad oggetti, per usufruire delle possibilità offerte da una rappresentazione di ontologie
mediante ODLI 3 .
39
Capitolo 4
Sviluppo di primitive per
l’utilizzo di ontologie
Nel proporre le seguenti primitive di interazione per un’ontologia, si è tenuto
conto principalmente dell’analisi effettuata a proposito delle diverse modalità
mediante le quali è possibile interagire con l’ontologia stessa. In particolare,
alcune primitive sono incentrate sulla navigazione strutturale dell’ontologia, altre invece sul reperimento di riferimenti ad istanze dei concetti che
l’ontologia modella.
D’altra parte, è necessario pensare a primitive che permettano di differenziare il punto di partenza della ricerca, vale a dire che diano la possiblità
di effettuare ricerche per concetto, per categoria o per parole chiave.
Infine, come l’analisi effettuata in precedenza ha evidenziato, pare importante offrire diverse possiblità di interazione, in termini essenzialmente di
possibili viste sull’ontologie, a categorie di utenti differenti.
Di quest’ultimo aspetto si discuterà nella sezione 4.4, dopo la presentazione
delle primitive individuate.
4.1
Navigazione strutturale dell’ontologia
Un caratteristica peculiare di un modello ontologico della realtà consiste nella possibilità di ricavarne informazioni sulla struttura del modello stesso.
In particolare, tre sono le possibili tipologie di informazioni strutturali che
pare sensato richiedere all’ontologie, e per le quali si sono pensate alcune
fondamentali primitive di interazione.
40
4.1.1
Percorrere la gerarchia dei concetti
Requisito fondamentale per poter assumere informazioni strutturali da un
modello ontologico è quello di poter percorrere la gerarchia dei concetti rappresentati, ovvero di poter passare da ciascun concetto all’insieme dei concetti che lo specializzano (concetti figli), e che lo sussumono (concetti padri).
Pertanto, si è pensato a due primitive che rendano disponibile tale servizio
agli utenti di un’ontologia.
• generalization-of
Partendo da un concetto, fornisce l’insieme dei concetti che lo sussumono.
Semi-formalmente, di questa primitiva si può dare la seguente rappresentazione:
{ Concept } generalization-of ( Concept )
(4.1)
• specialization-of
Partendo da un concetto, fornisce l’insieme dei concetti che lo specializzano.
Semi-formalmente, abbiamo la seguente primitiva:
{ Concept } specialization-of ( Concept )
(4.2)
Non si è pensato alle due primitive presentate solo a seguito delle considerazioni relative alle diverse modalità di utilizzo di ontologie, ed in particolare
alla modalità legata alla ricerca di informazioni strutturali sul dominio che
l’ontologia modella. Un’altra forte motivazione è quella legata alla necessità di reperire informazioni relative alle istanze dei concetti modellati nell’ontologia. Anche per tale esigenza, risulta indispensabile disporre di uno
strumento che permetta di navigare all’interno della gerarchia dei concetti,
allo scopo ad esempio di cercare riferimenti ad istanze di concetti che specializzano o generalizzano il concetto di partenza. Si pensi per esempio al
caso tassonomico, che di quello ontologico risulta sottoinsieme. Sia data ad
esempio la necessità di reperire riferimenti ad istanze del concetto Felino,
contenuto nell’ontologia. Può darsi il caso che non esistano istanze dirette
di tale concetto, ma che esistano istanze del concetto Gatto o del concetto
Leone, istanze che chiaramente corrispondono ai requisiti della ricerca ed è
necessario poter reperire.
Per un’analisi più dettagliata e formale dell’utilizzo di primitive di questo genere allo scopo di ridefinire l’insieme dei concetti dei quali reperire le
istanze, si veda [19].
41
Volendo dare una rappresentazione più formale delle primitive illustrate in
questa sezione, utilizziamo una notazione funzionale. Sia dunque C l’insieme
dei concetti dell’ontologia. Le due primitive enunciate sono rappresentate
dalle funzioni
generalization-of:
C → 2C
(4.3)
specialization-of:
C → 2C ,
(4.4)
essendo 2C l’insieme potenza di C, ovvero l’insieme di tutti e soli i suoi
possibili sottoinsiemi.
4.1.2
Identificare relazioni tra concetti
Altrettanto importante risulta poter accedere alle informazioni, che l’ontologia racchiude, a proposito delle relazioni esistenti tra concetti diversi. Cosı̀
si è pensato ad una primitiva che, partendo da due concetti, fornisca il tipo
di relazione tra essi esistente (eventualmente un valore nullo, nel caso non
esistano relazioni esplicite, rappresentate cioè all’interno dell’ontologia, tra i
due concetti).
Come fatto in precedenza, diamo una rappresentazione semi-formale di tale
primitiva:
’NULL’ ∪ rel-Type get-relation-between (Concept, Concept) (4.5)
Formalmente, secondo la notazione vista prima,
• get-relation-between:
C × C → RT ∪ φ,
essendo RT l’insieme dei possibili tipi di relazione.
4.1.3
Analisi di un concetto: proprietà, relazioni
Un altro possibile utilizzo del modello ontologico è relativo alla ricerca di
informazioni sui singoli concetti, ovvero sugli attributi da cui tali concetti
sono costituiti. In pratica, si tratta di una modalità di interazione volta alla
ricerca di una sorta di definizione di un concetto attraverso la descrizione
degli attributi che lo costituiscono.
D’altra parte, ottenere informazioni sul nome e sul tipo degli attributi
di un concetto può servire anche come base di partenza per la realizzazione di una strategia di ricerca di particolari istanze di un concetto, le quali
soddisfino determinati criteri. Chiaramente, pensando all’ontologica come al
risultato di un’integrazione di sorgenti di provenienza eterogenea, non si può
42
in generale suppore di conoscere nomi e tipi degli attributi di ogni concetto, per quanto magari a livello concettuale tali attributi siano chiaramente
conosciuti. Dunque anche in quest’ottica risulta importante disporre di una
primitiva d’interazione con il modello ontologico che permetta di ottenere
informazioni sulla struttura interna di ogni concetto, ovvero una primitiva
che, partendo da un concetto, fornisca un insieme di attributi, ciascuno con
il loro tipo.
Semi-formalmente, abbiamo
{ < attr-Name, attr-Type > } attributes-of ( Concept )
(4.6)
È possibile fare un discorso in tutto analogo al precedente a proposito delle
relazioni di un concetto: si può dunque pensare ad una primitiva che, partendo da un concetto, fornisca un insieme di concetti con i quali il concetto
di partenza è in una qualche relazione:
{ < Concept, rel-Type > } relations-of ( Concept )
(4.7)
Secondo la notazione funzionale formale adottata in precedenza, tali primitive si possono denotare come segue:
• attributes-of:
• relations-of:
C → 2N ×AT
C → 2C×RT ,
essendo A l’insieme dei possibili nomi di attributo ed AT l’insieme dei possibili tipi di attributo.
4.2
Ricerca di istanze di concetti
Accanto a quanto visto in precedenza, è naturale pensare a primitive che
permettano il reperimento di particolari istanze di concetti, in corrispondenza
di determinati requisiti, per esempio sui valori di uno o più attributi.
Nel caso più generale, ciò che si desidera è avere la possibilità di ottenere
riferimenti ad istanze di concetti partendo da un insieme di concetti e da una
condizione che coinvolga i valori di attributi di tali concetti. Per esempio, si
possono desiderare le istanze del concetto Gatto europeo per le quali l’attributo colore valga la costante ‘GRIGIO’, e l’attributo lunghezza valga più
di ‘40 cm’.
In generale, ci si riferisce ad una primitiva del tipo
43
{ Instance } search-instances-of ( { Concept }, condition )
(4.8)
dove condition è una espressione booleana ottenuta legando gli attributi
Attri,j dei concetti Conci (a cui si accede con notazione puntata, del tipo
Conci .Attri,j ) mediante i consueti operatori AND, OR, NOT, e mediante parentesi tonde ( e ).
In particolare, si può pensare ad una primitiva specifica per il caso in cui
si desideri ricercare istanze di un solo concetto: è questo infatti, probabilmente, il caso più frequente, e pare dunque sensato prevedere una primitiva
ad esso dedicata. Una tale primitiva è del tipo seguente:
{ Instance } search-instances-of ( Concept, condition )
(4.9)
Un esempio di istanziazione di tale primitiva potrebbe essere
search-instances-of( Gatto europeo, Gatto europeo.colore =
‘GRIGIO’ AND Gatto europeo.lunghezza > ‘40 cm’ )
(4.10)
Uno strumento di interfaccia verso un’ontologia di questo genere, tuttavia,
può essere facilmente visto, invece che come una vera e propria primitiva, come una sorta di primitiva derivata da primitive di base più semplici.
Adottando per esempio primitive di base come
{ Instance } get-instances-of ( Concept )
(4.11)
value get-value-of (Concept, attribute),
(4.12)
e
il cui significato è chiaro alla luce del formalismo sin qui utilizzato, risulta abbastanza semplice realizzare il servizio fornito dalla primitiva indicata sopra.
Quindi non costituirebbe una mancanza, dal punto di vista delle possibilità
offerte dall’ontologia ai suoi utenti, pensare solo alle due primitive cosiddette
di base e realizzare ad un livello superiore la primitiva search-instances-of
() presentata in precedenza. Non esiste a priori una scelta ideale, in proposito. La questione di fondo, come spesso accade in ambito informatico,
consiste nel decidere che genere di soluzione architetturale adottare: se da
44
una parte sarebbe possibile adottare una scelta minimalista e lasciare addirittura all’utente il compito di costruire strumenti di interazione più complessi
a partire da un numero limitato di semplici primitive di base, è anche vero che una scelta diversa, che metta a disposizione primitive più complesse,
permette di offrire all’utente un utilizzo più semplice ed immediato delle funzionalità dell’ontologia, nonchè di rendere accessibili tali funzionalità anche
ad utenti meno esperti dell’ambito ontologico. In questo caso, la nostra scelta
cade su primitive come la (4.8) e la (4.9). Se la seconda rappresenta infatti
il caso particolare della prima di maggior utilizzo, la prima risulta abbastanza espressiva da rappresentare una gamma molto vasta di interrogazioni
dell’ontologia, pur senza giungere all’estremo di costituire una mera ridefinizione sintattica di OQL. Per quanto riguarda i costrutti di OQL ai quali
non risulta possibile accedere mediante una primitiva come la (4.8) (si pensi
alla clausola group by o al costrutto exists), una scelta sensata è quella di
fornire la possibilità ad un utente con esigenze ed esperienza particolari di
sottomettere all’ontologia direttamente una query OQL: a questo scopo, si
immagina di fornire una primitiva speciale, del tipo
{ Instance } evaluate-OQL-query ( OQL query )
(4.13)
Per concludere questa sezione, diamo ora una definizione più formale delle
primitive introdotte, utilizzando la notazione funzionale già vita nelle sezioni
precedenti.
search-instances-of: 2C × CON → 2I
(4.14)
search-instances-of:
C × CON → 2I
(4.15)
Q → 2I ,
(4.16)
evaluate-OQL-query:
dove per CON si intende l’insieme delle condizioni booleane costruite come
detto, per I l’insieme delle istanze di concetti dell’ontologia e per Q l’insieme
di tutte le possibili query OQL.
4.3
Criteri di ricerca
Infine, è necessario pensare a primitive che permettano di ottenere informazioni per mezzo del modello ontologico partendo non solo da specifici concetti,
ma anche da categorie di concetti o ancor più semplicemente da parole
chiave.
45
4.3.1
Ricerca a partire da concetti
Tutte le primitive proposte in precedenza prevedevano che l’utilizzo dell’ontologia partisse da uno (o più) concetti in base ai quali l’utente intendeva
fare una ricerca. Non resta dunque altro da dire a proposito di questa modalità di ricerca, che è stata utilizzata in precedenza come modalità nella
quale presentare le primitive in quanto rappresenta la tipologia di interazione più profondamente legata al fatto di utilizzare un modello ontologico del
dominio sul quale si sta lavorando. Nel seguito, parleremo invece di come
è possibile intendere le altre due modalità di ricerca individuate alla luce
di quanto già illustrato. Chiaramente, sarebbe stato possibile iniziare il discorso presentando primitive operanti in una delle altre modalità, per poi
approfondire il discorso relativo a quella basata su concetti. Tuttavia, come
detto, è sembrato meglio contestualizzare le primitive di interazione descritte
nelle sezioni precedenti nell’ottica della modalità di interazione che pis̀i lega
all’architettura sottostante.
4.3.2
Ricerca a partire da categorie
Per categoria di concetti si intende in generale un insieme di concetti relativi ad uno stesso ambito o contesto, ovvero in pratica una vista sull’insieme
dei concetti che l’ontologia comprende.
In particolare, l’architettura di Artemis prevede un livello di astrazione, detto Subject category Layer, che corrisponde all’esigenza di rappresentare
particolari viste sull’ontologia. In pratica dunque si tratta di ripensare alle
primitive descritte nelle sezioni precedenti alla luce del fatto che i componenti di un’ontologia possono essere tanto Concetti quanto Categorie. Per
esempio, la primitiva 4.1 può essere intesa, semplicemente, come
{ Component } generalization-of ( Component ),
(4.17)
dove Component può, come detto, essere un Concept od una Category.
Secondo la notazione funzionale usata in precedenza,
generalization-of:
0
C 0 → 2C ,
(4.18)
con C 0 = C ∪ CA, e CA insieme delle possibili categorie.
4.3.3
Ricerca a partire da keyword
Diverso è il discorso relativo alla ricerca di informazioni keyword - driven: in questo caso infatti si tratta di partire da un insieme di termini che
46
non corrispondono necessariamente a concetti (con categorie) dell’ontologia,
e di tradurli in termini dell’ontologia mediante le relazioni terminologiche.
A questo punto, si tratta essenzialmente di sfruttare tali relazioni (che, lo
ricordiamo, contribuiscono a dare origine ai Cluster di X-classi cui corrisponderanno poi le X-classi globali) allo scopo di riportarsi in una delle
condizioni di partenza note, ovvero di stabilire a quale concetto, o insieme
di concetti (o di categorie) la ricerca specificata mediante parole chiave si
riferisce.
A questo punto, pare sensato fornire una semplice primitiva che, partendo
da un termine, determini a quale concetto (o categoria) dell’ontologia tale
termine sia più prossimo.
{ Component } component-from ( Term )
(4.19)
In realtà, anche in questo caso vale il discorso fatto nella sezione 4.2 sulla
necessità di effettuare una scelta a proposito della complessità delle primitivi
che si desidera fornire. Infatti, sarebbe possibile pensare a versioni di tutte
le primitive proposte in precedenza che, partendo da un insieme di termini,
si occupi di tradurli in concetti (o categorie) e quindi di effettuare le relative
ricerche. Per esempio, la 4.1 in quest’ottica potrebbe diventare
{ Component } generalization-of-component-from ( { Term } ),
(4.20)
la quale a questo punto potrebbe essere articolata al suo interno come segue:
{
...
Traduzione dell’insieme di termini in un insieme di Componenti
...
Utilizzo di generalization-of (Component) per ogni componente determinato in precedenza
...
}
Appare evidente che un meccanismo di questo tipo rischia di diventare
insostenibilmente complicato nel momento in cui si vogliano contestualizzare
a questa tipologia di utilizzo dell’ontologia primitive più complesse di quella
proposta, come per esempio le (4.11) e (4.12). Sembra dunque sensato pensare semplicemente ad una primitiva come la (4.19), peraltro indispensabile
onde permettere un utilizzo completo ed efficace della (4.13).
Formalmente, l’ultima primitiva presentata diventa
component-from:
essendo T l’insieme dei possibili termini.
47
0
T → 2C ,
(4.21)
4.4
4.4.1
Primitive e categorie di utenti
Personalizzazione delle viste sull’ontologia
Come rilevato in fase di analisi delle modalità di interazione tra utenti ed
ontologia, lo strumento principe presente nell’architettura di Artemisdal
punto di vista della differenziazione degli utenti in diverse categorie è quello
del Subject category layer, dal momento che permette di prendere in
considerazione particolari viste dell’ontologia: in questo modo, è possibile
pensare ad una vista come al modo in cui una determinata categoria di
utenti vede l’insieme dei concetti dell’ontologia, ovvero come il sottoinsieme
dei concetti di suo interesse.
Alla luce di questo fatto, pensare a primitive di interazione che permettano di differenziare l’interazione a seconda della categoria di utenti (ad esempio, utenti molto esperti del dominio ed utenti novizi del dominio) risulta
corrispondere a quanto detto nella sezione 4.3.2 a proposito delle primitive
pensate per rendere possibili la ricerca a partire da Categorie.
Tale discorso tuttavia può essere ampliato prendendo in considerazione il
ruolo degli utenti dell’ontologia nella definizione delle categorie relative ad
una determinata categoria di utenti.
Da una parte, senza dubbio, si pensa a categorie che emergano dal processo di integrazione delle sorgenti collegate all’ontologia, categorie nella cui
definizione può essere chiamato ad intervenire, eventualmente, l’esperto di
dominio che della costruzione dell’ontologia si occupa.
D’altra parte, è abbastanza sensato pensare alla possibilità, per un singolo
utente, di personalizzare il suo modo di interfacciarsi con l’ontologia, nel senso
di definire una o più viste sui concetti del modello ontologico legati alle sue
esigenze ed alla sua esperienza del dominio.
Tuttavia, ritengo che una possibilità di questo tipo costituisca un servizio
riferibile ad un livello superiore a quello delle primitive con le quali l’ontologia
si interfaccia verso i suoi utenti. Ad esempio, si può pensare ad una possibilità
di personalizzazione mediante la creazione di un profilo utente locale, ovvero
che non modifichi la struttura dell’ontologia con l’aggiunta di nuove categorie,
ma debba invece essere utilizzato da un livello intermedio al fine di utilizzare
le primitive dell’ontologia.
In termini di primitive pertanto credo si possa far riferimento semplicemente a quanto riportato nella sezione 4.3.2, tenendo presente il possibile
sviluppo futuro qui discusso.
48
4.4.2
Utente umano ed utente automatico
Le primitive discusse in precedenza si prestano bene ad un utilizzo da parte
di utenti automatici, e senza dubbio meno bene a quello da parte di utenti
umani, fatto salvo il caso di utenti assai esperti del modello ontologico e delle
sue problematiche. Personalmente, sono dell’idea che l’insieme di primitive
proposte possa e forse debba costituire da base per la creazione di un interfaccia rivolta ad utenti umani, che permetta di sfruttarne le potenzialità
senza dover essere esperti del modello ontologico.
In questo senso, d’altra parte, si sono indirizzate anche alcune esperienze
presenti in letteratura, ad esempio quelle illustrate in [9] e [18].
4.5
Conclusioni
Riportiamo di seguito l’insieme delle primitive proposte, sulla scorta delle
discussioni presentate a proposito di alcune scelte di complessità e di livello
di astrazione.
1. generalization-of:
C 0 → 2C
0
2. specialization-of:
C 0 → 2C
0
3. get-relation-between:
C 0 → 2N ×AT
4. attributes-of:
5. relations-of:
C × C 0 → RT ∪ φ
0
C 0 → 2C ×RT
0
6. search-instances-of:
2C × CON → 2I
7. search-instances-of:
C 0 × CON → 2I
8. evaluate-OQL-query:
9. component-from:
Q → 2I
0
T → 2C ,
essendo C 0 = C ∪ CA l’insieme dei possibili concetti e categorie, RT l’insieme
dei possibili tipi di relazione, AT l’insieme dei possibili tipi di attributo, CON
l’insieme delle condizioni booleane su attributi di elementi di C 0 , I l’insieme
delle istanze di elementi di C 0 , Q l’insieme delle possibili query OQL e T
l’insieme dei possibili termini.
49
Interfaccia grafica
(tipo Geometria
ellittica)
Interfaccia per singolo
componente (browsing
e ricerca in base a
valori dei campi)
Interfaccia per
costruire "viste"
(categorie) LOCALI
Interfaccia per la
costruzione di query
OQL
Primitive di
"AGGIORNAMENTO"
"Filtraggio" mediante un PROFILO
LOCALE (categorie locali di concetti)
Gestore dell'ontologia
Amministratore di categoria
"Filtraggio" mediante un PROFILO
GLOBALE (categoria di utenti)
generalization-of
search-instances-of
specialization-of
get-relation-between
attributes-of
get-instances
relations-of
get-value 50
evaluate-OQL-query component-from
Capitolo 5
Modello di ricerca per ontologie
La prima sezione del capitolo propone una semplice architettura generale di
motore di ricerca basato su ontologie, ponendo l’accento sull’identificazione di un modulo dedicato alla ricerca Query - driven, oggetto della nostra
trattazione.
Quindi si contestualizza l’idea di ricerca Query - driven, ed in particolare
l’utilizzo di un linguaggio come OQL, al caso di un motore basato su ontologie. Si indicano quindi i limiti imposti dal modello ontologico sottostante,
e si discute delle caratteristiche di OQL che trovano o meno corrispondenza
nell’architettura di una ontologia. Di seguito, si dà in forma BNF una sintassi
generica di query OQL relativa all’ambito di utilizzo di nostro interesse.
Per completezza, in ogni caso, in appendice si dà una descrizione completa
della sintassi OQL, sempre in forma BNF.
Il passo successivo è quello di discutere una possibile interfaccia (grafica)
per la composizione di Query OQL, partendo dai punti di vista in proposito
presenti in letteratura.
Infine, si illustra il problema della gestione della Query OQL composta
mediante l’interfaccia, ovvero della costruzione di una risposta mediante l’utilizzo delle mapping rules dell’ontologia e la sottomissione di interrogazioni
“locali” alle singole sorgenti integrate dall’ontologia stessa. Per far questo, si
descrive la sintassi generale di una regola di mapping in ODLI 3 , e si propone un formalismo per rappresentare regole di mapping a livello concettuale,
evidenziandone la completezza dal punto di vista delle esigenze di traduzione
delle Query.
51
5.1
Introduzione: un motore di ricerca basato su ontologie
In fase di analisi delle diverse modalità di utilizzo di ontologie, ci si è soffermati su una distinzione basata sul genere di informazioni che si vogliono
reperire, intensionali (strutturali) od estensionali (relative ad istanze), e sul
punto di partenza utilizzato per le ricerche estensionali. Pare dunque sensato
ipotizzare che un motore di ricerca basato sull’utilizzo di ontologie preveda
al suo interno moduli diversi dedicati a svolgere i tre tipi di ricerca che da
quella classificazione emergono.
Vediamo nel dettaglio il funzionamento di tali moduli.
5.1.1
Moduli di navigazione
È il modulo che si occupa di rendere possibile all’utente la navigazione all’interno della struttura dell’ontologia. In particolare, esso deve prevedere
un’interfaccia grafica che permetta di rappresentare in modo semplice ma
completo le diverse entità delle quali l’ontologia è costituita, concetti e relazioni essenzialmente. Inoltre, deve dare la possibilità di spostare il proprio
punto di osservazione da un concetto ad un altro, seguendo le relazioni che
collegano i concetti oppure scegliendo da una lista generale di concetti disponibili. La parte di interfaccia dedicata al singolo concetto deve permettere
di visualizzare l’insieme degli attributi del concetto e delle relazioni che lo
legano ad altri concetti.
5.1.2
Modulo di ricerca Keyword - driven
È il modulo più vicino all’idea tradizionale di motore di ricerca: esso deve
permettere l’inserimento di un insieme di termini (parole) in base ai quali si
desidera effettuare la ricerca di istanze all’interno dell’ontologia. In realtà,
è sensato prevedere la possibilità di effettuare ricerche intensionali (concetti,
attributi) a partire da termini, fornendo cosı̀ l’opportunità di navigare attravero l’ontologia senza in partenza doverne conoscere nulla, se non il dominio
di riferimento.
5.1.3
Modulo di ricerca Query - driven
È il modulo che permette di effettuare le ricerche più complesse ed articolate
sull’insieme delle sorgenti di informazioni che l’ontologia integra.
In generale, esso deve offrire la possibilità di costruire una Query OQL
che descriva, mediante un insieme di condizioni, le caratteristiche desiderate
52
Interfaccia di navigazione
(es: geometria iperbolica)
MODULO di
navigazione
Interfaccia di composizione
di Query
Modulo di ricerca
Query - based
Interfaccia di inserimento
Keyword
MODULO di
ricerca
Keyword - based
Motore di ricerca
basato su
ONTOLOGIE
VISUALIZZAZIONE RISULTATI RICERCHE
Figura 5.1: Architettura di un motore di interrogazione basato su ontologie
53
nell’insieme di istanze restituire dalla ricerca. In particolare, è necessario
che tale possibilità sia offerta in forma grafica, da una parte sfruttando le
funzionalità del modulo di navigazione che permette di conoscere i nomi dei
concetti, delle relazioni, degli attributi, e dall’altra fornendo un’interfaccia di
composizione della query che non richieda di conoscere la sintassi di OQL, ma
solo di organizzare l’insieme di condizioni desiderate in base alle informazioni
rese disponibili dal modulo di navigazione. Un esempio di interfacce di questo
tipo è stato proposto all’interno del progetto Ontobroker (vedi [9], [8]) ed in
altri progetti (vedi [18]), ovviamente in modo diverso.
5.2
OQL per ontologie
Dal punto di vista della realizzazione di una interfaccia per la composizione
di interrogazioni OQL da sottomettere ad una ontologia, è importante effettuare un’analisi preliminare delle varie opportunità che è necessario tenere
in considerazione: se infatti OQL è pensato, in generale, per esprimere interrogazioni anche molto complesse su basi di dati ad oggetti, non è tuttavia
detto che tutte le possibilità che offre risultino interessanti e realizzabili nel
contesto di un sistema di utilizzo di ontologie.
Pertanto, mentre nell’appendice B presentiamo la sintassi completa di una
query OQL generica, in questa sezione concentriamo la nostra attenzione sugli aspetti di OQL che è possibile contemplare e che interessano nell’ambito
ontologico.
5.2.1
Presupposti, possibilità e limiti
Come già notato in fase di analisi delle modalità di impiego di una ontologia, al di là di utilizzi legati alla ricerca di informazioni di tipo strutturale,
l’interazione più tipica di un utente con una ontologia è quella volta a reperire istanze di concetti. In particolare, l’idea di fondo è quella di poter
fissare alcune condizioni alle quali devono sottostare le istanze desiderate per
essere considerate “valide”: in questo modo, all’utente è possibile scegliere
le caratteristiche delle istanze di suo interesse, scartando tutte le altre. Lo
scopo finale, chiaramente, è ottenere un elenco (un insieme) di riferimenti ad
istanze che soddisfano le condizioni imposte.
Chiaramente, tali istanze possono trovarsi in diverse sorgenti tra quelle
che l’ontologia integra: il ruolo essenziale del modello ontologico è dunque
ancora una volta quello di un mediatore che rende trasparente all’utente l’effettiva collocazione delle informazioni di suo interesse. In pratica, l’ontologia
si occupa di sottomettere ad ogni sorgente di partenza un’interrogazione, che
54
contestualizza quella proposta dall’utente nella terminologia specifica della
singola sorgente, senza che l’utente se ne debba preoccupare.
È chiaro pertanto che l’utente che effettua l’interrogazione, pur essendo
eventualmente a conoscenza dell’architettura sottostante il sistema di interrogazione, lavora nell’ottica di chi utilizza un motore di ricerca, o il catalogo di
una biblioteca, o l’indice di un libro. La differenza essenziale sta nel fatto che
l’ontologia permette di fondere, come detto in modo trasparente, sorgenti e
dunque sistemi di indicizzazione delle informazioni differenti ed indipendenti.
L’esigenza principale dunque, come ampiamente discusso a proposito
dell’Utilizzo di ontologie, è quella di scegliere uno o più concetti (o categorie di concetti) dell’ontologia, e di poter fissare particolari relazioni e vincoli
sui valori dei loro attributi e/o delle relazioni tra di essi intercorrenti.
5.2.2
Query OQL ed ontologie
L’insieme di interrogazioni OQL di nostro interesse è costituito dalle possibili istanze del costrutto select che coinvolgono condizioni su attributi di
concetti e relazioni tra concetti.
Pertanto, utilizzando una notazione di tipo BNF, possiamo rappresentare
la sintassi delle interrogazioni di nostro interesse nel modo seguente:
query ::= select attributes_list
from component_name {, component_name}
[ where condition ]
attributes_list ::= attribute {, attribute}
attribute ::= component_name.attribute_name
component_name ::= concept_name
component_name ::= category_name
condition
condition
condition
condition
condition
condition
::=
::=
::=
::=
::=
::=
condition and condition
condition or condition
not condition
( condition )
boolean_constant
term operator term
term ::= attribute
55
term ::= constant_value
constant_value ::= numeric_constant
constant_value ::= boolean_constant
constant_value ::= string_constant
operator
operator
operator
operator
operator
operator
::=
::=
::=
::=
::=
::=
=
!=
>
<
>=
<=
Chiaramente, dal punto di vista della grammatica cosı̀ descritta, concept name,
category name, attribute name, numeric constant, boolean constant,
string constant, =, !=, <, >, <=, >= sono da considerarsi come terminali.
A questo punto, riprendiamo la primitiva che abbiamo introdotto in precedenza in modo da rendere possibile la ricerca di istanze di concetti:
search-instances-of:
0
2C × CON → 2I
(5.1)
o, in notazione meno formale e più vicina all’idea di metodo da invocare
su un’ontologia,
{ Instance } search-instances-of ( { Concept }, condition )
(5.2)
È immediato notare come le possibilità di ricerca offerte da una primitiva di questo genere ricalchino quasi esattamente quelle discusse sopra a
proposito della contestualizzazione di OQL all’ambito ontologico.
Più precisamente, l’unica differenza è relativa alla possibilità o meno di
proiettare i risultati della ricerca su uno o più attributi del concetto (categoria) in questione piuttosto che considerare le istanze nel loro insieme.
D’altra parte, nell’ottica dell’utilizzo di una ontologia come supporto per ricerche web, è lecito pensare che l’esigenza prevalente sia quella di ricondursi
ad istanze dei concetti, ovvero a riferimenti a pagine web collegate ai concetti
in questione.
Cosı̀ non è riduttivo pensare, dal punto di vista della 5.1, che l’effettiva
sintassi di OQL corrispondente non sia esattamente quella proposta, ma sia
invece del tipo
56
query ::= select *
from component_name {, component_name}
[ where condition ]
La versione più completa, a questo punto, ha senso nell’ottica di un utilizzo più generale di quello orientato alla funzione di motore di ricerca. In
questo senso, si può pensare di modificare la primitiva 5.1, oppure di aggiungere all’insieme di primitive proposte una nuova voce che contempli la
possibilità di considerare solo particolari proiezioni delle istanze reperite.
5.3
5.3.1
Interfacce per comporre Query OQL
Casi pratici (in letteratura)
Prima di tutto, è importante ricordare che un’interfaccia grafica che permetta
la composizione di Query OQL non può prescindere da un’interfaccia grafica
che renda possibile la navigazione attraverso i concetti dell’ontologia: infatti,
ricordiamo che per comporre una Query è necessario essere a conoscenza dei
nomi di concetti e categorie, nochè dei nomi degli attributi e delle relazioni
sui quali si vogliono imporre condizioni. È chiaro che un utente, soprattutto
se occasionale, che intenda utilizzare le funzionalità di un motore di interrogazione basato su ontologie non deve essere costretto a conoscere e ricordare
tali informazioni, delle quali ha tuttavia inequivocabilmente bisogno. Per
questo motivo, in letteratura, quando si propone un’interfaccia grafica per
la composizione di interrogazioni, in genere si sviluppa il discorso nell’ottica,
più ampia, di un insieme di interfacce che permettano anche l’accesso alle
informazioni strutturali (intensionali) contenute nell’ontologia.
In particolare, si possono individuare due tipologie fondamentali di interfaccia che renda possibile l’accesso alla struttura di una ontologia.
Intuitivamente, un primo semplice caso è quello in cui i concetti dell’ontologia sono rappresentati, mediante il loro nome, in un albero che rende
evidenti le relazioni di sussunzione tra concetti padre e concetti figli. è il
caso ad esempio di strumenti di costruzione di ontologie come OntoEdit.
Naturalmente, nulla vieta di utilizzare un approccio di questo genere, oltre
che per la modifica e per la realizzazione di ontologie, anche per la semplice visualizzazione del loro contenuto intensionale. Un approccio di questo
genere prevede che, selezionando opportunamente il nome di un concetto,
sia possibile visualizzare l’insieme degli attributi che lo compongono e delle
relazioni che intrattiene (escluse naturalmente quelle di generalizzazione e
specializzazione, esplicite nel diagramma ad albero).
57
D’altra parte, la letteratura in materia propone (si vedano ad esempio le
esperienze illustrate in [9] e [18]) anche l’utilizzo di interfacce grafiche studiate
specificamente per il caso ontologico, ovvero per il caso di un insieme di concetti in mutua relazione. In particolare, la differenza rispetto alla possibilità
descritta in precedenza si riferisce alla visualizzazione della struttura costituita da concetti, mentre non tocca la visualizzazione della “composizione
interna” dei singoli concetti. Si tratta ad esempio di utilizzare un approccio
basato sulla geometria iperbolica (vedi figura 5.2), che permette modificare il
punto di vista, incentrando attenzione e rappresentazione grafica sul concetto selezionato e sui concetti ad esso più strettamente collegati, dando invece
minor risalto a quelli meno affini.
Figura 5.2: Esempio di interfaccia basata su geometria iperbolica
Accanto a queste interfacce di visualizzazione, che come detto risultano
indispensabili anche nell’ottica di formulazione di una Query, proponiamo
ora due esempi, tratti dai casi reali [18] e [9] ricordati in precedenza, relativi
all’interfaccia di composizione vera e propria di un’interrogazione.
L’articolo [18], ad esempio, propone un’interfaccia di navigazione iperbolica come quella descritta in precedenza, alla quale associa, in corrispondenza
della selezione di un nodo (corrispondente ad un concetto), un frame che,
58
oltre ad illustrare le caratteristiche costitutive (attributi, relazioni) del concetto in questione, permette, mediante un insieme di campi, menu a tendina
e check-box, di impostare condizioni di ricerca sui valori di attributi e relazioni (vedi figura 5.3). Il limite di una scelta di questo genere, evidentemente,
è il fatto di ridurre la complessità delle Query cosı̀ realizzabili al caso di
condizioni che coinvolgono valori di un solo concetto.
Figura 5.3: Esempio di frame tratto da [18]
In [9], al contrario, si presenta una soluzione leggermente diversa e più
flessibile, in termini di interrogazioni che è possibile realizzare tramite essa. Infatti in questo caso, accanto alla “solita” interfaccia di navigazione
basata sulla geometria iperbolica, si prevede un modulo per comporre l’interrogazione che non risulta collegato ad un singolo concetto, ma permette di
istanziare più concetti, di fissare condizioni sui valori dei rispettivi attributi,
e di realizzare vincoli di riferimento tra istanze dell’uno ed istanze dell’altro
concetto, mediante variabili associate ai diversi concetti (vedi figura 5.4). In
pratica, il senso di un’interfaccia di questo genere è quello di schematizzare
59
graficamente la scrittura di una interrogazione pensata in termini di clausole
della logica a frame su cui si basa, come linguaggio di rappresentazione ed
interrogazione, il progetto Ontobroker. Tuttavia, la corrispondenza delle variabili associate ai concetti con la possibilità, offerta da OQL, di effettuare
una sorta di join tra concetti diversi, e di esprimere condizioni sugli attributi
di tali concetti, mostra come una soluzione del tipo di quella proposta in [9]
possa essere ritenuta interessante e completa anche dal punto di vista che
interessa a noi, quello della costruzione di Query OQL.
Figura 5.4: Esempio di frame tratto da [9]
In poche parola, utilizzando un parallelo con le interrogazioni in OQL
che per mezzo di esse è possibile costruire, la differenza tra le due proposte
illustrate, e riferite come detto a casi di reale utilizzo di ontologie come base
per la ricerca di informazioni, è quella che c’è tra una Query completa (nel
secondo caso) ed una nella quale la clausola from del costrutto select sia
vincolata a contenere uno ed un solo nome di concetto.
5.3.2
Interfacce per comporre Query e progetto Artemis
Dal punto di vista delle nostre esigenze, ovvero di pensare ad una interfaccia
di composizione di Query OQL da utilizzare nell’ambito del sistema Artemis, è importante ricordare (tabella 5.1) la struttura del frame riferito ad un
singolo concetto.
60
Proprietà
Name
Type
Properties
Kind-of
Subconcept
Association
Weblinks
Descrizione
Nome del concetto c
Concetto locale(X-Class), concetto globale(global X-Class),
Subject Category
Lista delle proprietà del concetto. Obbligatorio per X-Classi ed
X-Classi globali
Nomi dei concetti che sussumono c. Obbligatorio per tutte
le categorie soggetto tranne che per la radice della gerarchia.
Opzionale per X-Classi ed X-Classi globali.
Nomi dei concetti che specializzano c. Obbligatorio per
tutte le categorie soggetto eccetto le foglie. Opzionale per
X-Classi ed X-Classi globali.
Nome dei concetti dell’ontologia legati a c da una
relazione di tipo SYN o RT.
Link web alle sorgenti di dati associate a c. Obbligatorio
per le X-Classi globali. Per categorie soggetto, derivato da quelli
delle X-Classi globali collegate.
Tabella 5.1: Struttura del frame di un concetto in Artemis
Chiaramente, la realizzazione di un’interfaccia che agisca all’interno del
sistema Artemis non può non tenere in considerazione tale rappresentazione
a frame dei concetti dell’ontologia: infatti, tale rappresentazione concettuale
permette da una parte di mettere in evidenza le caratteristiche di un concetto
che l’interfaccia deve poter rappresentare, e dall’altra di sottolineare quali
di queste caratteristiche possono essere utilizzate allo scopo di aggiornare
l’interfaccia in base alle azioni dell’utente (navigazione seguendo i riferimenti
a concetti correlati, ad esempio) o di costruire la risposta all’interrogazione
composta.
Alla luce di quanto detto in precedenza, sia in generale al proposito della
composizione di Query OQL, sia in particolare per quanto riguarda i due casi
reali citati, vediamo ora di discutere gli aspetti concettuali rappresentati dalla
tabella 5.1 nell’ottica della costruzione di un’interfaccia che operi all’interno
del sistema Artemis.
Interfacce e frame concettuale di tabella 5.1
Prima di tutto, si nota che tutte le caratteristiche necessarie alla realizzazione di un’interfaccia per navigare attraverso i concetti dell’ontologia sono
comprese nel frame concettuale presentato, che descrive - indipendentemente
61
dal linguaggio logico nel quale l’ontologia viene effettivamente rappresentata - la struttura e le proprietà di concetti locali, concetti globali e categirie
soggetto.
Infatti, notiamo che tale frame prevede, per ogni concetto (categoria), informazioni relative a
• concetti genitori, per risalire nella gerarchia;
• concetti figli, per scendere nella gerarchia;
• concetti collegati mediante altre relazioni, onde esplicitare situazioni di affinità tra concetti in termini di contesto di riferimento, nonchè
relazioni terminologiche di sinonimia;
• proprietà (attributi) del concetto stesso, onde definirlo precisamente
mediante la descrizione delle sue parti.
Mediante queste caratteristiche, tenendo in considerazione anche le informazioni relative al nome ed alla tipologia dell’unità concettuale (concetto
locale, concetto globale, categoria), è chiaramente rappresentare ogni concetto nella totalità dei suoi aspetti, nonchè spostarsi da un concetto ad un
altro ad esso relazionato. In tal senso, l’idea più semplice di una interfaccia
si costruisce attorno alle caratteristiche rappresentate dal frame concettuale
di tabella 5.1. Si immagina dunque di rappresentare graficamente l’insieme
dei concetti dell’ontologia, collegandoli mediante le informazioni sulle relazioni di sussunzione, di specializzazione e generiche. Quindi, selezionando
un particolare concetto, le informazioni sugli attributi ed un riepilogo delle
relazioni con altri concetti possono essere rapidamente resi disponibili.
Interfaccia per la composizione di Query
A questo punto, possiamo immaginare un’interfaccia che sfrutti queste informazioni per comporre interrogazioni OQL. In particolare, l’idea prospettata
da [18] appare interessante, anche se limitata a interrogazioni sul singolo
concetto, in quanto direttamente realizzabile modificando in modo semplice
ed immediato l’interfaccia di rappresentazione già descritta. D’altra parte, è
vero anche che una ricerca incentrata su di un solo concetto, se non esaurisce
la totalità delle tipologie di interrogazioni immaginabili, costituisce in ogni
caso il caso più frequente ed intuitivo di utilizzo di una ontologia a scopo
di ricerca. Sembra pertanto una buona idea quella di semplificare al massimo tale tipo di interazione tra utente e sistema, integrandone la possibilità
all’interno dell’interfaccia di descrizione del singolo concetto.
62
Per quanto riguarda, infine, la composizione di interrogazioni più complesse, che convolgano più di un concetto, l’interfaccia relativa deve in qualche
modo riferirsi ad una concezione come quella presentata in [9]. Tuttavia, il
limite principale di tale proposta è senza dubbio quello di presentare all’utente un’interfaccia scollegata dalla rappresentazione della struttura dei concetti
dell’ontologia, e degli attributi ditali concetti. Al contrario, sembra sensato
supporre che una composizione tipica di interrogazioni ad una ontologia si
sviluppi a seguito di una navigazione tra concetti e di una presa di visione delle caratteristiche costitutive delle singole unità concettuali. Per questo, l’idea
che intendiamo proporre è quella di integrare il modulo di composizione di
Query OQL complesse all’interno di un’interfaccia più vasta, che permetta di
tenere sotto controllo tanto l’insieme dei concetti e delle reciproche relazioni,
quanto gli attributi dei concetti di volta in volta selezionati. Ad esempio, si
può pensare ad un’interfaccia fondamentalmente basata su una rappresentazione (ad albero, mediante geometria iperbolica, . . . ) dell’ontologia nel suo
complesso, affiancata da una sezione di descrizione del concetto selezionato
e da una per la composizione di Query complesse, quest’ultima del tipo di
quella presentata in figura 5.4. In questo modo, l’utente ha la possibilità di
tenere sotto controllo tutte le informazioni che gli servono, ed eventualmente
di procurarsi le informazioni relative ai nomi di concetti, attributi e relazioni
durante la costruzione della sua interrogazione.
Una soluzione di questo tipo, tuttavia, mantiene un problema evidente
della proposta di [9], quello della realizzazione di join tra concetti diversi mediante variabili impostate dall’utente (Variable1 e Variable2 nell’esempio
mostrato in figura 5.4), aspetto senza dubbio macchinoso per l’utente poco
esperto di ontologie e soprattutto di linguaggi di interrogazione.
In realtà, l’unica possibilità in tal senso potrebbe essere quella di un’interfaccia un po’ più complessa di quelle viste in [18] e [9], costituita da tre
parti fondamentali:
• Sezione di visualizzazione della struttura dei concetti
• Sezione di visualizzazione degli attributi del concetto selezionato
• Sezione in cui selezionare, visualizzare e modificare le caratteristiche
dell’interrogazione
Il significato delle prime due parti è evidente alla luce di quanto detto
fino ad ora.
Questa terza sezione, invece, può essere vista come l’evoluzione del
modulo riportato in figura 5.4: in particolare, essa deve comprendere un elenco di concetti, anche ripetuti, associati automaticamente a
63
variabili diverse (il cui nome, per esempio, può essere costituito da
una variazione di quello del concetto corrispondente e da un numero
progressivo). Tale elenco deve poter essere aggiornato (aggiunta e rimozione di concetti associati a variabili) intervenendo sull’interfaccia
di rappresentazione della gerarchia dei concetti. Accanto a tale elenco, in corrispondenza delle diverse variabili, si deve poter visualizzare
una descrizione del corrispondente concetto (attributi, relazioni); deve essere quindi possibile, all’interno di tale visualizzazione, impostare
condizioni sui valori che i singoli attributi devono assumere. Tali valori
possono essere delle costanti, oppure riferirsi a condizioni di join con
altre variabili (condizioni su relazioni) o con attributi di altre variabili (condizioni su attributi). A tale scopo, l’impostazione dei valori su
attributi e variabili può essere effettuata mediante un campo di testo
(valori costanti) o mediante un menu a tendina (condizioni di join).
Tale menu deve proporre esclusivamente le variabili-istanza, o gli attributi di tali variabili, il cui tipo è compatibile con quello dell’attributo,
o della relazione, sul quale si sta imponendo una condizione.
5.4
5.4.1
Gestione di una Query OQL: costruzione
della risposta
Considerazioni generali
Il primo problema che ci si trova a dover affrontare nell’ambito della costruzione della risposta ad una query sottomessa ad una ontologia, è quello della
differente terminologia utilizzata dall’ontologia stessa rispetto a quella delle
diverse sorgenti che essa integra. Infatti, è evidente che per fornire una risposta all’interrogazione in questione è necessario effettuare una ricerca presso le
diverse sorgenti di informazioni, e che tuttavia tale ricerca non può in generale essere svolta utilizzando la stessa terminologia della query di partenza.
In generale, infatti, i nomi di concetti ed attributi dello schema globale dell’ontologia non corrispondono a quelli degli schemi locali, essendo frutto di
un’integrazione di termini provenienti dalle diverse sorgenti.
Ricordando le opportunità offerte da ODLI 3 per la rappresentazione di
ontologie, è chiaro identificare nelle mapping rules l’aspetto che permette di
ovviare a questo problema. È per mezzo di esse, infatti, che vengono mantenuti riferimenti tra i concetti ontologici relativi ai diversi livelli dell’ontologia, ed in particolare è per mezzo di esse che si può pensare di “tradurre”
la terminologia globale in quelle locali.
In realtà, tale traduzione non costituisce un passo banale all’interno della
64
costruzione della risposta all’interrogazione, ma risulta al contrario influenzata da considerazioni relative tanto alle caratteristiche delle sorgenti di informazione in questione e dell’integrazione effettuata, quanto alla necessità
di pensare a meccanismi e tecniche di ottimizzazione delle interrogazioni da
sottomettere alle singole sorgenti.
Ad esempio, può darsi il caso di una classe globale che derivi da classi
locali che presentano attributi diversi: in particolare, se un attributo globale
coinvolto nella query non corrisponde ad alcun attributo di una delle particolari classi locali relative, si ha il primo caso critico per quanto riguarda la
traduzione dell’interrogazione stessa. Si parla in questo caso di attributo
non verificabile, e ci si trova di fronte ad una scelta: sottomettere la query
alla sorgente cui appartiene la classe con l’attributo non verificabile, ignorando le condizioni su tale attributo, col rischio di restituire informazioni errate,
oppure non farlo, col rischio di tralasciare informazioni corrette. L’altro evidente problema è quello dell’utilità o meno di alcune sorgenti locali rispetto
alla ricerca: se infatti le regole di mapping fissano che un particolare attributo locale può assumere un solo valore, e tale valore rende identicamente falsa
la condizione della query, è chiaro come sia sensato evitare di coinvolgere
la sorgente cui tale attributo si riferisce nel meccanismo di costruzione della
risposta alla query. In tal caso, si tratta essenzialmente di una questione di
ottimizzazione.
In ogni caso, le regole di mapping espresse mediante ODLI 3 rendono
possibile tenere in considerazione tali casi, senza dubbio critici, a proposito
della traduzione delle interrogazioni. Qualora non si verifichi nessuno dei due
casi precedentemente ricordati, è necessario utilizzare le informazioni fornite
dalle mapping rules per procedere ad una corretta contestualizzazione delle
interrogazioni globali nell’ottica delle differenti terminologie locali.
Diamo ora di seguito una definizione generale della sintassi delle mapping
rules prevista da ODLI , per poi discutere più dettagliatamente della casistica
dei problemi di traduzione.
5.4.2
Mapping rules in ODLI 3
attr_dcl
::= [readonly] attribute domain_type attribute_name [*]
[fixed_array_size] [mapping_rule_dcl]
mapping_rule_dcl::= mapping_rule rule_list
rule_ list
::= rule
| rule, rule_list
rule
::= local_attr_name
| identifier
65
| and_expression
| union_expression
and_expression ::= (local_attr_name and and_list)
and_list
::= local_attr_name
| local_attr_name and and_list
union_expression::= (local_attr_name union union_list on identifier)
union_list
::= local_attr_name
| local_attr_name union union_list
local_attr_name ::= source_name.class_name.attribute_name
Presentiamo ora un esempio di utilizzo di questo costrutto all’interno
della definizione di una classe ODLI 3 :
interface FoodPlace
{
attribute name
mapping rule
ED.FastFood.name,
FD.Restaurant.name,
FD.Brasserie.name;
attribute category
mapping rule
ED.FastFood.category,
ED.Restaurant.category,
FD.Bistro.type;
attribute zone
mapping rule
ED.FastFood = "Pacific Coast",
FD.Restaurant = "Atlantic Coast",
FD.Bistro = "Atlantic Coast",
FD.Brasserie = "Atlantic Coast";
}
Chiaramente, si tratta di una rappresentazione mediante un particolare
linguaggio logico di un insieme di connessioni tra le entità dell’ontologia del
quale è ovviamente possibile immaginare una rappresentazione concettuale, la quale cioè sia indipendente dal particolare linguaggio utilizzato per
rappresentare l’ontologia a livello logico.
Nella sezione seguente verraà proposto un semplice formalismo concettuale in grado di rappresentare informazioni di questo genere astraendole dalla specificità del linguaggio logico mediante il quale l’ontologia viene
effettivamente rappresentata.
66
5.4.3
Sviluppo di un formalismo concettuale per mapping rules
Essenzialmente, si tratta di rappresentare, in pratica, quello che graficamente
può essere visto come il contenuto di una tabella la 5.2.
FoodPlace
ED.FastFood
FD.Restaurant
FD.Bistro
FD.Brasserie
name
name
name
null
name
category
category
category
type
null
zone
‘Pacific Coast’
‘Atlantic Coast’
‘Atlantic Coast’
‘Atlantic Coast’
Tabella 5.2: Esempio di tabella di mapping
Rifacendoci all’esperienza ed all’esempio di X-Formalism esteso, che definisce le entità dell’ontologia in termini di n-uple, possiamo pensare ad una
concettualizzazione delle regole di mapping come quella che segue:
Una regola di mapping (mapping rule) è una coppia della forma:
global-class-name
class-mapping-rule
: GCN
: {attribute-mapping-rule}
attribute-mapping-rule
local-class-name,
local-attribute-name>}
= {<global-attribute-name,
dove local-attribute-name può a sua volta essere
• Un singolo attributo locale (mapping diretto di un attributo globale su
di un attributo locale)
• Un valore costante (mapping di un attributo locale su di un valore
costante per la classe locale local-class-name)
• Una concatenazione di attributi locali del tipo (local-attr 1 ,local-attr2 ,
...,local-attrN ) (mapping in and)
• Un’alternativa di attributi locali del tipo (local-attr 1 |local-attr2 |
...|local-attrN ) (mapping in union)
• Un valore nullo (null), in corrispondenza di classi locali local-class-name
mappate sulla classe globale GCN che non possiedono attributi su cui si
mappi l’attributo globale global-attribute-name
67
Naturalmente, ogni terna <global-attribute-name, local-class-name,
local-attribute-name> è individuata univocamente dalla coppia dei primi
due elementi (ovvero, per ogni attributo locale il mapping su di una classe
locale è unico). D’altra parte, data una classe globale GCN, per ogni attributo
globale global-attribute-name in essa compreso e per ogni classe locale local-class-name dalla quale GCN deriva, esiste una terna attributemapping-rule individuata dalla coppia <global-attribute-name, localclass-name>
Discutiamo ora il significato delle diverse caratteristiche concettuali di
una regola di mapping, allo scopo di verificarne la completezza e l’esaustività
dal punto di vista della “traduzione” di Query sull’ontologia in Query locali
alle sorgenti di dati. Per far questo, consideriamo le diverse tipologie di
attributo globale che è possibile avere, dal punto di vista della mappatura su
attributi di classi locali:
• Attributi globali mappati direttamente su attributi locali
Si tratta di attributi globali in corrispondenza biunivoca con un particolare attributo di una classe locale. In questo caso, la traduzione della
Query globale in Query locale per la sorgente in questione è molto semplice, e prevede la semplice sostituzione del nome di attributo globale
con il nome dell’attributo locale ed ovviamente quella del nome della
classe locale con quello della classe locale.
Ad esempio, è il caso dell’attributo globale name mappato direttamente
sull’attributo locale ED.FastFood.name.
In questo caso, una Query come
select name
from FoodPlace
diventa
select name
from FastFood
• Attributi globali mappati mediante corrispondenza in and
In questo caso, gli attributi globali in questione sono ottenuti dal concatenamento degli attributi locali in and fra loro. La traduzione del
nome degli attributi, dunque, consiste nella sostituzione del nome dell’attributo globale con i nomi di tutti gli attributi locali su cui si mappa,
68
contestualmente alla clausola della Query nella quale l’attributo globale
compare.
Pertanto, dato il caso di mapping
interface Person
{
attribute name
mapping rule
S1.Persona.nome,
(S2.Mensch.Vorname and S2.Mensch.Familienname);
}
una Query come
select name
from Person
viene tradotta, per la sorgente S2, come segue:
select Vorname, Familienname
from Mensch
Ancora, una Query in cui l’attributo mappato in and compaia nella clusola where dell’interrogazione, viene mappata tenendo conto del diverso
ruolo dell’attributo in questione. Pertanto
select *
from Person
where name = ’Pietro Martinelli’
diventa per la sorgente S2
select *
from Mensch
where Vorname = ’Pietro’ and Familienname = ’Martinelli’
69
• Attributi globali mappati mediante corrispondenza in union
Si tratta di attributi globali il cui mapping sugli attributi locali di una
determinata classe dipende dal valore di un terzo parametro, indicato
in genere come tag attribute. In tal senso, è necessario sia definita una
regola che definisca come effettuare il mapping. Vediamo ad esempio il
caso seguente:
interface Car
{
attribute country
mapping rule
S.Auto.paese,
attribute price
mapping rule
(S.Auto.prezzo_italiano union S-Auto.prezzo_inglese on Regola1);
}
rule Regola1
{
case of S.car.paese:
’Italia’
: S.car.prezzo_italiano;
’Inghilterra’ : S.car.prezzo_inglese;
}
Immaginando di avere la Query globale
select price
from Car
la traduzione genera due interrogazioni distinte, e più precisamente
select prezzo_italiano
from Auto
where paese = ’Italia’
e
70
select prezzo_inglese
from Auto
where paese = ’Inghilterra’
• Attributi globali mappati su valori costanti
Questo è, infine, il caso in cui un attributo globale sia mappato su una
costante di una classe locale (si veda, per esempio, il caso dell’attributo zone della classe globale FoodPlace presentato in precedenza).
Informazioni di questo tipo coinvolgono, più che l’aspetto della pura
traduzione dell’interrogazione, quello dell’ottimizzazione della Query,
già indicato in precedenza.
Cosı̀ ad esempio una Query come
select *
from FoodPlace
where zone = ’Pacific Coast’
non darà origine ad alcuna interrogazione alla sorgente FD, mentre sarà
tradotta nella Queri banale
select *
from FastFood
per quanto riguarda la sorgente ED, con evidenti vantaggi intermini di
risparmio di tempo di ricerca su entrambe le sorgenti (nel secondo caso,
in quanto permette di non dover verificare una condizione che si sa per
ipotesi essere sempre verificata per le istanze della classe FastFood).
Abbiamo dunque illustrato, mediante alcuni semplici esempi basati sulla rappresentazione delle mapping rules in ODLI 3 , le diverse possibilità che
possono aversi quando si deve convertire una interrogazione globale in interrogazioni a sorgenti locali. Tali esempi esauriscono evidentemente tutte le
eventualità che è necessario tenere in considerazione affrontando il problema.
Pertanto, un formalismo come quello presentato a pagina 67 rappresenta a livello concettuale, in modo esauriente, tutti i diversi casi di mapping
di nostro interesse.
71
Capitolo 6
Progetto e implementazione di
interrogazioni in ARTEMIS
6.1
Introduzione
Come detto nella sezione 5.4, ogni query è espressa dall’utente in termini di
concetti dell’ontologia. Il problema che qui ci si pone è quello di riformulare
la query originale come un set di query da sottoporre alle sorgenti associate
all’ontologia. In particolare, la riformulazione di interrogazioni poste sui concetti dell’ontologia, in interrogazioni valutabili dalle singole sorgenti locali,
richiede un processo di traduzione che coinvolge meccanismi di mapping tra
i diversi livelli in cui l’ontologia è organizzata .
L’insieme delle risposte ottenute dalle interrogazioni poste sulle singole
sorgenti andrà combinato e riconciliato per fornire un risultato omogeneo
quale risposta alla query originale.
Tuttavia, in questo lavoro limitiamo il nostro interesse al solo processo di
riformulazione della query.
Illustriamo dunque nel dettaglio i concetti che è necessario considerare
in questo problema, per poi chiarire gli aspetti algoritmici.
6.2
6.2.1
Analisi e descrizione dei concetti rilevanti
Inquadramento nell’architettura di Artemis
Diamo ora una breve presentazione dell’architettura di Artemis, in modo
da illustrare a grandi linee il contesto entro il quale i nostri moduli software
andranno ad operare. In particolare, descriviamo le funzionalità realizzate
72
dai diversi moduli esistenti, allo scopo di definire e precisare i requisiti ai
quali dovranno rispondere quelli che andremo a progettare e realizzare.
Il sistema Artemis, allo stato attuale, si occupa dell’intera processo di
integrazione che, partendo da sorgenti eterogenee e distribuite d’informazioni
relative ad uno stesso dominio, giunge sino alla costruzione di un’ontologia
che modelli tale dominio.
Tale processo si realizza mediante una successione di diverse fasi, logicamente concatenate, che descriviamo brevemente di seguito:
1. Prefase di Wrapping, che permette di passare da una descrizione estensionale delle sorgenti da integrare realizzata mediante XML-Schema o
RDF ad una rappresentazione delle sorgenti in termini di X-Class (vedi
2.5) e quindi di schemi ODLI 3 (vedi 2.6).
2. Fase di valutazione di affinità: Artemisvaluta l’affinità tra tutte le
possibili coppie di classi, mediante un’analisi dell’affinità di nome e
dell’affinità strutturale, e una successiva determinazione di un’affinità
globale, ottenuta come media pesata delle precedenti.
3. Fase di Clustering: in base ai risultati della valutazione di affinità ed
alla scelta di una soglia di affinità, le classi locali vengono raggruppate
in cluster. Ogni cluster rappresenta un insiemi di due o più classi affini.
4. Fase di Unificazione: da ogni cluster viene ottenuta una sola classe
globale, che rappresenta il risultato dell’integrazioni delle classi locali
associate al cluster in questione. Si ottiene in questo modo la cosiddetta
vista integrata, ovvero un insieme di classi globali e di corrispondenze
tra classi globali e classi locali.
5. Fase di wrapping ODLI 3 - X-Formalism: la descrizione delle classi globali ottenute dalla fase precedente viene tradotta nel linguaggio concettuale X-Formalism.
6. Fase di generazione dell’ontologia di dominio: partendo dalle X-Class
globali fornite dalla fase precedente, un apposito modulo ricava un’ontologia di dominio, costruendo un insieme di concetti, e di relazioni tra
concetti, sia partendo da eventuali relazioni esplicite sia inferendone di
nuove in base alla struttura dei concetti.
A questo punto, la necessità che ci si trova ad affrontare è quella di rendere
possibile l’utilizzo dell’ontologia ottenuta allo scopo di ottenere informazioni.
Da una parte, dunque, è necessario disporre di un sistema di composizione
di interrogazioni sull’ontologia; dall’altra, si rende indispensabile realizzare
73
un meccanismo che, sfruttando le informazioni prodotte durante le fasi di
integrazione e di generazione dell’ontologia, permetta di ricondurre l’interrogazione sull’ontologia ad un insieme di interrogazioni sulle sorgenti locali
di partenza. A queste esigenze rispondono i moduli software progettati e
realizzati nell’ambito di questa tesi, di cui daremo conto nelle sezioni che seguono, e che presentiamo nella figura 6.1 inseriti nell’architettura complessiva
di Artemis.
Figura 6.1: Architettura di Artemis: in verde i moduli realizzati nell’ambito
di questa tesi
6.2.2
Concetti associati ad un’interrogazione
Query Una generica Query che consideriamo, ed in particolare una Query sull’ontologia, comprende le possibili forme di interrogazioni OQL che si
manifestano nel processo di traduzione. In particolare, un Query può essere
caratterizzata come una coppia <variabili, condizione>, dove variabili
74
è l’insieme delle variabili coinvolte nell’interrogazione e condizione è la
condizione espressa dalla clausola where dell’interrogazione OQL.
Local Query Una Local Query è la specializzazione di una generica Query
contestualizzata ad una sorgente locale. Pertanto, oltre alla struttura di una
Query, essa comprende, in particolare, informazioni di corrispondenza tra la
query posta sull’ontologia e la query locale vera e propria. Le informazioni
di corrispondenza determinano come i termini della query locale (i nomi di
interfacce ed i nomi di attributo, o le costanti) sono associati ai termini della
query originale (ad esempio, quale associazione attributo globale - attributo
locale sono verificate nel contesto della particolare query locale considerata).
Variable In una qualsiasi query SQL è possibile associare variabili alle relazioni coinvolte nella clausola from della query, per poi utilizzare tali variabili
nelle altre clausole della query stessa. Analogamente, in una query OQL
posta sull’ontologia, è consentito l’uso di variabili associate a concetti.
Una Variable modella una variabile in una query ed è caratterizzata da
una coppia <nome variabile, tipo variabile>. Nel caso di una interrogazione su ontologia il tipo variabile è il nome del concetto del quale la
variabile nome variabile è istanza.
Condition Una Condition corrisponde alla condizione booleana che è
possibile esprimere nella clausola where di un’interrogazione OQL.
6.2.3
Tipologie di mapping tra livelli diversi: utilizzo
e rappresentazione
Prima di tutto va ricordato che, nell’architettura di ontologia considerata
(vedi figura 6.2), esistono diverse tipologie di mapping, ovvero
M1 Mapping tra concetti dell’ontologia ed X-Class globali
M2 Mapping tra X-Class globali e schema integrato
M3 Mapping tra schema integrato e schemi locali
M4 Mapping complessivo tra concetti dell’ontologia e schemi locali
In particolare, è chiaro come ai fini della traduzione di query il mapping di
maggiore interesse sia l’ultimo, che altro non è che la composizione di quelli
precedenti, che fornisce la corrispondenza tra gli elementi del livello più alto
quelli del livello più basso dell’ontologia.
75
Vediamo ora, in breve, le altre tipologie di mapping, illustrando dal punto
di vista concettuale come entità di un certo livello si mappino in entità di
livello più basso.
Mapping tra concetti dell’ontologia ed X-Classi globali Sussistono tre diversi casi nel mapping di concetti dell’ontologia su X-Class globali
(si veda [3]):
• Corrispondenza uno a uno tra concetto ed X-Class (fig. 6.2, caso
M1.A)
• Corrispondenza uno a molti tra concetto ed X-Class (fig. 6.2, caso
M1.C): è il caso di X-Class diverse che rappresentano uno stesso concet-
(Concetti)
(M1.A)
(M1.B)
(M1.C)
(M1)
(X-Class globali)
(M2.A)
(M2)
(M2.B)
(Interfacce globali)
(M3)
(Interfacce locali)
(Sorgente 1)
(Sorgente 2)
(Sorgente 3)
Figura 6.2: Tipologie di mapping tra livelli dell’ontologia
76
to. Ad esempio, due X-Class come IndirizzoCasa ed IndirizzoNegozio,
rappresentando entrambe un indirizzo, possono dar vita ad un unico
concetto Indirizzo.
• Corrispondenza molti a uno tra concetto ed X-Class (fig. 6.2, caso
M1.B): è il caso di X-Class il cui tipo complesso contenga costrutti di
choice. Ogni possibilità di scelta nell’espressione choice dà origine ad
un concetto diverso.
Nel primo dei tre casi, la traduzione di un’interrogazione sull’ontologia in una
corrispondente interrogazione su X-Class è banale, e comporta semplicemente
la sostituzione del nome del concetto con quello della X-Class da cui tale
concetto deriva. Le proprietà del concetto corrispondono a quelle della XClass, e non è pertanto necessario alcun intervento di traduzione dei loro
nomi.
Nel secondo caso, il nome del concetto è associato ai nomi di n X-Class
diverse. Un’interrogazione posta sul concetto sarà tradotta nell’unione (costrutto union di OQL) di n interrogazioni sulle diverse X-Class da cui il concetto deriva (ad esempio, select * from Indirizzo verrà riformulata come
select * from Indirizzocasa union select * from IndirizzoNegozio).
Infine, il terzo caso viene trattato in modo simile al primo, dal momento che ad ogni concetto corrisponde una ed una sola X-Class globale, e la
sostituzione risulta pertanto univoca.
Mapping tra X-Class e schema integrato Normalmente, una XClass globale è associata ad una ed una sola interface dello schema integrato. In questo caso, il nome della X-Class e dell’interface coincidono, i
nomi delle rispettive proprietà anche, ed i tipi delle proprietà della X-Class
sono derivati da quelli delle proprietà dell’interface dal Wrapper “ODL I 3
to X-Formalism” mediante gli algoritmi descritti in [12].
Un’eccezione a questa regola si verifica qualora una interface dello schema integrato sia definita, per quanto riguarda la sua struttura, da un’alternativa tra diversi (ad esempio N + 1) corpi mediante il costrutto union di
ODLI 3 . In questo caso, all’interface in questione corrispondono N + 2
X-Class, una rappresentativa di ogni corpo dell’alternativa ed una per rappresentare l’alternativa stessa (come illustrato in [12]). In questo caso, la
denominazione delle X-Class segue una regola precisa: l’interface
interface nomeInterfaccia
(...)
{...}
union nomeUnion1
77
{...}
union nomeUnion2
{...}
...
union nomeUnionN
{...}
dà origine ad una classe con nome nomeInterfaccia e tipo nomeInterfacciaType, N X-Class ognuna con nome nomeInterfaccia@nomeUnionI e tipo nomeInterfaccia@nomeUnionI Type, dove I è l’indice del corpo I-esimo,
e ad una interfaccia con nome nomeInterfacciaOR e tipo {nomeInterfacciaORType,[nomeInterfaccia, nome Interfaccia@nomeUnion1, ...,
nomeInterfaccia@nomeUnionN]}.
Anche in questo caso le proprietà delle X-Class sono omonime a quelle
dell’interface, mentre i tipi sono derivati secondo gli algoritmi descritti in
[12].
Operativamente, nella riformulazione di query, la corrispondenza tra XClass e schema integrato è ottenuta facendo riferimento alle regole di denominazione descritte, che permettono di associare l’X-Class alla propria
interface.
Mapping tra schema integrato e schema locale Questa tipologia
di mapping, infine, è già ampiamente discussa in ??.
Risulta evidente come, da un punto di vista concettuale, non vi sia differenza, in termini di rappresentazione, tra questo genere di mapping e quello
di nostro interesse, indicato al punto M4. In entrambi i casi, infatti, si tratta
di mappare attributi di classi globali (siano esse concetti o interface globali
dello schema integrato) su attributi di interface locali.
In particolare, come già mostrato, si può pensare di rappresentare le
regole che descrivono mapping come quelli ai punti M3 e M4 mediante una
tabella come la 5.2. Per ogni classe di alto livello è dunque data una tabella,
sulle cui colonne troviamo gli attributi della classe in questione e sulle cui
righe troviamo la coppia <sorgente, interfaccia locale>. Ogni cella
della tabella, contiene la descrizione del mapping di un attributo della classe
per i dati sorgente ed interface locale. Una regola di mapping, come si è
proposto in 5.4.3, è una coppia
global class name
class mapping rule
: GCN
: {attribute mapping rule}
78
dove
attribute mapping rule
local class name,
local attribute name>}
= {<global attribute name,
Con riferimento alla rappresentazione tabellare appena descritta, il global
class name individua la tabella, il global attribute name individua la colonna, il local class name individua la riga (essendo costituito da due parti, sorgente e nome interfaccia locale), il corrispondente local attribute name infine è associato alla cella della tabella, e può assumere le forme
descritte in 5.4.3.
6.3
6.3.1
Progetto delle classi
Classi che modellano un’interrogazione
Nella sezione 6.2.2 sono stati presentati i concetti principali associati ad una
interrogazione. In particolare, sono stati introdotti i concetti di Query, Local
Query, Variable e Condition. Modellare i primi tre mediante semplici strutture dati risulta immediato. Dal punto di vista della rappresentazione di una
Condition tramite strutture dati, tale concetto non corrisponde ad un’unica struttura dati, ma viene più naturalmente illustrato definendo diverse
tipologie di condizione. Di conseguenza, dal punto di vista implementativo,
sembra opportuno modellare una Condition, più che con una classe, con
una interfaccia, che caratterizzi il comportamento di una classe che intenda
rappresentare un particolare tipo di Condition. Si tenga inoltre presente
che, usualmente, è possibile rappresentare un’espressione di qualunque genere (espressione algebrica, espressione booleana, statement di un linguaggio di
programmazione,. . . ) mediante un albero binario (o binarizzabile). Definiamo prima di tutto le tipologie di nodi dell’albero necessario per rappresentare
una qualunque Condition.
79
<<Interface>>
<<Interface>>
Copyable
Condition
+getCopy(): Copyable
+stampa(out: DataOutputStream): void
left
SimpleCondition
-variabili: SearchableVector
-condizione: Condition
ComplexCondition
-operator: String
-booleanOperator: int
-leftOperand: Operand
-left: Condition
-rightOperand: Operand
rightOperand
-right: Condition
<<Interface>>
+getConceptOfVariabe(var: String): String
Translatable
leftOperand
1..*
<<Interface>>
Operand
Variable
+traduciPer(sorgente: Source, mapTab: ConceptToLocalMappingTable): Translatable
Constant
-valore: String
BooleanConstant
+toString(): String
-nome: String
80
Figura 6.3: Classi che modellano la Query
Query
right
-tipo: String
Literal
Source
LocalQuery
-tradotto: boolean
-interrogazioni: Vector
-tabella: TraductionChoiceTable
+getTraductionChoiceTable(): TraductionChoiceTable
1..*
-variabile: String
-attributo: String
-nome: String
-variabile: String
+translating: int
+addTraductionChoiceItem(): TraductionChoiceItem
+creaTraduzione(mapTab: ConceptToLocalMappingTable): void
+LocalQuery(query: Query): LocalQuery
+getTranslatingQuery(): LocalQuery
-attributi: Vector
+addLocalQuery(query: LocalQuery): void
<<Interface>>
SearchableVector
NewComparable
-current: int
+compareTo(toCompare: Object, mode: int): int
-currentMode: int
+getConceptOfVariable(var: String): String
1..*
TraductionChoiceTable
LiteralConcatenation
-daCercare: NewComparable
+search(toSearch: NewComparable, mode: int): NewComparable
+getNext(): NewComparable
+searchVector(toSearch: NewComparable, mode: int): SearchableVector
ComplexCondition Una ComplexCondition concettualizza la parte
ricorsiva della grammatica che, come visto in ??, descrive in generale una
clausola where di una interrogazione. In particolare, essa corrisponde ad
un operatore booleano (AND, OR o NOT) applicato ad uno (nel caso OR)
oppure a due operandi, che sono a loro volta Condition. Dunque una
ComplexCondition è modellabile come una terna <booleanOperator, left,
right>, dove booleanOperator è il tipo di operatore che il nodo rappresenta, e left e right sono le due sotto-condizioni collegate dall’operatore in
questione (chiaramente, nel caso NOT una delle due perde significato).
SimpleCondition Una SimpleCondition, al contrario, concettualizza
la parte non ricorsiva della definizione di una condizione: essa rappresenta infatti una foglia dell’albero che modella la condizione, cioè un’espressione booleana semplice, tipo var1.x > 2 o var2.y != var3.x. Pertanto,
una SimpleCondition può essere modellata come una terna <operatore,
leftOperand, rightOperand>, dove operatore è l’operatore della condizione atomica e leftOperand e rightOperand sono gli operandi (vedi 6.3.1)
che tale operatore confronta.
BooleanConstant Una Boolean Constant modella il caso banale di
condizione booleana, quello costituito semplicemente da una costante booleana. Essa dunque può essere rappresentata, semplicemente, come un valore.
Operand
Un Operand modella un qualunque operando di una condizione atomica di
una interrogazione. Anche in questo caso, più che rappresentare una struttura comune a tutti i tipi di operando, un Operand descrive una caratteristica
(l’essere un operando) comune a concetti diversi, e può pertanto essere in
modo più naturale modellata come interfaccia più che come classe. Classi
che implementano tale interfaccia modellano le diverse possibilità cui ci si
trova di fronte analizzando un operando di una condizione atomica.
Constant Una Constant rappresenta la tipologia degli operandi costanti (costanti numeriche, alfanumeriche o booleane). Si può dunque modellare, semplicemente, come una stringa di caratteri contenente il valore della costante. Il caso particolare Boolean Constant, come discusso in 6.3.1,
rappresenta anche un caso banale di Condition.
81
Identifier Un Identifier rappresenta un attributo di una variabile che funge da operando. Può pertanto essere modellato da una coppia
<variabile, attributo>. Inoltre, nell’ottica di nostro interesse, quella cioè
della traduzione di Query in LocalQuery, è utile associare ad un Identifier
un flag booleano che indichi se tale Identifier, all’interno di una certa
SimpleCondition della Local Query, sia già stato tradotto o meno.
IdentifierConcatenation Una IdentifierConcatenation rappresenta un tipo particolare di operatore, quello risultante da un’espressione costituita dalla concatenazione di attributi di una certa variabile, ed è dunque rappresentabile mediante una coppia <variabile, attributi>, dove
variabile è il nome della variabile in questione ed attributi l’insieme degli attributi concatenati. In particolare, l’utilità di modellare tale tipologia
di operando emerge in fase di traduzione della query in query locali, come
si vedrà analizzando il modo di elaborare le diverse tipologie di regole di
mapping.
6.3.2
Classi che definiscono l’ontologia
Ontology
Una Ontology è il concetto che rappresenta l’ontologia nel suo insieme, ed
è dunque, essenzialmente, un insieme di concetti e di relazioni tra concetti.
In particolare, essa viene modellata come un insieme di concetti, nella cui
definizione sono riportate le informazioni sulle relazioni con altri concetti.
Oltre a questo, è necessario modellare i tipi di attributo utilizzati per
definire le componenti dei concetti. Vediamo, di seguito, le classi utilizzate
per modellare i diversi aspetti dell’ontologia.
GenericTypeDefinition
Questa classe rappresenta gli elementi comuni ad una generica definizione
di tipo, sia essa un tipo di attributo o un concetto.
In particolare, una GenericTypeDefinition è costituita da un nome, da
un vettore equivalenteA di nomi di GenericTypeDefinition equivalenti e
da un vettore disgiuntoDa di GenericTypeDefinition disgiunte da quella
in questione.
82
GenericTypeDefinition
-equivalenteA: Vector
-disgiuntoDa: Vector
GeneralElement
StructType
AttributeType
-attributi: SearchableVector
-sinonimi: SearchableVector
83
Figura 6.4: Classi che modellano le entità dell’ontologia
-nome: String
ComplexType
-tipoBase: Attribute
Concept
-genitori: SearchableVector
-figli: SearchableVector
Attribute
-attributi: SearchableVector
1..*
-toXClass: Vector
-tipo: AttributeType
-cardinalita: String
-specifica: String
ListType
RangeType
-lowerBound: int
-upperBound: int
1..*
-lowerBoundInf: Boolean
-upperBoundInf: Boolean
Ontology
-concetti: SearchableVector
-tipi: SearchableVector
EnumType
-item: Vector
GeneralElement
La classe GeneralElement estende la GenericTypeDefinition e concettualizza l’aspetto comune a concetti ed attributi. In particolare, tale aspetto
è costituito dall’insieme sinonimi dei sinonimi del GeneralElement in questione e dai metodi dedicati al trattamento (aggiunta di un elemento, lettura
dell’insieme di sinonimi) di tale insieme di sinonimi.
Concept
La classe Concept estende la GenericElement e modella un concetto dell’ontologia. Sue caratteristiche peculiari, oltre a quelle già discusse per la classe
GeneralElement, sono:
• genitori, insieme dei concetti che sussumono il concetto in questione
• figli, insieme di concetti che specializzano il concetto in questione
• attributi, insieme degli attributi del concetto in questione
• to X Class, insieme di riferimenti alla X-Classi dalle quali il concetto
in questione deriva
Attribute
Un Attribute concettualizza un attributo di un concetto dell’ontologia. In
particolare, oltre a quanto ereditato da GeneralElement, gli elementi che
costituiscono un Attribute sono:
• tipo, che rappresenta il tipo dell’attributo in questione
• cardinalità, che rappresenta la cardinalità dell’attributo in questione
• specifica, che rappresenta la specifica dell’attributo in questione, è
un aspetto della definizione di tipo di attributo in X-Formalism
AttributeType
Un AttributeType rappresenta un generico tipo di attributo. Questa classe
estende la classe GenericTypeDefinition. Non presenta nuovi attributi nè
nuovi metodi, dal momento che il fatto stesso di essere un AttributeTye
caratterizza in modo esauriente il sottoinsieme di GenericTypeDefinition
di nostro interesse.
84
ComplexType
Questa classe estende la classe AttributeType e rappresenta i tipi di attributo non primitivi, ovvero costruiti a partire da un tipo base. Il riferimento al tipo base sul quale viene costruito il tipo complesso in questione è
rappresentato dall’attributo tipoBase.
ListType
La classe ListType estende la classe ComplexType allo scopo di rappresentare un tipo complesso ottenuto mediante il costrutto list di ODLI 3 . Non
presenta nuovi attributi, dal momento che il fatto di essere un ListType ne
esaurisce completamente la descrizione.
EnumType
Un EnumType è un ComplexType che rappresenta tipi costruiti mediante il
costrutto ODLI 3 enum. Esso comprende dunque un vettore item che modella
l’insieme degli elementi dell’enumerazione utilizzati per definire il nuovo tipo.
SpecificComplexType
Uno SpecificComplexType è un ComplexType costruito fissando, a partire
da un dato tipo base, un particolare valore costante. Tale valore può rappresentare un tipo CONSTANT (un attributo di questo tipo ha il valore fissato),
un tipo FIXED (un attributo di questo tipo può essere definito come facoltativo, ma se esiste ha il valore fissato) o un tipo DEFAULT (un attributo di
questo tipo, a meno di esplicite indicazioni, ha il valore fissato).
RangeType
Un RangeType è un tipo complesso che rappresenta tipi costruiti definendo un
range ODLI 3 . Tale classe è costituita dunque dalla quadrupla <lowerBound,
upperBound, lowerBoundInf, upperBoundInf>, dove i primi due attributi
sono gli estremi del range e gli ultimi due sono valori booleani che servono
per modellare estremi di range infiniti.
StructType
Uno StructType è un AttributeType che rappresenta tipi definiti mediante
il costrutto struct di ODLI 3 . Pertanto, tale classe comprende un vettore
attributi di attributi della struct.
85
6.3.3
Classi che modellano il mapping tra livelli diversi
MappingTarget
-tipo: int
-target: Vector
+Mapping(type: int): MappingTarget
+addTarget(target: String): void
Mapping
-classeAltoLivello: String
-attributoAltoLivello: String
-sorgente: String
-interfacciaLocale: String
-mappingTarget: MappingTarget
+MappingRule(hlClass: String, hlAttr: String, source: String, localInt: String): Mapping
1..*
1..*
GlobalToLocalMappingTable
+GlobalToLocalMappingTable(nomeFileSchema: String): void
ConceptToLocalMappingTable
+insertMapping(rule: Mapping, concetto: Concept): void
<<utilizza>>
<<Interface>>
Translatable
+traduciPer(sorgente: Source, mapTab: ConceptToLocalMappingTable): Translatable
Figura 6.5: Classi che modellano il mapping tra livelli diversi
Presentiamo ora come si è deciso di rappresentare il mapping tra classi
86
di alto livello ed interfacce locali.
MappingTarget
Un Mapping Target è la concettualizzazione di una cella di una tabella come
la 5.2, ovvero rappresenta la proprietà local attribute name della rappresentazione concettuale sopra ricordata. In particolare, un Mapping Target è
una coppia <tipo, target>, dove tipo rappresenta il tipo di mapping (come discusso in 5.4.3, un attributo globale si può mappare su una costante, su
un singolo attributo locale, su un’alternativa(OR) di attributi locali, su una
concatenazione (AND) di attributi locali, oppure può non avere mapping su
una determinata interfaccia locale associata alla classe di alto livello in analisi), mentre target costituisce il vettore di entità locali sulle quale si effettua
il mapping (e dunque può contenere una costante, un attributo locale, o più
attributi locali).
Mapping
Un Mapping descrive:
• l’insieme degli elementi necessari per individuare una cella di una tabella come la 5.2
• il suo contenuto;
Può pertanto essere vista come una quintupla <classeAltoLivello, attributoAltoLivello, sorgente, interfacciaLocale, mappingTarget>, dove le prime quattro proprietà sono le caratteristiche che individuano una cella
e la quinta è un Mapping Target, come descritto nel paragrafo precedente.
È evidente che la classe Mapping modella un qualsiasi tipo di mapping
fra due livelli diversi. Nel seguito si vedrà ad esempio come tale classe può
essere utilizzata tanto per rappresentare il mapping tra schema integrato e
schemi locali, quanto per rappresentare il mapping tra concetti dell’ontologia
e schemi locali.
GlobalToLocalMappingTable
Una GlobalToLocalMappingTable descrive il mapping tra schema integrato
e schemi locali(mapping M3 in 6.2.3). È un insieme di Mapping, ovvero un
vettore i cui elementi sono oggetti Mapping. In particolare, questa tabella
viene costruita analizzando il file ODLI 3 che descrive lo schema integrato ed
i suoi riferimenti agli schemi locali.
87
ConceptToLocalMappingTable
Una ConceptToLocalMappingTable descrive il mapping tra concetti dell’ontologia e schemi locali delle sorgenti(mapping M4 in 6.2.3). È una tabella le
cui righe sono Mapping. In particolare, questa tabella si costruisce partendo
dall’insieme dei concetti dell’ontologia e dalla GlobalToLocalMappingTable.
Il meccanismo di costruzione di tale tabella si basa sulla possibilità di comporre le informazioni di mapping tra concetti ed X-Class con quelle relative
alle corrispondenze tra X-Class ed interface globali e con quelle contenute
nella tabella GlobalToLocalMappingTable.
6.3.4
Altre classi
Abbiamo indicato i concetti che permettono, una volta tradotti in classi, di
modellare le entità del dominio di nostro interesse. Diamo ora un accenno
delle classi necessarie per compiti di servizio, ovvero la cui definizione non
è collegata ad esigenze rappresentative di una qualche entità del dominio,
bensı̀ alla necessità di svolgere particolari compiti.
QueryTraductionManager
Questa classe funge da “contenitore” per le classi che modellano l’ontologia,
l’interrogazione da tradurre e le regole di mapping tra concetti e sorgenti
locali. In questo modo, essa rappresenta l’unica classe con la quale un utente
esterno abbia la necessità di interagire per utilizzare il modulo di traduzione
di interrogazioni.
In particolare, la sua struttura ed i suoi legami con le altre classi sono
quelli indicati in figura 6.6.
Classi Scanner e Parser
Per quanto riguarda l’acquisizione delle informazioni contenute nei file OQL
od ODLI 3 , è opportuno utilizzare analizzatori lessicali e sintattici specifici
per ogni tipologia di file di input. In particolare, per la definizione del lessico
e dei relativi analizzatori è comodo fare uso del generatore di analizzatori
lessicali JFlex, mentre per quanto riguarda la definizione delle grammatiche
e la realizzazione degli analizzatori sintattici si utilizza il generatore BYacc-J.
JFlex, partendo da una descrizione mediante espressioni regolari di un lessico, e da una corrispondenza tra riconoscimento di tali espressioni ed azioni
da intraprendere, genera una classe Java che svolge funzione di analizzatore
lessicale per il lessico in questione.
88
BYacc-J, partendo da una definizione di una grammatica in forma BNF, e
da una corrispondenza tra produzioni riconosciute ed azioni da intraprendere,
genera una classe Java che svolge funzione di analizzatore sintattico per la
grammatica in questione.
QueryTraductionManager
-nomeFileOntologia: String
-nomeFileSchema: String
Ontology
-nomeFileQuery: String
-concetti: SearchableVector
-ontologia: Ontology
-tipi: SearchableVector
-query: Query
-sorgenti: SearchableVector
-mapTab: ConceptToLocalMappingTable
+setNomeFileSchemaIntegrato(nome: String): void
+setNomeFileOntologia(nome: String): void
+setNomeFileQuery(nome: String): void
<<utilizza>>
+leggiSorgenti(): void
+creaTraduzioni(): void
+stampaQuery(): void
<<utilizza>>
GlobalToLocalMappingTable
Query
-variabili: SearchableVector
+GlobalToLocalMappingTable(nomeFileSchema: String): void
-condizione: Condition
+getConceptOfVariabe(var: String): String
ConceptToLocalMappingTable
+insertMapping(rule: Mapping, concetto: Concept): void
Source
-nome: String
-interrogazioni: Vector
+translating: int
+creaTraduzione(mapTab: ConceptToLocalMappingTable): void
+getTranslatingQuery(): LocalQuery
+addLocalQuery(query: LocalQuery): void
Figura 6.6: La classe Query Traduction Manager
89
In particolare, si è deciso di realizzare tre coppie di analizzatori lessicale
e sintattico, per leggere i tre diversi file in input:
• OntologyScanner ed OntologyParser, per l’acquisizione della descrizione dell’ontologia.
• IntegratedSchemaCompleteScanner ed IntegratedSchemaCompleteParser, per l’acquisizione della descrizione dello schema integrato.
• OQLScanner ed OQLParser, per l’acquisizione dell’interrogazione
OQL da tradurre.
6.4
Traduzione di Query:rappresentazione delle scelte
Precisiamo prima di tutto che parlando di traduzione di Query indichiamo
il processo che, partendo da una Query sull’ontologia, e sfruttando le informazioni contenute in una ConceptToLocalMappingTable, genera per ogni
sorgente integrata dall’ontologia una Local Query e la traduce nella terminologia della sorgente in questione. In particolare, tale meccanismo di
traduzione può:
1. non dare origine ad alcuna traduzione, nel caso in cui un qualche concetto associato ad una variabile della Query non si mappi su alcuna
interfaccia locale di quella sorgente, oppure nel caso in cui per un particolare attributo di una variabile della Query non esista mapping su
alcuna interfaccia locale a quella sorgente, tra quelle su cui si potrebbe
mappare il concetto cui la variabile si riferisce;
2. dare origine ad una traduzione “semplice”, nel caso in cui ogni concetto
ed ogni attributo presenti nella Query si mappino esattamente su una
sola interfaccia locale e su un solo attributo locale, rispettivamente, per
ogni sorgente considerata;
3. dare origine ad una traduzione costituita dalla concatenazione (mediante costrutto union di OQL) di più LocalQuery, esaustiva di tutte
le possibili combinazioni di corrispondenze tra concetti ed interfacce
locali (qualora un singolo concetto si possa mappare su più interfacce
locali alla medesima sorgente) e tra attributi di concetti ed attributi di
interfacce locali (qualora un singolo attributo di un concetto si mappi
90
su un’alternativa - union nella mapping rule - di attributi di una certa
interfaccia locale).
È evidente che, se il caso 1 è banale, e se il caso 2 si esaurisce nella ricerca
di una corrispondenza tra concetti ed interfacce locali, il caso 3 è quello più
difficile da trattare nel processo di traduzione. Per supportare questo caso
particolare, come indicato in precedenza (vedi 6.2.2), una Local Query è una
Query dotata di una tabella di corrispondenze, ovvero di scelte di traduzione
operate in fase di riformulazione della query, tra entità dell’ontologia (concetti e relativi attributi) ed entità locali nelle quali quelle dell’ontologia sono
state tradotte. Vediamo dunque come sono rappresentate le corrispondenze
utilizzate per la traduzione (tenere traccia di queste informazioni, da una
parte è necessario ai fini della traduzione, e dall’altra potrebbe essere utile
per riformulare i risultati ottenuti dalle query poste sulle singole sorgenti in
termini della query di partenza.
TraductionChoiceItem
-concetto: String
TraductionChoiceTable
-attributoGlobale: String
-interfacciaLocale: String
-mappatoSu: Vector
-tipoMapping: int
1..*
mappatoSu è un vettore
con n > 1 elementi nel
caso di mapping in AND
Figura 6.7: Classi che rappresentano le scelte di traduzione
6.4.1
TraductionChoiceItem
Un TraductionChoiceItem è la descrizione di una corrispondenza tra un
attributo di un concetto dell’ontologia ed attributi di interface locali. Esso è dunque una quintupla <concetto, attributo globale, interfaccia
91
locale, mappato su, tipo mapping>, dove mappato su è un vettore di attributi locali (caso di mapping con concatenazione (AND) di attributi locali),
un attributo locale o una costante, tipoMapping definisce il tipo di mapping
relativo a questa scelta (AND, singolo attributo, costante).
6.4.2
TraductionChoiceTable
Una TraductionChoiceTable è una tabella di Traduction Choice Item, e
rappresenta l’insieme delle scelte effettuate nei passi successivi di riformulazione della Query sull’ontologia in una particolare Local Query, quella cui
la tabella è associata. Chiaramente, una Traduction Choice Table viene
costruita ed aggiornata incrementalmente man mano che l’interrogazione viene tradotta, in particolare quando vengono tradotti gli eventuali attributi di
concetti della query di partenza (vedi 6.5.2).
6.5
Traduzione di Query: algoritmi
Come già discusso in 5.4, il problema della traduzione di interrogazioni OQL
comporta l’utilizzo delle regole di mapping tra i diversi livelli dell’ontologia.
In particolare, come visto, tali regole si differenziano in alcune tipologie diverse, presentate in 6.2.3. Abbiamo detto che le regole che mappano concetti
dell’ontologia (e loro attributi) sulle interfacce locali delle sorgenti possono
essere ottenute componendo i tre livelli di mapping dettagliatamente descritti
in ??, ed abbiamo illustrato il significato di tali tipologie di mapping.
Vediamo ora, alla luce dei concetti illustrati in precedenza, ed in particolare del discorso sulle scelte di traduzione presentato in 6.4, che cosa significa
tradurre una Query in una LocalQuery e come avviene tale traduzione.
Sia data una particolare sorgente locale, per la quale è necessario ottenere
una traduzione di una Query formulata sull’ontologia. Il primo passo della
traduzione consiste nell’istanziare una Local Query sulla base della Query
in questione. In pratica, tale Local Query, associata alla sorgente, risulta
essere inizialmente una copia della Query sull’ontologia, la cui tabella delle
scelte di traduzione si presenta, da principio, vuota.
Si tratta, quindi, di tradurre questa copia che abbiamo associato alla sorgente di nostro interesse. In particolare, tradurre un’interrogazione significa
tradurne l’elenco di variabili e tradurne la condizione. Si noti come in generale una query OQL non debba necessariamente associare variabili ai concetti
della clausola from; tuttavia, dal momento che ci occupiamo di query OQL
composte mediante un’interfaccia di composizione e non direttamente, si assume per semplicità che tale interfaccia componga query OQL nelle quali
92
ad ogni concetto viene automaticamente associata una variabile. In questo
senso, dunque, ha senso parlare di traduzione di variabili e di attributi di
variabili, come si farà in seguito.
6.5.1
Traduzione di variabili
Tradurre le variabili della query significa sostituire i nomi di concetto associati alle variabili con nomi di interfacce locali. In generale, tale sostituzione
Concetto --> Interfaccia locale non è, per una data sorgente, univoco.
La traduzione di una variabile dell’interrogazione, dunque, genera in linea di
principio diversi possibili risultati, corrispondenti alla combinazione di tutte
le possibili alternative di sostituzione per il singolo concetto. In realtà, non è
detto che tutte queste alternative siano valide per quanto riguarda la traduzione dell’interrogazione. Infatti, è importante tenere in considerazione che
un dato concetto C, pur mappandosi su una certa interfaccia locale IL, può
non avere su di essa un mapping per ogni suo attributo. Si veda il seguente
esempio, nel quale le regole di mapping tra concetti ed interfacce locali sono
espresse mediante la notazione utilizzata da ODLI 3 :
interface Cat
{
attribute string name
mapping rule
S.Gatto.nome,
S.Cat.name;
attribute string color
mapping rule
S.Cat.color;
}
In questo caso, è evidente che in generale il concetto Cat si mappa sia sull’interfaccia locale S.Gatto sia su quella S.Cat. È tuttavia altrettanto chiaro
come una traduzione di Cat in S.Gatto risulti priva di valore per interrogazioni la cui condizione coinvolga l’attributo name di una variabile riferita al
concetto Cat, non essendoci alcun mapping di tale attributo sull’interfaccia
in questione.
Questo semplice esempio sottolinea come, benchè concettualmente sia
possibile immaginare la traduzione delle variabili e la traduzione della condizione di una Query come due passi separati, dal punto di vista operativo
è sensato evidenziare il legame che lega i due aspetti: l’esempio stesso della rappresentazione di regole di mapping in ODLI 3 rende evidente come il
93
mapping su una particolare interfaccia locale (e su suoi attributi) dipenda
non solo dal concetto, bensı̀ anche dai suoi attributi.
Sembra pertanto logico svolgere prima la traduzione della condizione della
query, e dal risultato delle scelte di traduzione operate in tale fase desumere
la traduzione dei concetti in interfacce locali.
Allo scopo di rappresentare la caratteristica di traducibilità comune ai
concetti utilizzati per rappresentare un’interrogazione, si è deciso di introdurre un’interfaccia, denominata Translatable. Tale interfaccia vincola
le classi che la implementano a prevedere un metodo traduciPer(Source,
ConceptToLocalMappingTable), che rappresenta il cuore del processo di traduzione. In particolare, i concetti che devono essere traducibili (Translatable) sono Condition ed Operand: tali interfacce, pertanto, sono definite
come estensioni di Translatable. Vediamo ora come le classi che modellano le diverse tipologie di Condition e di Operand si comportano dal punto
di vista della traducibilità, ovvero come si traduce ogni singolo concetto di
nostro interesse.
6.5.2
Traduzione di condizioni
La traduzione di una condizione avviene analizzando ricorsivamente la struttura ad albero dell’espressione che rappresenta la condizione. Vediamo dunque come avviene la traduzione dei singoli nodi di tale albero, a seconda del
loro tipo.
Complex Condition Una condizione complessa si traduce riscrivendo
le due sotto-condizioni corrispondenti ai due rami di sinistra e di destra
che si dipartono dal nodo Complex Condition dell’albero che rappresenta la
condizione della query. In particolare, in caso di condizione complessa di tipo
NOT, la traduzione si effettua traducendo il solo sottoalbero corrispondente
alla condizione negata dall’operatore booleano unario.
Simple Condition Una condizione semplice si traduce riscrivendo i
due operandi dell’operatore che la Simple Condition rappresenta.
Constant, BooleanConstant Ogni costante, e pertanto anche ogni
costante booleana, rimane invariata dopo il processo di traduzione.
Identifier Un identificatore, ovvero una coppia <variabile, attributo>, si traduce considerando il mapping della terna <concetto, attri-
94
buto, sorgente> (dove concetto è il nome del concetto associato alla variabile variabile) su interfacce ed attributi locali.
È chiaro per quanto detto in precedenza che tale mapping non è necessariamente univoco, e può dunque portare a dover considerare diverse alternative, ovvero a generare più traduzioni diverse, ugualmente valide, della query
di partenza. Tali traduzioni, come detto, verranno composte in un’unica query da sottomettere alla sorgente locale mediante l’operatore union di OQL
(in alternativa, si può pensare di sottomettere separatamente alla sorgente
le diverse Local Query risultanti, e di effettuare quindi l’unione dei risultati
cosı̀ ottenuti).
Esemplifichiamo l’uso della tabella delle scelte che, come detto, viene
associata ad ogni Local Query. Riferendoci all’esempio indicato sopra, ipotizziamo di dover tradurre due diversi Identifier riferiti all’attributo name
di variabili che istanziano il concetto Cat. Ad una prima occorrenza di tale situazione, chiaramente, si sdoppia la Local Query in due Local Query
alternative, entrambe associate alla stessa sorgente. Nella prima di tali alternative si userà il mapping di Cat.name su S.Cat.name, nella seconda quello
su S.Gatto.nome. Proseguendo poi nella traduzione della prima delle due
alternative, si incontrerà nuovamente un attributo name di una variabile di
tipo Cat. In questo caso, chiaramente, è necessario rimanere coerenti ed effettuare la stessa scelta che ha portato a definire quella particolare possibilità
di traduzione (e dunque considerare solo il mapping su S.Cat.name).
Ancora, può darsi il caso in cui si sia incontrato un Identifier riconducibile alla coppia Cat.color, e che si sia pertanto utilizzato il mapping
su S.Cat.color. A questo punto, incontrando un Identifier riferito a
Cat.nome, pur non avendo ancora effettuato mapping di questo tipo, si dovrà necessariamente scegliere il solo mapping su S.Cat.nome, escludendo
quello su S.Gatto.nome, valido in generale ma incompatibile con le scelte
già effettuate.
In pratica, dunque, il ruolo della Mapping Choice Table è quello di mantenere nel caso della traduzione di una query una traccia delle scelte effettuate
sino alla traduzione dell’Identifier in questione.
Vediamo ora, nel dettaglio, come si deve operare per tradurre per una
certa sorgente sorgente un Identifier <variabile, attributo> di una
Local Query query.
1. Si individua il concetto concetto corrispondente alla variabile variabile dell’identifier.
2. Si cerca nella TraductionChoiceTable associata a query la coppia <concetto,
attributo>.
95
2.1. Se esiste una riga della tabella con tale terna, si utilizza il mapping che essa rappresenta per tradurre l’attributo dell’Identifier in
questione.
2.2. Se non esiste una riga di questo genere, si cerca nella tabella una riga
contenente <concetto>
2.2.1. Se non esiste una riga di questo genere, si cerca nella ConceptToLocalMappingTable un insieme di righe con la terna concetto,
attributo, sorgente.
2.2.1.1. Se tale insieme è vuoto, significa che non è possibile tradurre la coppia <concetto, attributo> per
sorgente: in questo caso, si eliminano tutte le possibili LocalQuery associate a sorgente.
2.2.1.2. Se tale insieme contiene un solo elemento, siamo di
fronte a tre possibilità:
• Tale elemento rappresenta un MappingTarget su
una costante: si sostituisce l’Identifier con la costante in questione e si aggiorna la TraductionChoiceTable
con il mapping seguito (quintupla <concetto, attributo globale, interfaccia locale, costante, tipo
= COSTANTE>). La traduzione dell’Identifier è
conclusa.
• Tale elemento rappresenta un singolo attributo di
una interfaccia locale: si sostituisce l’attributo attributo
con il nome dell’attributo locale trovato, e si aggiorna la TraductionChoiceTabel con il mapping seguito (quintupla <concetto, attributo globale,
inter- faccia locale, attributo locale, tipo
= ATTRI- BUTO>). La traduzione dell’Identifier è
conclusa.
• Tale elemento rappresenta un MappingTarget su
una concatenazione di attributi di un’interfaccia locale: si sostituisce l’Identifier con una IdentifierConcatenation e si aggiorna la MappingChoiceTable con il
mapping seguito (quintupla <concetto, attributo,
interfaccia locale, elenco attributi locali,
tipo = CONCATENAZIONE>). La traduzione dell’Identifier è conclusa.
• Tale elemento rappresenta un’alternativa di N attributi di un’interfaccia locale: in questo caso, si
96
hanno N diverse possiblità di traduzione. Si creano dunque N copie (N - 1 oltre a quella corrente)
della LocalQuery in traduzione, e si differenziano
le varie copie con le N possibilità di traduzione di
attributo offerte dall’alternativa tra gli attributi.
Chiaramente, si inserisce nelle rispettive tabelle di
scelta la quintupla <concetto, attributo, sorgente, interfaccia locale, attributo locale scelto, tipo = ATTRIBUTO>, dove attributo locale scelto è l’attributo, tra quelli in
alternativa, scelto per la copia in questione. La
traduzione dell’Identifier è conclusa.
2.2.1.3. Se tale insieme contiene N > 1 elementi, significa che
la coppia <concetto, attributo> si mappa su N interfacce locali a sorgente. In questo caso, si procede generando N (N - 1 più quella attuale) copie della LocalQuery attuale, e si differenziano le copie aggiornando le rispettive tabella di scelta con la terna
<concetto, attributo, interfaccia locale scelta>.
2.2.2. Se esiste una riga di questo genere, si utilizza il nome di interfaccia locale in essa contenuto per cercare nella ConceptToLocalMapping Table una riga con la quadrupla <concetto, attributo, sorgente, interfaccia locale>.
• Se non esiste una riga del genere, significa che le scelte di
traduzione sin qui effettuate non possono portare a traduzioni complete della query di partenza. Pertanto, si elimina
la LocalQuery corrente.
• Se esiste una riga del genere, ci si trova di fronte alle
alternative già chiarite in 2.2.1.2.
97
6.6
Realizzazione dell’interfaccia utente
Trattiamo ora il problema della realizzazione di un’interfaccia grafica che
permetta di navigare l’ontologia e di comporre interrogazioni OQL su di
essa, sulla scorta di quanto ià discusso nella sezione 5.3. In tale sezione
si sono presentati due diversi approcci, presenti in letteratura, al problema
di nostro interesse. Sulla base di tali casi reali, si è presentata una prima
strutturazione di un sistema grafico che permetta un accesso semplice e chiaro
alla struttura dell’ontologia, nonchè di ottenere dall’ontologia informazioni
di tipo intensionale ed estensionale.
Vediamo ora un approccio più organico e completo al problema della
realizzazione di un’interfaccia per utilizzare modelli ontologici.
6.6.1
Obiettivi: analisi dei requisiti
Prima di tutto, riprendiamo brevemente le esigenze alla base del nostro lavoro
di progetto e realizzazione dell’interfaccia.
• Disporre di un’interfaccia di tipo grafico, del genere di quelle presenti in
progetti reali in letteratura, capace di visualizzare la struttura dell’ontologia, ovvero l’insieme dei concetti che la compongono, delle relazioni
tra di essi (almeno quelle principali), e la struttura di ogni concetto.
Seguire un requisito di questo genere, chiaramente, va nella direzione
di realizzare un’interfaccia che si proponga come strumento di semplice
uso anche ad utenti non esperti, dando una rappresentazione di tipo
grafico o semi-grafico del modello in uso.
• Realizzare un’interfaccia adatta al’utilizzo di utenti non necessariamente esperti nell’utilizzo di linguaggi di Query SQL-like. In questo senso,
l’idea di un’interfaccia di composizione di query basata su elementi grafici (menu a tendina, pulsanti,. . . ) ed azioni tramite mouse (clic del
mouse, drag and drop,. . . ) si propone di fornire un di supporto intuitivo
all’utente inesperto.
• Facilitare l’apprendimento dell’uso tramite indicazioni che l’interfaccia
fornisce nell’ottica di facilitare l’apprendimento e l’utilizzo dell’interfaccia stessa.
• Prevedere un buon supporto all’utente dal punto di vista del feedback che l’interfaccia fornisce in presenza di azioni scorrette e dunque
non permesse, allo scopo di chiarire all’utente gli errori commessi e di
evitarne la ripetizione.
98
• Supportare l’utente nella composizione di interrogazioni corrette, ovvero guidare la composizione delle query in modo da evitare, ad esempio,
condizioni che coinvolgano il confronto tra entità di tipo incompatibile.
Gli ultimi tre requisiti, in particolare, vanno nella direzione di soddisfare i
principali criteri di usabilità di Nielsen [17], ben noti nell’ambito della Human
Computer Interaction.
Più precisamente, si è posta particolare attenzione a presentare all’utente un’interfaccia che gli permetta di evitare errori inutili, guidandolo in
una composizione completa e corretta delle interrogazioni, impedendogli di
compiere azioni scorrette dal punto di vista della realizzazione di tali interrogazioni, e segnalando in modo adeguato e chiaro tanto le indicazioni sul da
farsi, quanto le segnalazioni di eventuali errori.
D’altro canto, si è cercato di fornire l’interfaccia proposta di un Help
completo ed esauriente, onde aiutare l’utente in caso di dubbio.
Infine, si è pensato a due diversi livelli di utilizzo dell’interfaccia, rendendo immediatamente disponibili le più comuni opzioni di composizione di
un’interrogazione, e dando la possibilità di attivare in un secondo momento
quelle più avanzate.
6.6.2
L’interfaccia proposta: descrizione e commento
Come già accennato nella sezione 5.3, la nostra idea è quella di proporre un’interfaccia articolata in tre diverse parti, la prima per visualizzare i concetti dell’ontologia e le loro relazioni, la seconda per descrivere la struttura dei singoli
concetti, la terza per la composizione vera e propria dell’interrogazione.
È abbastanza evidente che ciascuna di queste diverse parti può, in linea
di massima, essere realizzata in più modi diversi. Qui si propone pertanto una possibile scelta realizzativa per le tre diverse sezioni dell’interfaccia;
tuttavia, le scelte architetturali adottate in fase di realizzazione permettono,
come spiegato più avanti, di sostituire in modo semplice, a livello di implementazione, uno dei tre moduli con un altro che svolga la stessa funzione in
modo diverso.
Presentazione dell’ontologia Per la presentazione della struttura dell’ontologia si è realizzata un’interfaccia di tipo tabellare (vedi figura 6.8),
che permette di elencare i concetti che costituiscono l’ontologia, nonchè informazioni sulle relazioni di sussunzione e di specializzazione che tra tali
concetti intercorrono. Come ricordato in 5.3, in letteratura sono dati esempi
di presentazione della struttura di un’ontologia in forma grafica, basati sulla geometria iperbolica. Tuttavia, in questa sede non è sembrato opportuno
99
complicare l’aspetto realizzativo dell’interfaccia grafica, e si è pertanto deciso
di optare, piuttosto che per una presentazione grafica, per una presentazione
tabellare della struttura dell’ontologia.
In ogni caso, come già accennato, si è fatto in modo di lasciare un’ampia
possibilità di modifica dell’interfaccia proposta, realizzando un’architettura
modulare predisposta per la sostituzione di singole parti, ad esempio del
modulo che si occupa di rappresentare l’ontologia. Tale architettura sarà
illustrata nell’appendice D.
Figura 6.8: Navigazione dell’ontologia
Presentazione dei concetti Per descrivere completamente un concetto,
è necessario presentarne la struttura, ovvero l’insieme degli attributi. È questa la strada seguita da [18], come indicato in figura 5.3. Un’altra possibile
scelta è quella di [9], riportata in figura 5.4, che consiste nel dare indicazioni
sulla struttura di ogni concetto solo nel momento in cui è necessario utilizzare gli attributi del concetto in questione per comporre un’interrogazione.
Anche nel primo caso, tuttavia, la presentazione della struttura di un concetto era finalizzata all’introduzione di valori di confronto da richiedere in fase
d’interrogazione.
Nel nostro lavoro si è presa la decisione di rappresentare la struttura di
un concetto in modo autonomo rispetto alla composizione di interrogazioni,
basandosi sull’idea che un utente possa avere la necessità di farsi un’idea dei
concetti su cui può effettuare una query prima di essere in grado di formulare
la stessa. Si è pertanto deciso di scindere due aspetti logicamente distinti, che
nei casi presentati in 5.3 risultavano invece confusi. D’altra parte, come si
100
è ampiamente discusso a proposito delle modalità di utilizzo di un’ontologia
(vedi 3.2 e, in particolare, 3.2.2), non è detto che l’utilizzo di un’ontologia
sia volto esclusivamente alla ricerca di informazioni estensionali, ma può
darsi invece l’eventualità che l’utente ricerchi informazioni sulla struttura
dell’ontologia e dei concetti che la compongono. Anche in questo senso,
dunque, è sembrato opportuno proporre una descrizione di ogni concetto
evinta dal contesto di composizione di interrogazioni.
In particolare, come già nel caso della presentazione dell’ontologia, si è
optato per una rappresentazione tabellare (figura 6.9) degli attributi di un
concetto, arricchita rispetto a quelle di [9] e [18] dell’informazione relativa ai
tipi degli attributi. Tale informazione, oltretutto, arricchisce la descrizione
dei legami tra diversi concetti, dal momento che un concetto può essere il
tipo di un attributo di un altro concetto, e dunque essere collegato a tale
concetto.
La selezione del concetto di cui visualizzare la struttura avviene mediante
clic sulla riga del concetto d’interesse nella tabella dell’ontologia.
Figura 6.9: Struttura di un concetto
Composizione di interrogazioni Anche per quanto riguarda la composizione di interrogazioni, si è pensato di arricchire quanto già proposto nei
casi reali citati. In particolare, in [9] si proponeva un interfaccia nella quale
l’utente doveva scegliere un concetto ed associare a tale concetto un nome
di variabile, quindi sceglierne un attributo ed indicarne un valore, il quale
poteva essere una costante inserita dall’utente o una delle variabili istanziate.
101
Figura 6.10: Composizione di interrogazioni
102
Nel nostro lavoro, si è pensato di assegnare automaticamente alle variabili,
istanziate mediante la scelta di concetti, nomi univoci. Questa scelta da una
parte non costringe necessariamente l’utente a conoscere la distinzione tra
concetti e variabili; dall’altra, per come i nomi sono scelti, rende esplicito il
legame della variabile con il concetto istanziato, chiarendo cosı̀ all’utente il
significato della variabile senza costringerlo a ricordarlo.
Una panoramica d’insieme della sezione d’interfaccia che permette la composizione di interrogazioni è data in figura 6.10. Vediamo ora in dettaglio
come si articola tale sezione.
Figura 6.11: Tabella delle variabili
Scelta e rappresentazione delle variabili Mentre nei casi presenti
in letteratura la scelta della variabili era implicita [18] oppure legata all’indicazione del valore da assegnare ad attributi delle variabili [9], nella nostra
103
interfaccia abbiamo deciso di separare le due questioni, la scelta di una variabile associata ad un concetto e l’imposizione di condizioni sulle variabili o
sui loro attributi.
In particolare, si è destinata una parte dell’interfaccia all’elencazione, in
forma di tabella (vedi figura 6.11), delle variabili istanziate e dei rispettivi
concetti di riferimento. Tale tabella può essere arricchita di nuove variabili
scegliendo un concetto nella tabella che rappresenta l’ontologia. Tale scelta
può essere effettuata mediante doppio clic sul concetto d’interesse, o mediante
Drag and Drop dalla tabella dei concetti a quella delle variabili. Naturalmente, è possibile rimuovere una variabile dalla relativa tabella selezionandola ed
utilizzando quindi l’apposito bottone.
Figura 6.12: Rappresentazione della condizione della query
Scelta e rappresentazione della condizione della query Per coerenza con quanto fatto a proposito della rappresentazione dell’ontologia, della
struttura dei concetti e dell’elenco delle variabili, anche la condizione dell’interrogazione che si sta componendo viene rappresentata mediante una
tabella.
In particolare, una riga di tale tabella può essere
1. un confronto tra due operandi
2. un operatore booleano (AND, OR, NOT) applicato sotto-condizioni.
Tre menù a tendina danno la possibilità di scegliere operandi ed operatori per comporre le condizioni atomiche, mentre un insieme di bottoni permette di inserire gli operatori booleani o di inserire una condizione atomica
accettando le selezioni effettuate sui tre menu.
In particolare, si noti come una composizione di interrogazioni atomiche
di questo genere, che comprenda cioè la possibilità di scegliere l’operatore
104
mediante il quale confrontare i due operandi, costituisca una notevole estensione rispetto ai casi reali ricordati in precedenza, nei quali l’unico operatore
utilizzabile era quello di uguaglianza, sottinteso nella scelta di un valore da
imporre per un attributo.
L’insieme degli operatori proposto è fisso (vedi figura 6.13), ma nulla vieta
di pensare ad una modifica di tale insieme.
Figura 6.13: Menu di scelta dell’operatore
La scelta degli operandi, al contrario, è legata al contesto in cui si opera,
ed in particolare alle variabili istanziate disponibili nella tabella. In particolare, il primo operando può essere scelto in un elenco (vedi figura 6.14.(a))
che comprende tutte le variabili istanziate e tutti i loro attributi. Il secondo
operando, invece, può essere impostato dall’utente (valori costanti), oppure
scelto in un elenco ridotto rispetto al precedente, costituito da tutti gli elementi del precedente il cui tipo è compatibile 1 con quello del primo operando
scelto (figura 6.14.(b)).
Accanto a questo insieme base di funzionalità, che permette evidentemente di specificare condizioni costituite esclusivamente da condizioni atomiche
legate mediante AND, OR e NOT, senza la possibilità di comporre sottocondizioni di profondità qualunque, di è deciso di proporre un insieme di
funzionalità avanzate, attivabili mediante un bottone apposito. Queste ulteriori funzionalità hanno lo scopo di permettere all’utente di correggere la
condizione composta (bottoni di cancellazione di una riga e di reset dell’intera condizione), e soprattutto di costruire espressioni complesse senza che
1
Due tipi sono considerati compatibili se coincidono, oppure se uno dei due deriva
dall’altro. Ad esempio, se il primo operatore è di tipo Tipo, per la scelta del secondo
potrebbero essere disponibili elementi di tipo Tipo, o di tipo TipoParticolare: Tipo
o, ancora, di tipo SET < Tipo >
105
(a) Menù di scelta del primo operando
(b) Menù di scelta del secondo operando
Figura 6.14: Menu per la scelta degli operandi
siano posti limiti alla profondità delle sotto-espressioni. In questo senso, si
dispone di bottoni per l’inserimento e la rimozione di parentesi all’inizio ed
alla fine di ogni riga.
In figura 6.15 proponiamo un’immagine della barra dei bottoni standard,
mentre quella completa delle funzionalità avanzate è presentata in figura 6.16
(si noti in particolare il tasto “Avanzate”, che cambia aspetto a seconda della
modalità scelta e permette di passare dall’una all’altra).
Figura 6.15: Bottoni per modificare la condizione: versione base
I messaggi di errore Un discorso a parte merita il sistema di indicazioni e messaggi di errore messo a punto allo scopo di segnalare all’utente
il problema che si è presentato e dare indicazioni per evitarne il ripetersi.
Come già ricordato in precedenza, si è posta una particolare cura nella scelta
di messaggi il più possibile chiari, completi e costruttivi per l’utente, che non
si limitino dunque a segnalare la presenza di un problema, ma si curino anche
di dare un’indicazione su come risolverlo.
106
Figura 6.16: Bottoni per modificare la condizione: versione avanzata
Diamo di seguito un elenco dei messaggi di errore utilizzati nell’interfaccia
proposta, descrivendo la situazione nella quale vengono utilizzati.
1. Azione impossibile: tabella delle variabili vuota o non selezionata
Questo messaggio compare quando l’utente preme il bottone di eliminazione di una variabile dalla tabella delle variabili senza aver selezionato
alcuna riga di tale tabella, o in presenza di tabella vuota.
2. Errore: scegliere il primo operando prima di aggiungere una
condizione !
Questo messaggio compare quando l’utente preme il bottone per aggiungere una condizione atomica senza aver selezionato il primo operando di tale condizione
3. Errore: scegliere il secondo operando prima di aggiungere una
condizione !
Questo messaggio compare quando l’utente preme il bottone per aggiungere una condizione atomica senza aver selezionato il secondo operando di tale condizione
4. Errore: scegliere un operatore prima di aggiungere una condizione !
Questo messaggio compare quando l’utente preme il bottone per aggiungere una condizione atomica senza aver selezionato l’operatore di
tale condizione
5. Errore: selezionare una riga della tabella delle condizioni prima di compiere un’azione !
Questo messaggio compare quando l’utente preme uno dei bottoni che
modificano la condizione senza aver selezionato alcuna riga della tabella
della condizione
107
6. Azione impossibile: tabella della condizione vuota !
Questo messaggio compare quando l’utente tenta di resettare la tabella
della condizione e tale tabella è vuota
7. Errore di sintassi nella condizione della Query
Questo messaggio compare quando l’utente conclude la composizione dell’interrogazione dopo aver realizzato una query sintatticamente
scorretta
108
Capitolo 7
Esempi di interrogazione su
ontologie in ARTEMIS
Mostriamo ora qualche esempio del funzionamento del software prodotto, ed
in particolare del modulo che si occupa di tradurre l’interrogazione sull’ontologia in un insieme di interrogazioni sulle sorgenti locali integrate.
Per fare questo, presentiamo dapprima l’ontologia sulla quale verranno effettuate le interrogazioni, indicando le corrispondenze tra concetti dell’ontologia ed X-Class globali, e riportiamo quindi le regole di mapping tra schema
integrato e schemi locali.
Di seguito, proponiamo alcune interrogazioni sull’ontologia in questione,
mostrando le traduzioni per le diverse sorgenti.
7.1
L’ontologia di esempio
L’ontologia utilizzata per i nostri esempi è quella proposta in [3] come esempio
di funzionamento di un software che genera i concetti dell’ontologia a partire
dalle X-Class globali.
Allo scopo di fornire esempi relativi a tutti i possibili casi di traduzione
supportati dal nostro software, tuttavia, si è deciso di mantenere l’ontologia
presentata in [3], ma non l’origine di tale ontologia; a questo scopo, invece di
prendere in considerazione le sorgenti locali dalle quali il lavoro citato ricavava
l’ontologia, si fornisce una descrizione ODLI 3 del mapping tra schema integrato e schemi locali, in modo da arricchire la casistica delle corrispondenze
rispetto a quelle presenti in [3].
L’ontologia di cui faremo uso modella un dominio di carattere musicale, e prevede concetti che descrivono attività professionali legate al mondo
della musica (compositori, cantanti, . . . ), manifestazioni e gruppi musicali,
109
strumenti e “materiale musicale” (libri, spartiti, . . . ). In particolare, tale
ontologia si basa su cinque sorgenti locali di partenza, ognuna delle quali
si riferisce al dominio indicato. Schematizziamo per semplicità l’insieme di
corrispondenze tra i diversi passi d’integrazione nella figura 7.1, che istanzia
il modello generale proposto nella sezione 6.2.3 a proposito delle tipologie di
mapping.
interface artist
{
attribute string name;
attribute string artName ?;
(Concetti)
... ... ...
}
... ... ...
artist: artist
name: artist
...
(X-Class globali)
property {artName, string, (0,1)}
interface artist {
... ... ...
attribute string artName ? mapping rule
EMI.Artista.nomeDArte,
... ... ...
(VDP.Artista.soprannome union VDP.Artista.nomignolo
on rule1)
(Interfacce globali)
}
interface Artista {
attribute string nomeDArte;
...
}
interface Artista {
attribute string soprannome;
attribute string nomignolo;
... ... ...
}
(Sorgente
VDP)
... ... ...
(Sorgente
EMI)
(Sorgente
SONY)
(Sorgente
ISLAND)
(Interfacce locali)
(Sorgente
DG)
Figura 7.1: Esempio di mapping di un concetto sui diversi livelli dell’ontologia
La rappresentazione ODLI 3 completa dell’ontologia, generato dal modulo
software presentato in [3], viene riportato nell’appendice E. Di seguito mo-
110
striamo invece un estratto di tale rappresentazione, in modo da introdurre i
nostri esempi.
Descrizione del concetto Biography
interface Biography
{
attribute string author;
attribute date publishingDate;
attribute artist artist;
};
Descrizione del concetto artist
interface artist
{
attribute string name;
attribute string artName ?;
attribute date birthDate;
attribute set<AlbumType>Album;
};
Descrizione del concetto Composer, che estende il concetto artist
interface Composer:artist
{
attribute activity_Composer activity;
};
Descrizione del concetto Song
interface Song
{
attribute string title;
attribute decimal length;
attribute string kind ?;
attribute integer soldCopies ?;
attribute artist artist ?;
};
111
Lo schema integrato
Il codice ODLI 3 dello schema integrato descrive le corrispondenze tra gli
attributi delle interfacce globali (omonime, come detto in 6.2.3, alle X-Class
globali) e gli attributi delle interfacce locali. Tale corrispondenza è espressa mediante l’utilizzo delle regole di mapping, caratteristica introdotta in
ODLI 3 a questo preciso scopo.
Il codice ODLI 3 completo dello schema integrato utilizzato per gli esempi
è riportato nell’appendice E. Di seguito ne presentiamo un breve estratto,
per illustrare il meccanismo di definizione delle regole di mapping all’interno
della definizione delle classi globali. In particolare, mostriamo una parte
della definizione dell’interfaccia globale artist e delle corrispondenze dei suoi
attributi con quelli delle interfacce locali. Si noti ad esempio come l’attributo
globale name si mappi in certi casi su una concatenazione di attributi locali, e
come all’attributo globale artName corrisponda in un caso ad un’alternativa
tra attributi di una interfaccia locale.
interface artist
{
attribute string name
mapping rule
EMI.Artista.nome,
(SONY.Artist.firstname and SONY.Artist.middlename and
SONY.Artist.lastname),
ISLAND.Artist.name,
(DG.Kuenstler.Vorname and DG.Kuenstler.Familienname),
(VDP.Artista.nome and VDP.Artista.cognome);
attribute string artName ?
mapping rule
EMI.Artista.nomeDArte,
SONY.Artist.artName,
(VDP.Artista.soprannome union VDP.Artista.nomignolo
on rule1);
};
7.2
Alcune interrogazioni di esempio
Proponiamo, di seguito, alcune interrogazioni sull’ontologia, indicando poi
come il software le traduce, utilizzando le informazioni illustrate prima, in
interrogazioni per le sorgenti locali. In questa sede si è deciso di presentare
esclusivamente una parte della traduzione ottenuta, allo scopo di sottolineare
112
la particolarità che ciascun esempio mira a mettere in luce. Per l’output
completo del modulo di traduzione si rimanda all’appendice E.
L’interrogazione
select *
from Biography Biography_1,
artist artist_1,
Composer Composer_1,
Song Song_1,
Song Song_2
where
(Biography_1.author = ’Pietro martinelli’ and
Biography_1.artist = ’Ludwig van Beethoven’)
or
(artist_1.artName != ’Bono’ and
Composer_1.birthDate = artist_1.birthDate)
and
(Song_1.title != Song_2.title and
Song_1.length > Song_2.length and
Song_1.artist = Song_2.artist)
non genera per la sorgente ISLAND alcun risultato, mentre fornisce la
seguente traduzione per la sorgente VDP:
SELECT *
FROM Biografia Biography_1,
Artista artist_1,
Compositore Composer_1,
Brano Song_1,
Brano Song_2
WHERE ((((Biography_1.nomeAutore = ’Pietro Martinelli’)
AND
(Biography_1.artista = ’Ludwig van Beethoven’))
OR
((artist_1.soprannome != ’Bono’)
AND
(Composer_1.giornoNascita||Composer_1.meseNascita||
Composer_1.annoNascita = artist_1.giornoNascita||
artist_1.meseNascita||artist_1.annoNascita)))
AND
113
(((Song_1.titolo != Song_2.titolo)
AND
(Song_1.durata > Song_2.durata))
AND
(Song_1.autore = Song_2.autore)))
union
SELECT *
FROM Biografia Biography_1,
Artista artist_1,
Compositore Composer_1,
Brano Song_1,
Brano Song_2
WHERE ((((Biography_1.nomeAutore = ’Pietro Martinelli’)
AND
(Biography_1.artista = ’Ludwig van Beethoven’))
OR
((artist_1.nomignolo != ’Bono’)
AND
(Composer_1.giornoNascita||Composer_1.meseNascita||
Composer_1.annoNascita = artist_1.giornoNascita||
artist_1.meseNascita||artist_1.annoNascita)))
AND
(((Song_1.titolo != Song_2.titolo)
AND
(Song_1.durata > Song_2.durata))
AND
(Song_1.autore = Song_2.autore)))
Il primo fatto si spiega notando che la sorgente ISLAND (cosı̀ come la DG)
non prevede nelle sue interfacce locali alcun attributo corrispondente all’attributo artName del concetto artist (e dei concetti figli). In casi come questo,
si è deciso di non effettuare alcuna traduzione per la sorgente in questione. Altra scelta poteva essere quella di tradurre la condizione omettendo la
condizione sull’attributo intraducibile, tuttavia si è preferito garantire traduzioni che portino ad interrogazioni con risultati corretti piuttosto di lasciare
aperta la possibilità di ottenere risultati potenzialmente ma non necessariamente corretti. Per quanto riguarda invece la traduzione riportata sopra, è
interessante notare come essa sia costituita dall’unione (costrutto union di
OQL) di due sotto-interrogazioni. Questo è dovuto al fatto che l’attributo
artName del concetto artist non si mappa univocamente su un attributo di
un’interfaccia locale alla sorgente VDP, bensı̀ sull’alternativa tra due attributi
114
locali (soprannome e nomignolo) di una stessa interfaccia (Artista). Ricordiamo che questa doppia possibilità era esplicita nelle regole di mapping
espresse nello schema integrato.
Altrettanto interessante è l’esempio seguente: l’interrogazione
select *
from Biography Biography_1,
MusicalGoodsStore MusicalGoodsStore_1,
MusicalReview MusicalReview_1
where (Biography_1.author = ’Pietro Martinelli’ and
Biography_1.artist = ’Gioacchino Rossini’)
or (MusicalGoodsStore_1.IVA = ’1234567890’ and
not (MusicalGoodsStore_1.storeName = Biography_1.author))
and MusicalReview_1.location = ’via Branze n 38’
.Come accadeva per l’interrogazione precedente, coinvolge un attributo
(l’attributo IVA del concetto MusicalGoodsStore) che non si mappa su tutte
le sorgenti, bensı̀ solo su due di esse (EMI e VDP). Come prima, il processo di
traduzione non genera interrogazioni locali per le sorgenti per le quali non
esiste un mapping di tutti gli attributi coinvolti.
L’altro aspetto interessante di questa interrogazione consiste nel fatto
che uno stesso concetto, MusicalReview, si mappa su due diverse interfacce
locali alla stessa sorgente (SpettacoloMusicale e RassegnaMusicale per
la sorgente EMI, Spettacolo e Rassegna per la sorgente VDP). Anche in
questo caso, pertanto, il traduttore genera per la sorgente interessata una
interrogazione costituita dall’unione di due sotto-interrogazioni, ognuna delle
quali corrisponde ad una delle due possibilità di traduzione del concetto
MusicalReview. In particolare, la traduzione ottenuta per la sorgente EMI è
SELECT *
FROM Biografia Biography_1,
NegozioDiMusica MusicalGoodsStore_1,
SpettacoloMusicale MusicalReview_1
WHERE ((((Biography_1.autore = ’Pietro Martinelli’)
AND
(Biography_1.artista = ’Gioacchino Rossini’))
OR
((MusicalGoodsStore_1.pIva = ’1234567890’)
AND
NOT ((MusicalGoodsStore_1.nome = Biography_1.autore))))
AND
115
(MusicalReview_1.luogo = ’via Branze n 38’))
union
SELECT *
FROM Biografia Biography_1,
NegozioDiMusica MusicalGoodsStore_1,
RassegnaMusicale MusicalReview_1
WHERE ((((Biography_1.autore = ’Pietro Martinelli’)
AND
(Biography_1.artista = ’Gioacchino Rossini’))
OR
((MusicalGoodsStore_1.pIva = ’1234567890’)
AND
NOT ((MusicalGoodsStore_1.nome = Biography_1.autore))))
AND
(MusicalReview_1.luogo = ’via Branze n 38’))
Infine, presentiamo un caso di interrogazione che, per una data sorgente,
origina una traduzione composta dall’unione di quattro sotto-interrogazioni.
In pratica, quest’ultima interrogazione riunisce le casistiche discusse separatamente alle pagine 114 e 115: per quanto riguarda la sorgente VDP, infatti,
esistono due possibili mapping per il concetto MusicalReview, e due possibili
mapping per l’attributo artName del concetto artist. La traduzione ottenuta dunque coinvolge tante sotto-interrogazioni quante sono le combinazioni
possibili di tali scelte.
Presentiamo ora l’interrogazione
select *
from Biography Biography_1,
MusicalGoodsStore MusicalGoodsStore_1,
MusicalReview MusicalReview_1,
artist artist_1
where ((Biography_1.author = Biography_1.artist)
or not (MusicalGoodsStore_1.storeName = Biography_1.author))
and MusicalReview_1.location = ’via Branze n 38’
and (artist_1.birthDate = ’19/03/1978’ or
not artist_1.name = artist_1.artName)
e la traduzione per la sorgente VDP ottenuta applicando il nostro software
SELECT *
116
FROM Biografia Biography_1,
Negozio MusicalGoodsStore_1,
Spettacolo MusicalReview_1,
Artista artist_1
WHERE ((((Biography_1.nomeAutore = Biography_1.artista)
OR
NOT ((MusicalGoodsStore_1.nome = Biography_1.nomeAutore)))
AND
(MusicalReview_1.luogo = ’via Branze n 38’))
AND
((artist_1.giornoNascita||artist_1.meseNascita||
artist_1.annoNascita = ’19/03/1978’)
OR
NOT ((artist_1.nome||artist_1.cognome = artist_1.soprannome))))
union
SELECT *
FROM Biografia Biography_1,
Negozio MusicalGoodsStore_1,
Rassegna MusicalReview_1,
Artista artist_1
WHERE ((((Biography_1.nomeAutore = Biography_1.artista)
OR
NOT ((MusicalGoodsStore_1.nome = Biography_1.nomeAutore)))
AND
(MusicalReview_1.luogo = ’via Branze n 38’))
AND
((artist_1.giornoNascita||artist_1.meseNascita||
artist_1.annoNascita = ’19/03/1978’)
OR
NOT ((artist_1.nome||artist_1.cognome = artist_1.soprannome))))
union
SELECT *
FROM Biografia Biography_1,
Negozio MusicalGoodsStore_1,
Spettacolo MusicalReview_1,
Artista artist_1
WHERE ((((Biography_1.nomeAutore = Biography_1.artista)
OR
NOT ((MusicalGoodsStore_1.nome = Biography_1.nomeAutore)))
AND
(MusicalReview_1.luogo = ’via Branze n 38’))
117
AND
((artist_1.giornoNascita||artist_1.meseNascita||
artist_1.annoNascita = ’19/03/1978’)
OR
NOT ((artist_1.nome||artist_1.cognome = artist_1.nomignolo))))
union
SELECT *
FROM Biografia Biography_1,
Negozio MusicalGoodsStore_1,
Rassegna MusicalReview_1,
Artista artist_1
WHERE ((((Biography_1.nomeAutore = Biography_1.artista)
OR
NOT ((MusicalGoodsStore_1.nome = Biography_1.nomeAutore)))
AND
(MusicalReview_1.luogo = ’via Branze n 38’))
AND
((artist_1.giornoNascita||artist_1.meseNascita||
artist_1.annoNascita = ’19/03/1978’)
OR
NOT ((artist_1.nome||artist_1.cognome = artist_1.nomignolo))))
118
Capitolo 8
Conclusioni e sviluppi futuri
La presente tesi ha portato allo sviluppo di un modello di interrogazione di
ontologie, ed alla realizzazione di strumenti per la navigazione della struttura dei concetti e per la scrittura di query su modelli ontologici. In questo
lavoro ci si è inoltre occupati di risolvere il problema della riformulazione
di interrogazioni poste sull’ontologia in interrogazioni sulle sorgenti locali.
All’analisi dei linguaggi logici usati per descrivere il mapping tra i due diversi livelli, dunque, sono seguiti lo sviluppo di un formalismo concettuale per
la rappresentazione delle regole di mapping, il progetto di un algoritmo di
traduzione e l’implementazione di tale algoritmo in un modulo software per
l’interrogazione di ontologie nell’ambito dell’ambiente di strumenti Artemis.
In tal modo si fornisce ad un utente un’interfaccia grafica amichevole che
rende possibile osservare le caratteristiche intensionali di un dominio informativo, nonchè realizzare interrogazioni sull’ontologia allo scopo di ottenerne
informazioni estensionali, ottenendo come risultato un insieme di interrogazioni da sottomettere alle diverse sorgenti d’informazioni che l’ontologia integra. In particolare, si è visto che tale risultato viene raggiunto in due passi:
prima di tutto, il modulo grafico di interrogazione permette di comporre una
query sull’ontologia, imponendo condizioni su concetti ed attributi, senza che
l’utente debba necessariamente conoscere la sintassi di OQL. In un secondo
momento, il modulo di traduzione, basandosi sulle relazioni di mapping tra i
diversi livelli dell’ontologia, fa sı̀ che tale query sia riscritta mediante la terminologia delle diverse sorgenti, nascondendo all’utente la natura eterogenea
e distribuita di tali sorgenti e la complessità delle corrispondenze tra sorgenti
e modello integrato.
Un possibile sviluppo del presente lavoro consiste nella gestione dell’effettiva sottomissione delle query tradotte alle sorgenti locali, e soprattutto dei
risultati che ogni singola sorgente restituisce: si tratta dunque di utilizzare
le tabelle di traduzione rese disponibili dal nostro modulo, per ricondurre le
119
informazioni ottenute dalla terminologia delle sorgenti alla terminologia del
modello ontologico.
Un’altra questione da affrontare, in un lavoro successivo, può essere quella
dell’ottimizzazione del processo di traduzione delle interrogazioni; ad esempio
si potrebbe pensare di modificare l’algoritmo di traduzione allo scopo di
valutare se particolari sotto-condizioni della query, ad esempio quelle che
coinvolgono attributi che si mappano su costanti, possano essere a priori
scartate o, al contrario, vincolino in partenza il risultato dell’interrogazione
sulla relativa sorgente. D’altra parte, è possibile ipotizzare di modificare la
politica di gestione delle situazioni di mapping impossibile su una particolare
sorgente, o su una particolare interfaccia locale. Il nostro algoritmo, in casi
come questo, decide che la traduzione corrente è priva di senso, e la elimina; si
può tuttavia pensare ad una diversa politica di gestione di queste situazioni,
che ad esempio generi riscritture dell’interrogazione di partenza prive delle
condizioni sugli attributi intraducibili, e fornisca la possibilità di valutare
in un secondo momento, eventualmente in modo interattivo, la correttezza
di risultati ottenuti sottomettendo alle sorgenti d’informazioni una query
semplificata.
Infine, un altro possibile sviluppo futuro di questo lavoro può consistere
nella realizzazione di un’interfaccia di navigazione dell’ontologia diversa da
quella proposta da noi, e che ad esempio adotti, come suggerito in 5.3, un approccio basato sulla geometria iperbolica. Come dettagliatamente illustrato
nell’Appendice D, l’architettura che si è sviluppata per il modulo grafico è
rivolta a rendere fattibili modifiche di questo genere in modo il più possibile
indolore.
120
Appendice A
Sintassi completa di ODLI 3
OdlSpecification
::= Definition PUNTO
| Definition PUNTOEVIRGOLA
| Definition PUNTOEVIRGOLA OdlSpecification
Definition
::= TypeDcl
| ConstDcl
| ExceptDcl
| Interface
| RuleDcl
| ExtRuleDcl
| ThesaurusRelation
| Module
| error
TypeDcl
::= TYPEDEF TypeDeclarator
| ConstrTypeSpec
TypeDeclarator
::= TypeSpec Declarators
Declarators
::= Declarator
| Declarators VIRGOLA Declarator
121
Declarator
::= IDENTIFIER
| IDENTIFIER ArraySizeList
ArraySizeList
::= FixedArraySize
| ArraySizeList FixedArraySize
TypeSpec
::= SimpleTypeSpec
| ConstrTypeSpec
SimpleTypeSpec
::= BaseTypeSpec
| TemplateTypeSpec
| IDENTIFIER
BaseTypeSpec
::= FloatingPtType
| IntegerType
| CharType
| BooleanType
| OctetType
| RangeType
| AnyType
FloatingPtType
::= FLOAT
| DOUBLE
IntegerType
::= LongIntType
| SHORT
| UNSIGNED LONG
| UNSIGNED SHORT
LongIntType
::= INTEGER
| INT
| LONG
122
CharType
::= CHAR
BooleanType
::= BOOLEAN
OctetType
::= OCTET
RangeType
::= RANGE APERTAGRAFFA RangeSpecifier CHIUSAGRAFFA
RangeSpecifier
::= SignedIntegerLiteral VIRGOLA SignedIntegerLiteral
| SignedIntegerLiteral VIRGOLA PIU INFINITE
| MENO INFINITE VIRGOLA SignedIntegerLiteral
AnyType
::= ANY
TemplateTypeSpec
::= ArrayType
| StringType
| CollectionType
ArrayType
::= ARRAY ANGOLOSINISTRO SimpleTypeSpec VIRGOLA INTEGER_LITERAL
ANGOLODESTRO
| ARRAY ANGOLOSINISTRO SimpleTypeSpec ANGOLODESTRO SEQUENCE
ANGOLOSINISTRO SimpleTypeSpec VIRGOLA
INTEGER_LITERAL ANGOLODESTRO
StringType
::= STRING ANGOLOSINISTRO INTEGER_LITERAL ANGOLODESTRO
| STRING
CollectionType
::= AttrCollectionSpecifier ANGOLOSINISTRO SimpleTypeSpec
ANGOLODESTRO
AttrCollectionSpecifier
123
::= SET
| LIST
| BAG
ConstrTypeSpec
::= StructType
| UnionType
| EnumType
StructType
::= STRUCT IDENTIFIER APERTAGRAFFA MemberList CHIUSAGRAFFA
MemberList
::= Member
| MemberList Member
Member
::= TypeSpec Declarators PUNTOEVIRGOLA
UnionType
::= UNION IDENTIFIER SWITCH APERTATONDA SwitchTypeSpec CHIUSATONDA
APERTAGRAFFA SwitchBody CHIUSAGRAFFA
SwitchTypeSpec
::= IntegerType
| CharType
| BooleanType
| EnumType
| ScopedName
| RangeType
SwitchBody
::= Case
| Case SwitchBody
Case
::= CaseLabelList ElementSpec PUNTOEVIRGOLA
CaseLabelList
::= CaseLabel
| CaseLabel CaseLabelList
124
CaseLabel
::= CASE ConstExp DUEPUNTI
| DEFAULT DUEPUNTI
ElementSpec
::= TypeSpec Declarator
EnumType
::= ENUM IDENTIFIER APERTAGRAFFA EnumeratorList CHIUSAGRAFFA
EnumeratorList
::= Enumerator
| EnumeratorList VIRGOLA Enumerator
Enumerator
::= IDENTIFIER
ConstExp
::= OrExpr
OrExpr
::= XOrExpr
| OrExpr OR XOrExpr
XOrExpr
::= AndExpr
| XOrExpr PAGODA AndExpr
AndExpr
::= ShiftExpr
| AndExpr ECOMMERCIALE ShiftExpr
ShiftExpr
::= AddExpr
| ShiftExpr MAGGIOREMAGGIORE AddExpr
| ShiftExpr MINOREMINORE AddExpr
AddExpr
::= MultExpr
| AddExpr PIU MultExpr
125
| AddExpr MENO MultExpr
MultExpr
::= UnaryExpr
| MultExpr PER UnaryExpr
| MultExpr SLASH UnaryExpr
| MultExpr BACKSLASH PERCENTUALE UnaryExpr
UnaryExpr
::= Signes PrimaryExpr
| PrimaryExpr
PrimaryExpr
::= IDENTIFIER
| INTEGER_LITERAL
| FLOATING_PT_LITERAL
| APERTATONDA OrExpr CHIUSATONDA
| APERTATONDA error CHIUSATONDA
ConstDcl
::= CONST StringType IDENTIFIER UGUALE STRING_LITERAL
| CONST CharType IDENTIFIER UGUALE CHARACTER_LITERAL
| CONST IntegerType IDENTIFIER UGUALE ConstExp
| CONST FloatingPtType IDENTIFIER UGUALE ConstExp
SignedIntegerLiteral
::= INTEGER_LITERAL
| Signes INTEGER_LITERAL
SignedFloatingPtLiteral
::= Signes FLOATING_PT_LITERAL
| FLOATING_PT_LITERAL
Signes
::= MENO
| PIU
ExceptDcl
::= EXCEPTION IDENTIFIER APERTAGRAFFA OptMemberList CHIUSAGRAFFA
OptMemberList
126
::=
| MemberList
ScopedName
::= IDENTIFIER
| DUEPUNTI DUEPUNTI IDENTIFIER
| ScopedName DUEPUNTI DUEPUNTI IDENTIFIER
Interface
::= InterfaceDcl
IntView
::= INTERFACE
| VIEW
InterfaceDcl
::= IntView IDENTIFIER DUEPUNTI InheritanceSpec
OptTypePropertyList OptPersistenceDcl SingleInterfaceBody
| IntView IDENTIFIER DUEPUNTI InheritanceSpec OptTypePropertyList
OptPersistenceDcl
SingleInterfaceBody InterfaceBodyUnionList
| IntView IDENTIFIER OptTypePropertyList OptPersistenceDcl
SingleInterfaceBody
| IntView IDENTIFIER OptTypePropertyList OptPersistenceDcl
SingleInterfaceBody InterfaceBodyUnionList
InheritanceSpec
::= IDENTIFIER
| InheritanceSpec VIRGOLA IDENTIFIER
OptTypePropertyList
::=
| APERTATONDA OptSourceSpec OptExtentSpec OptKeySpec OptCandKeySpec
OptForKeySpec CHIUSATONDA
OptSourceSpec
::=
| SOURCE SourceType IDENTIFIER
SourceType
::= RELATIONAL
127
|
|
|
|
NFRELATIONAL
OBJECT
FILE
SEMISTRUCTURED
OptExtentSpec
::=
| EXTENT ListExtent
ListExtent
::= IDENTIFIER
| ListExtent VIRGOLA IDENTIFIER
OptKeySpec
::=
| KEY Key
OptCandKeySpec
::=
| CandKeySpecList
CandKeySpecList
::= CandKeySpec
| CandKeySpecList CandKeySpec
CandKeySpec
::= CANDIDATE_KEY IDENTIFIER Key
OptForKeySpec
::=
| ForKeySpecList
ForKeySpecList
::= ForKeySpec
| ForKeySpecList ForKeySpec
ForKeySpec
::= FOREIGN_KEY APERTATONDA ForeignKeyList CHIUSATONDA
REFERENCES IDENTIFIER OptRefKeyList
OptRefKeyList
128
::=
| APERTATONDA ForeignKeyList CHIUSATONDA
ForeignKeyList
::= IDENTIFIER
| ForeignKeyList VIRGOLA IDENTIFIER
Key
::= APERTATONDA PropertyList CHIUSATONDA
PropertyList
::= PropertyName
| PropertyList VIRGOLA PropertyName
PropertyName
::= IDENTIFIER
OptPersistenceDcl
::=
| PERSISTENT
| TRANSIENT
InterfaceBodyUnionList
::= InterfaceBodyUnion
| InterfaceBodyUnionList InterfaceBodyUnion
InterfaceBodyUnion
::= UNION IDENTIFIER SingleInterfaceBody
SingleInterfaceBody
::= APERTAGRAFFA InterfaceBody CHIUSAGRAFFA
InterfaceBody
::= Export PUNTOEVIRGOLA
| Export PUNTOEVIRGOLA InterfaceBody
Export
::= TypeDcl
| ConstDcl
| ExceptDcl
| AttrDcl
129
| RelDcl
| OpDcl
AttrDcl
::= OptReadonly ATTRIBUTE DomainType AttributeName
OptFixedArraySize OptMappingRuleDcl
OptReadonly
::=
| READONLY
AttributeName
::= IDENTIFIER
| IDENTIFIER PUNTODIDOMANDA
DomainType
::= EnumType
| StructType
| SimpleTypeSpec
OptFixedArraySize
::=
| FixedArraySize
FixedArraySize
::= APERTAQUADRA INTEGER_LITERAL CHIUSAQUADRA
OptMappingRuleDcl
::=
| MappingRuleDcl
MappingRuleDcl
::= MAPPING RULE MapRuleList
MapRuleList
::= MapRule
| MapRuleList VIRGOLA MapRule
MapRule
::= LocalAttributeName
| DefaultValue
130
| MapAndExpression
| MapUnionExpression
LocalAttributeName
::= IDENTIFIER PUNTO IDENTIFIER PUNTO IDENTIFIER
LocalClassName
::= IDENTIFIER VIRGOLA IDENTIFIER
DefaultValue
::= IDENTIFIER PUNTO IDENTIFIER UGUALE STRING_LITERAL
MapAndExpression
::= APERTATONDA MapAndList AND LocalAttributeName CHIUSATONDA
MapAndList
::= LocalAttributeName
| MapAndList AND LocalAttributeName
MapUnionExpression
::= APERTATONDA MapUnionList UNION LocalAttributeName
ON IDENTIFIER CHIUSATONDA
MapUnionList
::= LocalAttributeName
| MapUnionList UNION LocalAttributeName
RelDcl
::= RELATIONSHIP TargetOfPath IDENTIFIER INVERSE
InverseTraversalPath OptOrderBy
TargetOfPath
::= IDENTIFIER
| RelCollectionType MINOREMINORE IDENTIFIER MAGGIOREMAGGIORE
RelCollectionType
::= SET
| LIST
InverseTraversalPath
::= IDENTIFIER DUEPUNTI DUEPUNTI IDENTIFIER
131
OptOrderBy
::=
| APERTAGRAFFA ORDER_BY ScopedNameList CHIUSAGRAFFA
ScopedNameList
::= ScopedName
| ScopedNameList VIRGOLA ScopedName
OpDcl
::= OptOneway OperTypeSpec IDENTIFIER ParameterDcls
OptRaisesExpr OptContextExpr
OptOneway
::=
| ONEWAY
OperTypeSpec
::= SimpleTypeSpec
| VOID
ParameterDcls
::= APERTATONDA ParamDclList CHIUSATONDA
| APERTATONDA CHIUSATONDA
ParamDclList
::= ParamDcl
| ParamDclList VIRGOLA ParamDcl
ParamDcl
::= ParamAttribute SimpleTypeSpec Declarator
ParamAttribute
::=
| IN
| OUT
| INOUT
OptRaisesExpr
::=
| RAISES APERTATONDA ScopedNameList CHIUSATONDA
132
OptContextExpr
::=
| CONTEXT APERTATONDA StringLiteralList CHIUSATONDA
StringLiteralList
::= STRING_LITERAL
| StringLiteralList VIRGOLA STRING_LITERAL
ExtRuleDcl
::= EXTRULE IDENTIFIER ExtRuleSpec
ExtRuleSpec
::= ForAll IDENTIFIER IN ExtRuleType
ExtRuleType
::= ExtRuleIsa
| ExtRuleBottom
ExtRuleBottom
::= APERTATONDA LocalClassName AND LocalClassName
CHIUSATONDA THEN IDENTIFIER IN BOTTOM
ExtRuleIsa
::= LocalClassName THEN IDENTIFIER IN LocalClassName
RuleDcl
::= RULE IDENTIFIER RuleSpec
RuleSpec
::= ForAll IDENTIFIER IN IDENTIFIER DUEPUNTI
RuleBodyList THEN RuleBodyList
| APERTAGRAFFA CASE OF IDENTIFIER DUEPUNTI CaseList
CHIUSAGRAFFA
ForAll
::= FOR ALL
| FORALL
RuleBodyList
::= APERTATONDA RuleBodyList CHIUSATONDA
133
| RuleBody
| RuleBodyList AND RuleBody
RuleBody
::= DottedName RuleConstOp OptRuleCast LiteralValue DottedName
RuleConstOp OptRuleCast DottedName
| DottedName IN DottedName
| ForAll IDENTIFIER IN DottedName DUEPUNTI RuleBodyList
| EXISTS IDENTIFIER IN DottedName DUEPUNTI RuleBodyList
| DottedName UGUALE SimpleTypeSpec IDENTIFIER APERTATONDA
DottedLiteralList CHIUSATONDA
DottedLiteralList
::= DottedLiteral
| DottedLiteralList VIRGOLA DottedLiteral
DottedLiteral
::= OptSimpleTypeSpec DottedName
| OptSimpleTypeSpec LiteralValue
OptSimpleTypeSpec
::=
| SimpleTypeSpec
RuleConstOp
::= UGUALE
| MAGGIORE UGUALE
| MINORE UGUALE
| MINORE
| MAGGIORE
LiteralValue
::= SignedFloatingPtLiteral
| SignedIntegerLiteral
| CHARACTER_LITERAL
| STRING_LITERAL
DottedName
::= IDENTIFIER
| DottedName PUNTO IDENTIFIER
134
OptRuleCast
::=
| APERTAGRAFFA SimpleTypeSpec CHIUSAGRAFFA
CaseList
::= CaseSpec
| CaseList CaseSpec
CaseSpec
::= LiteralValue DUEPUNTI DottedName
ThesaurusRelation
::= LocalAttributeName ThesRelType LocalAttributeName
| LocalClassName ThesRelType LocalClassName
| LocalClassName ThesRelType LocalAttributeName
| LocalAttributeName ThesRelType LocalClassName
ThesRelType
::= SYN
| BT
| NT
| RT
Module
::= MODULE IDENTIFIER APERTAGRAFFA OdlSpecification CHIUSAGRAFFA
135
Appendice B
Sintassi completa di OQL Object Query Language
query_program ::= {define_query;} query
define_query ::= define identifier as query
query
query
query
query
query
query
query
query
query
query
query
query
::=
::=
::=
::=
::=
::=
::=
::=
::=
::=
::=
::=
nil
true
false
integer_literal
float_literal
character_literal
string_literal
entry_name
query_name
bind_argument
from_variable_name
(query)
query
query
query
query
query
query
query
query
::=
::=
::=
::=
::=
::=
::=
::=
query + query
query - query
query * query
query / query
- query
query mod query
abs (query)
query verb+||+ query
query ::= query comparison_operator query
136
query ::= query like string_literal
comparison_operator ::= =
comparison_operator ::= !=
comparison_operator ::= >
comparison_operator ::= <
comparison_operator ::= >=
comparison_operator ::= <=
query ::= not query
query ::= query and query
query ::= query or query
query
query
query
query
query
query
query
query
query
::=
::=
::=
::=
::=
::=
::=
::=
::=
query ::=
query ::=
query ::=
query ::=
dot ::= .
query ::=
query ::=
query ::=
query ::=
query ::=
query ::=
type_name ( [query ] )
type_name (identifier:query {, identifier: query})
struct (identifier: query {, identifier: query})
set ( [query {, query} ])
bag ( [query {,query} ])
list ( [query {,query} ])
(query, query {, query})
[ list ](query .. query)
array ( [query {,query} ])
query dot attribute_name
query dot relationship_name
query dot operation_name
query dot operation_name( query {,query} )
| ->
* query
query [query]
query [query:query]
first (query)
last (query)
function_name( [ query {,query} ] )
query ::= for all identifier in query: query
query ::= exists identifier in query: query
query ::= exists(query)
query ::= unique(query)
query ::= query in query
query ::= query comparison_operator quantifier query
quantifier ::= some
137
quantifier ::= any
quantifier ::= all
query ::= count (query)
query ::= count (*)
query ::= sum (query)
query ::= min (query)
query ::= max (query)
query ::= avg (query)
query ::= select [ distinct ] projection_attributes
from variable_declaration {, variable_declaration}
[where query ]
[group by partition_attributes ]
[having query ]
[order by sort_criterion {, sort_criterion} ]
projection_attributes ::= projection {, projection}
projection_attributes ::= *
projection ::= query
projection ::= identifier: query
projection ::= query as identifier
variable_declaration ::= query [ [ as ] identifier ]
partition_attributes ::= projection {, projection}
sort_criterion ::= query [ordering ]
ordering ::= asc
ordering ::= desc
query ::= query intersect query
query ::= query union query
query ::= query except query
query
query
query
query
query
::=
::=
::=
::=
::=
listtoset (query)
element (query)
distinct(e)
flatten (query)
(class_name) query
138
Appendice C
La tecnologia CORBA
CORBA è l’acronimo di Common Object request Broker Architecture. Esso rappresenta un insieme di specifiche e di regole di comportamento
un’architettura appunto, messo a punto dall’OMG [2] allo scopo di rendere
possibile lo sviluppo di sistemi in ambiente eterogeneo e distribuito.
In particolare, CORBA descrive e rende possibile la comunicazione tra
oggetti distribuiti su piattaforme distanti e in generale diverse, indipendentemente dai linguaggi di programmazione utilizzati per realizzare i singoli
oggetti. Ad esempio, un’architettura di questo genere permette a programmi
scritti in Java di comunicare con programmi scritti in linguaggi come Fortran, Cobol o C++, permettendo il riutilizzo di software scritto in linguaggi
di programmazione ora poco utilizzati.
La figura C.1 rappresenta uno schema generale dell’architettura CORBA.
L’elemento centrale di tale architettura è l’ORB (Object Request Broker),
servizio che svolge il ruolo di mediatore tra i diversi oggetti remoti. Esso è
dunque l’entità logica che realizza la comunicazione remota, nascondendone i dettagli implementativi, con il risultato di rendere tale comunicazione
analoga a chiamate locali. In particolare, in presenza di una richiesta di comunicazione da parte di un oggetto chiamante verso un altro oggetto, l’ORB
svolge i seguenti compiti:
1. Trovare, in rete, l’oggetto chiamato
2. Inviargli la richiesta dell’oggetto chiamante
3. Attendere il risultato della chiamata e farlo pervenire all’oggetto chiamante
Come abbiamo detto, CORBA è un’architettura, e non un sistema. Pertanto, ORB è un elemento logico, che può essere definito mediante un linguaggio di programmazione qualunque. Per questo motivo, l’OMG definisce
139
Figura C.1: CORBA e l’ORB
l’ORB mediante un’interfaccia astratta (ORB interface) senza addentrarsi
nei dettagli implementativi.
L’ORB, abbiamo visto, si occupa dell’individuazione dell’oggetto remoto
chiamato in rete, e della comunicazione tra chiamante e chiamato, senza che
di questo si debba preoccupare l’oggetto cliente (chiamante).
Questa separazione di ruoli è possibile grazie al fatto che le interfacce di
tutti gli oggetti che comunicano tramite l’ORB sono descritte per mezzo di
un formalismo comune, detto IDL (Interface Definition Language). In
particolare, il compilatore IDL per un dato linguaggio di programmazione si
preoccupa di tradurre una descrizione IDL dell’interfaccia di un certo oggetto
CORBA in una definizione di tale interfaccia nel linguaggio di programmazione per il quale il compilatore è stato costruito, che naturalmente corrisponde
a quello in cui l’oggetto CORBA verrà effettivamente implementato. La filosofia di fondo dell’architettura CORBA consiste nella netta separazione tra
interfaccia di un oggetto CORBA ed effettiva implementazione sottostante: la definizione IDL dell’interfaccia di un oggetto permette pertanto di
specificare esclusivamente gli aspetti relativi all’interfaccia dell’oggetto, vale
a dire segnature dei metodi ed eventuali eccezioni rilanciate, collocazione in
package, costanti e strutture dati utilizzate dai metodi.
Descriviamo ora come avviene, in pratica, l’invocazione dei servivi CORBA.
Nella figura C.3, il servant rappresenta l’implementazione dell’oggetto
remoto, ovvero la specifica mediante un linguaggio di programmazione dei
metodi definiti dall’interfaccia ODL dell’oggetto remoto. Il client, invece,
140
Figura C.2: CORBA: comunicazione tra client e server
Figura C.3: CORBA: invocazione remota di metodi
141
rappresenta l’oggetto che invoca i metodi del servant, senza doversi preoccupare dei dettagli della comunicazione con l’oggetto remoto. Sottolineiamo
come esista una differenza (C.3) tra servant e Server: il primo rappresenta
un’istanza di un oggetto CORBA, mentre il secondo è il processo che istanzia
il servant e lo mette a disposizione del client.
Con riferimento all’immagine C.2, vediamo ora di chiarire come avviene
la comunicazione tra client e servant, ed in particolare come vengono
risolti i problemi relativi al passaggio di parametri dal primo al secondo, e
dei risultati in senso inverso.
Ogni oggetto client deve essere dotato di uno stub, ed ogni oggetto
server di uno skeleton. Stub e skeleton fungono da intermediari, rispettivamente, tra client ed ORB e tra server ed ORB. Di fatto, il client invia
la richiesta di comunicazione al proprio stub, che effettua la traduzione dal
linguaggio di programmazione client-side ad un generico formato CORBA,
ed effettua quindi la richiesta remota. Sul lato server, invece, avvengono
le operazioni inverse, ovvero lo skeleton riceve la richiesta remota, effettua
la traduzione da formato generico CORBA al linguaggio di programmazione
server-side.
Il client richiama i metodi di un oggetto remoto servant mediante
un object reference fornito dal server. Lo stub identifica tramite l’ORB
la macchina remota sulla quale è presente il server che gestisce l’oggetto
remoto di cui si desiderano invocare i metodi. Si stabilisce la connessione
con tale macchina e si spedisce la richiesta completa di eventuali parametri
per la chiamata del metodo remoto. Lo skeleton invoca il metodo sul servant
e restituisce, sempre tramite l’ORB, i risultati al client.
Il procedimento di “impacchettamento” dei dati da trasmettere in un
formato CORBA generico, che astrae dai formati specifici dei linguaggi di
programmazione mediante i quali sono implementati gli oggetti CORBA,
prende il nome di marshaling, mentre il recupero di tali dati prende il nome
di unmarshaling.
Per completare la panoramica sull’architettura mostrata in figura C.1,
la Dynamic Invocation Interface (DII) è un’interfaccia che permette al
client di inviare dinamicamente una richiesta alloggetto remoto senza conoscerne linterfaccia e senza avere un legame con lo stub; la Dynamic Skeleton Interface (DSI) è l’analogo dal lato server; infine, l’Object Adapter assiste l’ORB nel far pervenire la richiesta in un formato valido e nelle
operazioni di attivazione/disattivazione degli oggetti.
142
Appendice D
Architettura dell’interfaccia
grafica
Questa appendice non intende descrivere in maniera dettagliata i dettagli
implementativi del modulo che realizza l’interfaccia grafica di navigazione
dell’ontologia e di composizione di interrogazioni, bensı̀ illustrare le scelte
architetturali adottate allo scopo di rendere possibile modificare parti di tale
interfaccia in modo semplice e modulare.
Concettualmente, l’interfaccia grafica di nostro interesse è costituita da
tre parti diverse:
• un modulo che permette di visualizzare l’ontologia (vale a dire l’insieme
dei concetti dell’ontologia e le relazioni che intercorrono tra di essi)
• un modulo che permette di visualizzare la struttura di un concetto, vale
a dire l’insieme dei suoi attributi e dei loro tipi
• un modulo che permette di comporre un’interrogazione sui concetti
dell’ontologia
Allo scopo di organizzare e coordinare i tre moduli individuati, si è deciso
di pensare ad un’architettura che permetta di modificare una delle tre parti
indipendentemente dalle altre, allo scopo di scegliere separatamente il tipo
di implementazione da realizzare per ciascun modulo, senza che questa scelta
vincoli in qualche modo le scelte realizzative degli altri moduli.
143
FrameInterrogazione
-ontologyManager: OntologyLayoutManager
-conceptManager: ConceptLayoutManager
-queryManager: QueryCompositionManager
+FrameInterrogazione(queryManager: QueryCompositionManager, conceptManager: ConceptLayoutManager, ontologyManager: OntologyLayoutManager): void
OntologyLayoutManager
QueryCompositionManager
-observerList: Vector
-observerList: Vector
+addObserver(observer: OntologyLayoutManagerObserver): void
+notifyAllObserver(mode: int): void
+addObserver(observer: QueryCompositionManagerObserver): void
+getSelectedConcept(): Concept
+notifyAllObserver(): void
+setOntology(onto: Ontology): void
+getComposedQuery(): String
144
ConceptLayoutManager
-observerList: Vector
1..*
+addObserver(observer: ConceptLayoutManagerObserver): void
+notifyAllObserver(): void
<<Interface>>
+getSelectedAttribute(): Attribute
QueryCompositionManagerObserver
1..*
1..*
<<Interface>>
OntologyLayoutManagerObserver
+newSelectedConcept(source: OntologyLayoutManager, mode: int): void
<<Interface>>
ConceptLayoutManagerObserver
+newSelectedAttribute(source: ConceptLayoutManager): void
Figura D.1: Architettura dell’interfaccia grafica - Diagramma delle classi
Cosı̀ l’interfaccia nel suo complesso è implementata in una classe contenitore, denominata FrameInterrogazione, costruita sulla base dei tre moduli
necessari allo svolgimento delle tre diverse funzioni. In particolare, tali moduli vengono rappresentati da tre classi astratte, denominate OntologyLayoutManager, ConceptLayoutManager e QueryCompositionManager. Le effettive
implementazioni dei tre moduli, come quelle proposte nell’interfaccia realizzata, sono pertanto ottenute estendendo le tre classi astratte citate, mentre
la classe contenitore FrameInterrogazione può risultare indipendente dall’effettiva scelta effettuata in fase di realizzazione dei singoli moduli. Si tenga
presente, per inciso, che il gestore della presentazione di ontologie e concetti
è pensato per essere un pannello con contenuto scrollabile, mentre il gestore
della composizione di interrogazioni è semplicemente un pannello.
Volendo garantire la massima intercambiabilità tra i moduli che realizzano
l’interfaccia si è dovuto affrontare il problema di fornire un meccanismo di comunicazione tra tali moduli, dal momento che la presentazione degli attributi
di un concetto varia a seconda del concetto selezionato sulla rappresentazione dell’ontologia, e che la composizione dell’interrogazione (ed in particolare
la scelta delle variabili della query) non può in generale prescindere dalle
selezioni effettuate sui due moduli di rappresentazione.
Seguendo il design pattern noto come Observer, si è pertanto realizzato un
meccanismo di notifica degli eventi di selezione su OntologyLayoutManager
e ConceptLayoutManager ad osservatori registrati per tali Manager. Per
completezza, e per supportare anche eventuali necessità di reazione alle operazioni effettuate dall’utente sulla sezione di composizione di interrogazioni, si è esteso tale meccanismo di registrazione e notifica anche al caso del
QueryCompositionManager.
Allo scopo di realizzare tale architettura di comunicazione tra moduli, si
sono realizzate tre interfacce, indicate come OntologyLayoutManagerObserver,
ConceptLayoutManagerObserver e QueryCompositionManagerObserver. In
particolare, ogni ConceptLayoutManager deve implementare l’interfaccia OntologyLayoutManagerObserver, mentre ogni QueryCompositionManager deve implementare le interfacce OntologyLayoutManagerObserver e ConceptLayoutManagerObserver. Tali dettagli sono chiariti dalla figura D.1.
Per maggiore chiarezza, vediamo nel dettaglio il funzionamento di tale
meccanismo su un semplice esempio.
Il Design pattern Observer
Classe di cui osservare il comportamento: supporta un meccanismo di
registrazione degli osservatori.
class ToObserve
145
{
private Vector observerList;
/*
...
*/
/**
Metodo di registrazione degli osservatori
*/
public addObserver(Observer observer)
{
observerList.addElement(observer);
}
/**
Metodo di notifica agli osservatori degli eventi
dell’oggetto osservato
Tale metodo viene invocato, ad esempi, dal codice
che rileva e gestisce gli eventi del mouse o della
tastiera sull’oggetto osservato
*/
public notifyAll()
{
for all observer in observerList
observer.changeDetected(this);
}
/**
Metodo mediante il quale gli osservatori possono
accedere allo stato dell’oggetto osservato
*/
public getState()
{
/*
...
*/
}
}
146
Classe Observer: riceve la notifica dei cambiamenti di stato dell’oggetto
osservato, accede al nuovo stato di tale oggetto e lo elabora
class Observer
{
/**
Metodo invocato dall’oggetto osservato per notificare il
cambiamento di stato
*/
public changeDetected(ToObserve source)
{
/*
Accede al nuovo stato della sorgente della notifica
*/
newState = source.getState();
/*
Fa qualcosa con il nuovo stato
*/
startElaborationOf(newState);
}
}
147
Appendice E
Codice completo degli esempi
E.1
Codice completo dell’ontologia utilizzata
negli esempi
// Ontologia in ODLI3
interface Biography
{
attribute string author;
attribute date publishingDate;
attribute artist artist;
};
interface artist
{
attribute string name;
attribute string artName*;
attribute date birthDate;
attribute set<AlbumType>Album;
};
interface Singer:SongSingerWriter
{
attribute activity_Singer activity;
};
interface Composer:SongSingerWriter
148
{
attribute activity_Composer activity;
};
interface SongSingerWriter:artist
{
attribute activity_SongSingerWriter activity;
};
interface AlbumType
{
attribute string title;
attribute integer year;
attribute string kind;
attribute integer soldCopies;
attribute set<Song> Song;
attribute artist artist*;
};
interface Song
{
attribute string title;
attribute decimal length;
attribute string kind*;
attribute integer soldCopies*;
attribute artist artist*;
};
interface MusicalClassification
{
attribute string week;
attribute set<string> sponsor;
attribute set<AlbumType>Album;
attribute set<Song> Song;
};
interface TopTenAlbum:AlbumType
{
attribute position_TopTenAlbum position;
attribute integer lastPosition*;
attribute artist artist;
149
};
interface TopTenSong:Song
{
attribute string kind;
attribute integer soldCopies;
attribute position_TopTenSong position;
attribute integer lastPosition*;
attribute artist artist;
};
interface MusicalReview
{
attribute date day;
attribute string location;
attribute MusicalGroup MusicalGroup;
};
interface MusicalGroup
{
attribute string name;
attribute string director;
attribute set<string> components;
attribute set<Song> Song;
};
interface Band:MusicalGroup
{
attribute groupType_Band groupType;
};
interface Chorus:MusicalGroup
{
attribute groupType_Chorus groupType;
};
interface Orchestra:MusicalGroup
{
attribute groupType_Orchestra groupType;
};
150
interface MusicalInstrumentCatalog
{
attribute date publishingDate;
attribute string shopName;
attribute set<InstrumentCategory> InstrumentCategory*;
attribute set<MusicalInstrument> MusicalInstrument*;
};
interface InstrumentCategory
{
attribute CategoryType_InstrumentCategory CategoryType;
attribute set<MusicalInstrument> MusicalInstrument;
};
interface MusicalInstrument
{
attribute integer catalogCode*;
attribute string instrumentType;
attribute decimal price;
attribute string seller;
attribute string payment;
};
interface WindInstrument:MusicalInstrument
{
attribute integer catalogCode;
attribute instrumentType_WindInstrument instrumentType;
};
interface PercussionInstrument:MusicalInstrument
{
attribute integer catalogCode;
attribute instrumentType_PercussionInstrument instrumentType;
};
interface StringedInstrument:MusicalInstrument
{
attribute integer catalogCode;
attribute instrumentType_StringedInstrument instrumentType;
};
151
interface MusicalGoodsStore
{
attribute string storeName;
attribute string IVA;
attribute InstrumentCatalog InstrumentCatalog;
attribute SheetCatalog SheetCatalog;
attribute BookCatalog BookCatalog;
};
interface SheetCatalog
{
attribute date publishingDate;
attribute set<MusicalSheet> MusicalSheet;
};
interface BookCatalog
{
attribute date publishingDate;
attribute set<MusicalBook> MusicalBook;
};
interface MusicalSheet
{
attribute decimal price;
attribute string payment;
attribute string seller;
attribute string metrics;
attribute artist artist;
};
interface MusicalBook
{
attribute decimal price;
attribute string payment;
attribute string seller;
attribute string title;
attribute set<string> author;
attribute date publishingDate;
};
typedef enum{sings_song} activity_Singer;
152
typedef enum{writes_song} activity_Composer;
typedef enum{sings_song,writes_song} activity_SongSingerWriter;
typedef range{1,10} position_TopTenAlbum;
typedef range{1,10} position_TopTenSong;
typedef enum{instrumental} groupType_Band;
typedef enum{choral} groupType_Chorus;
typedef enum{mixed} groupType_Orchestra;
typedef enum{wind,percussion,stringed}
CategoryType_InstrumentCategory;
typedef enum{strumpet,saxophone,horn,clarinet,flute,organ,oboe}
instrumentType_WindInstrument;
typedef enum{piano,xylophone,drum,cymbals}
instrumentType_PercussionInstrument;
typedef enum{guitar,violin,viola,violoncello,harp,lyre,mandolin}
instrumentType_StringedInstrument;
// Regole di sussunzione per i tipi
// R_ISA_1
for all X in
// R_ISA_2
for all X in
// R_ISA_3
for all X in
// R_ISA_4
for all X in
// R_ISA_5
for all X in
// R_ISA_6
activity_Singer then X in activity_SongSingerWriter
activity_Singer then X in string
activity_Composer then X in activity_SongSingerWriter
activity_Composer then X in string
activity_SongSingerWriter then X in string
153
for all X in
// R_ISA_7
for all X in
// R_ISA_8
for all X in
// R_ISA_9
for all X in
// R_ISA_10
for all X in
// R_ISA_11
for all X in
// R_ISA_12
for all X in
// R_ISA_13
for all X in
// R_ISA_14
for all X in
// R_ISA_15
for all X in
// R_ISA_16
for all X in
position_TopTenAlbum then X in position_TopTenSong
position_TopTenAlbum then X in integer
position_TopTenSong then X in position_TopTenAlbum
position_TopTenSong then X in integer
groupType_Band then X in string
groupType_Chorus then X in string
groupType_Orchestra then X in string
CategoryType_InstrumentCategory then X in string
instrumentType_WindInstrument then X in string
instrumentType_PercussionInstrument then X in string
instrumentType_StringedInstrument then X in string
// Regole di equivalenza
// R_EQUI_1
for all X in position_TopTenAlbum then X in position_TopTenSong
and for all Y in position_TopTenSong then Y in
position_TopTenAlbum
// Regole di disgiunzione
// R_DIS_1
for all X in Singer then X not in Composer and
for all Y in Composer then Y not in Singer
// R_DIS_2
for all X in Band then X not in Chorus and
for all Y in Chorus then Y not in Band
// R_DIS_3
for all X in Band then X not in Orchestra and
154
for all Y in Orchestra then Y not in Band
// R_DIS_4
for all X in Chorus then X not in Orchestra and
for all Y in Orchestra then Y not in Chorus
// R_DIS_5
for all X in WindInstrument then X not in PercussionInstrument and
for all Y in PercussionInstrument then Y not in WindInstrument
// R_DIS_6
for all X in WindInstrument then X not in StringedInstrument and
for all Y in StringedInstrument then Y not in WindInstrument
// R_DIS_7
for all X in PercussionInstrument then X not in StringedInstrument
and for all Y in StringedInstrument then Y not in
PercussionInstrument
// R_DIS_8
for all X in activity_Singer then X not in activity_Composer and
for all Y in activity_Composer then Y not in activity_Singer
// R_DIS_9
for all X in activity_Singer then X not in groupType_Band and
for all Y in groupType_Band then Y not in activity_Singer
// R_DIS_10
for all X in activity_Singer then X not in groupType_Chorus and
for all Y in groupType_Chorus then Y not in activity_Singer
// R_DIS_11
for all X in activity_Singer then X not in groupType_Orchestra
and for all Y in groupType_Orchestra then Y not in
activity_Singer
// R_DIS_12
for all X in activity_Singer then X not in
CategoryType_InstrumentCategory and for all Y in
CategoryType_InstrumentCategory then Y not in activity_Singer
// R_DIS_13
for all X in activity_Singer then X not in
instrumentType_WindInstrument and for all Y in
instrumentType_WindInstrument then Y not in activity_Singer
// R_DIS_14
for all X in activity_Singer then X not in
instrumentType_PercussionInstrument and for all Y in
instrumentType_PercussionInstrument then Y not in
activity_Singer
// R_DIS_15
155
for all X in activity_Singer then X not in
instrumentType_StringedInstrument and for all Y in
instrumentType_StringedInstrument then Y not in
activity_Singer
// R_DIS_16
for all X in activity_Composer then X not in groupType_Band and
for all Y in groupType_Band then Y not in activity_Composer
// R_DIS_17
for all X in activity_Composer then X not in groupType_Chorus
and for all Y in groupType_Chorus then Y not in
activity_Composer
// R_DIS_18
for all X in activity_Composer then X not in groupType_Orchestra
and for all Y in groupType_Orchestra then Y not in
activity_Composer
// R_DIS_19
for all X in activity_Composer then X not in
CategoryType_InstrumentCategory and for all Y in
CategoryType_InstrumentCategory then Y not in activity_Composer
// R_DIS_20
for all X in activity_Composer then X not in
instrumentType_WindInstrument and for all Y in
instrumentType_WindInstrument then Y not in activity_Composer
// R_DIS_21
for all X in activity_Composer then X not in
instrumentType_PercussionInstrument and for all Y in
instrumentType_PercussionInstrument then Y not in
activity_Composer
// R_DIS_22
for all X in activity_Composer then X not in
instrumentType_StringedInstrument and for all Y in
instrumentType_StringedInstrument then Y not in
activity_Composer
// R_DIS_23
for all X in activity_SongSingerWriter then X not in
groupType_Band and for all Y in groupType_Band then Y not in
activity_SongSingerWriter
// R_DIS_24
for all X in activity_SongSingerWriter then X not in
groupType_Chorus and for all Y in groupType_Chorus then
Y not in activity_SongSingerWriter
156
// R_DIS_25
for all X in activity_SongSingerWriter then X not in
groupType_Orchestra and for all Y in groupType_Orchestra then
Y not in activity_SongSingerWriter
// R_DIS_26
for all X in activity_SongSingerWriter then X not in
CategoryType_InstrumentCategory and for all Y in
CategoryType_InstrumentCategory then Y not in
activity_SongSingerWriter
// R_DIS_27
for all X in activity_SongSingerWriter then X not in
instrumentType_WindInstrument and for all Y in
instrumentType_WindInstrument then Y not in
activity_SongSingerWriter
// R_DIS_28
for all X in activity_SongSingerWriter then X not in
instrumentType_PercussionInstrument and for all Y in
instrumentType_PercussionInstrument then Y not in
activity_SongSingerWriter
// R_DIS_29
for all X in activity_SongSingerWriter then X not in
instrumentType_StringedInstrument and for all Y in
instrumentType_StringedInstrument then Y not in
activity_SongSingerWriter
// R_DIS_30
for all X in groupType_Band then X not in groupType_Chorus and
for all Y in groupType_Chorus then Y not in groupType_Band
// R_DIS_31
for all X in groupType_Band then X not in groupType_Orchestra and
for all Y in groupType_Orchestra then Y not in groupType_Band
// R_DIS_32
for all X in groupType_Band then X not in
CategoryType_InstrumentCategory and for all Y in
CategoryType_InstrumentCategory then Y not in groupType_Band
// R_DIS_33
for all X in groupType_Band then X not in
instrumentType_WindInstrument and for all Y in
instrumentType_WindInstrument then Y not in groupType_Band
// R_DIS_34
for all X in groupType_Band then X not in
instrumentType_PercussionInstrument and for all Y in
157
instrumentType_PercussionInstrument then Y not in
groupType_Band
// R_DIS_35
for all X in groupType_Band then X not in
instrumentType_StringedInstrument and for all Y in
instrumentType_StringedInstrument then Y not in
groupType_Band
// R_DIS_36
for all X in groupType_Chorus then X not in
groupType_Orchestra and for all Y in groupType_Orchestra then
Y not in groupType_Chorus
// R_DIS_37
for all X in groupType_Chorus then X not in
CategoryType_InstrumentCategory and for all Y in
CategoryType_InstrumentCategory then Y not in
groupType_Chorus
// R_DIS_38
for all X in groupType_Chorus then X not in
instrumentType_WindInstrument and for all Y in
instrumentType_WindInstrument then Y not in
groupType_Chorus
// R_DIS_39
for all X in groupType_Chorus then X not in
instrumentType_PercussionInstrument and for all Y in
instrumentType_PercussionInstrument then Y not in
groupType_Chorus
// R_DIS_40
for all X in groupType_Chorus then X not in
instrumentType_StringedInstrument and for all Y in
instrumentType_StringedInstrument then Y not in
groupType_Chorus
// R_DIS_41
for all X in groupType_Orchestra then X not in
CategoryType_InstrumentCategory and for all Y in
CategoryType_InstrumentCategory then Y not in
groupType_Orchestra
// R_DIS_42
for all X in groupType_Orchestra then X not in
instrumentType_WindInstrument and for all Y in
instrumentType_WindInstrument then Y not in
groupType_Orchestra
158
// R_DIS_43
for all X in groupType_Orchestra then X not in
instrumentType_PercussionInstrument and for all Y in
instrumentType_PercussionInstrument then Y not in
groupType_Orchestra
// R_DIS_44
for all X in groupType_Orchestra then X not in
instrumentType_StringedInstrument and for all Y in
instrumentType_StringedInstrument then Y not in
groupType_Orchestra
// R_DIS_45
for all X in CategoryType_InstrumentCategory then X not in
instrumentType_WindInstrument and for all Y in
instrumentType_WindInstrument then Y not in
CategoryType_InstrumentCategory
// R_DIS_46
for all X in CategoryType_InstrumentCategory then X not in
instrumentType_PercussionInstrument and for all Y in
instrumentType_PercussionInstrument then Y not in
CategoryType_InstrumentCategory
// R_DIS_47
for all X in CategoryType_InstrumentCategory then X not in
instrumentType_StringedInstrument and for all Y in
instrumentType_StringedInstrument then Y not in
CategoryType_InstrumentCategory
// R_DIS_48
for all X in instrumentType_WindInstrument then X not in
instrumentType_PercussionInstrument and for all Y in
instrumentType_PercussionInstrument then Y not in
instrumentType_WindInstrument
// R_DIS_49
for all X in instrumentType_WindInstrument then X not in
instrumentType_StringedInstrument and for all Y in
instrumentType_StringedInstrument then Y not in
instrumentType_WindInstrument
// R_DIS_50
for all X in instrumentType_PercussionInstrument then X not in
instrumentType_StringedInstrument and for all Y in
instrumentType_StringedInstrument then Y not in
instrumentType_PercussionInstrument
159
// Sinonimie
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
Mapping tra i concetti ontologici e le Xclass globali di origine
Biography: Biography
artist: artist
Singer: Singer
Composer: Composer
SongSingerWriter: SongSingerWriter
AlbumType: Album
Song: Song
MusicalClassification: MusicalClassification
TopTenAlbum: TopTenAlbum
TopTenSong: TopTenSong
MusicalReview: MusicalReview
MusicalGroup: MusicalGroup
Band: Band
Chorus: Chorus
Orchestra: Orchestra
MusicalInstrumentCatalog: MusicalInstrumentCatalog
InstrumentCategory: InstrumentCategory
MusicalInstrument: MusicalInstrument
WindInstrument: WindInstrument
PercussionInstrument: PercussionInstrument
StringedInstrument: StringedInstrument
MusicalGoodsStore: MusicalGoodsStore
SheetCatalog: SheetCatalog
BookCatalog: BookCatalog
MusicalSheet: MusicalSheet
MusicalBook: MusicalBook
Le ultime righe di tale codice definiscono le corrispondenze tra concetti ed X-Class globali. L’ultima riga, ad esempio, indica che il concetto
MusicalBook deriva dalla X-Class globale MusicalBook.
160
E.2
Codice completo dello schema integrato
utilizzato negli esempi
// Schema integrato ODLI3
/*
Sogenti utilizzate:
EMI,
SONY,
ISLAND,
Deutsche Grammophone (DG),
La Voce del Padrone (VDP)
*/
interface Biography
{
attribute string author
mapping rule
EMI.Biografia.autore,
SONY.Biography.author,
ISLAND.Bio.author,
DG.Biographie.Autor,
VDP.Biografia.nomeAutore;
attribute date publishingDate
mapping rule
EMI.Biografia.data,
SONY.Biography.publishingDate,
ISLAND.Bio.date,
DG.Biographie.Date,
VDP.Biografia.dataDiPubblicazione;
attribute artist artist
mapping rule
EMI.Biografia.artista,
SONY.Biography.artist,
ISLAND.Bio.artist,
DG.Biographie.Kuenstler,
VDP.Biografia.artista;
};
interface artist
{
attribute string name
161
mapping rule
EMI.Artista.nome,
(SONY.Artist.firstname and SONY.Artist.middlename and
SONY.Artist.lastname),
ISLAND.Artist.name,
(DG.Kuenstler.Vorname and DG.Kuenstler.Familienname),
(VDP.Artista.nome and VDP.Artista.cognome);
attribute string artName ?
mapping rule
EMI.Artista.nomeDArte,
SONY.Artist.artName,
(VDP.Artista.soprannome union VDP.Artista.nomignolo on rule1);
attribute date birthDate
mapping rule
EMI.Artista.dataNascita,
SONY.Artist.birthDate,
ISLAND.Artist.birthDate,
DG.Kuenstler.Geburtstag,
(VDP.Artista.giornoNascita and VDP.Artista.meseNascita and
VDP.Artista.annoNascita);
attribute album_set Album
mapping rule
EMI.Artista.opere,
SONY.Artist.albums,
ISLAND.Artist.Album,
DG.Kuenstler.Werke,
VDP.Artista.album;
};
interface Singer
{
attribute string name
mapping rule
EMI.Cantante.nome,
(SONY.Singer.firstname and SONY.Singer.middlename and
SONY.Singer.lastname),
ISLAND.Singer.name,
(DG.Singer.Vorname and DG.Singer.Familienname),
(VDP.Cantante.nome and VDP.Cantante.cognome);
attribute string artName
mapping rule
EMI.Cantante.nomeDArte,
162
SONY.Singer.artName,
VDP.Cantante.soprannome;
attribute date birthDate
mapping rule
EMI.Cantante.dataNascita,
SONY.Singer.birthDate,
ISLAND.Singer.birthDate,
DG.Singer.Geburtstag,
(VDP.Cantante.giornoNascita and VDP.Cantante.meseNascita and
VDP.Cantante.annoNascita);
attribute album_set Album
mapping rule
EMI.Cantante.titoliAlbum,
SONY.Singer.albums,
ISLAND.Singer.Album,
DG.Singer.Werke,
VDP.Cantante.raccolte;
attribute activity_Singer activity
mapping rule
SONY.Singer.activity,
ISLAND.Singer.activity;
};
interface Composer
{
attribute string name
mapping rule
EMI.Compositore.nome,
(SONY.Composer.firstname and SONY.Composer.lastname),
ISLAND.SongWriter.name,
(DG.Komponist.Vorname and DG.Komponist.Familienname),
(VDP.Compositore.nome and VDP.Compositore.cognome);
attribute string artName
mapping rule
SONY.Composer.artName,
VDP.Compositore.soprannome;
attribute date birthDate
mapping rule
EMI.Compositore.dataDiNascita,
SONY.Composer.birthDate,
ISLAND.Composer.birthDate,
DG.Komponist.Geburtstag,
163
(VDP.Compositore.giornoNascita and VDP.Compositore.meseNascita and
VDP.Compositore.annoNascita);
attribute album_set Album
mapping rule
EMI.Compositore.opere,
SONY.Composer.albums,
ISLAND.Composer.Album,
DG.Komponist.Werke,
VDP.Compositore.album;
attribute activity_Composer activity
mapping rule
EMI.Compositore.occupazione,
SONY.Composer.activity,
DG.Komponist.Taetigkeit,
VDP.Compositore.attivita;
};
interface SongSingerWriter
{
attribute string name
mapping rule
EMI.Cantautore.nome,
(SONY.SongSingerWriter.firstname and
SONY.SongSingerWriter.middlename and
SONY.SongSingerWriter.lastname),
ISLAND.SingerWriter.name,
(DG.SongSingerVerfasser.Vorname and
DG.SongSingerVerfasser.Familienname),
(VDP.Cantautore.nome and VDP.Cantautore.cognome);
attribute string artName
mapping rule
EMI.Cantautore.nomeDArte,
SONY.SongSingerWriter.artName,
VDP.Cantautore.soprannome;
attribute date birthDate
mapping rule
EMI.Cantautore.dataNascita,
SONY.SongSingerWriter.birthDate,
ISLAND.SingerWriter.birthDate,
DG.SongSingerVerfasser.Geburtstag,
(VDP.Cantautore.giornoNascita and VDP.Cantautore.meseNascita and
VDP.Cantautore.annoNascita);
164
attribute album_set Album
mapping rule
EMI.Cantautore.opere,
SONY.SongSingerWriter.albums,
ISLAND.SingerWriter.Album,
DG.SongSingerVerfasser.Werke,
VDP.Cantautore.album;
attribute activity_SongSingerWriter activity
mapping rule
EMI.Cantautore.attivita,
SONY.SongSingerWriter.activity,
DG.SongSingerVerfasser.Taetigkeit,
VDP.Cantautore.attivita;
};
interface Album
{
attribute string title
mapping rule
EMI.Album.titolo,
SONY.Album.title,
ISLAND.Album.title,
DG.Album.Titel,
VDP.Album.titolo;
attribute integer year
mapping rule
EMI.Album.pubblicatoNel,
SONY.Album.year,
ISLAND.Album.publicationYear,
DG.Album.Jahr,
VDP.Album.anno;
attribute string kind
mapping rule
EMI.Album.genere,
SONY.Album.kind,
DG.Album.Art;
attribute integer soldCopies
mapping rule
EMI.Album.copieVendute,
SONY.Album.soldCopies,
DG.Album.VerfaufteKopie;
attribute Song_set Song
165
mapping rule
EMI.Album.canzoni,
SONY.Album.Songs,
ISLAND.Album.SongSet,
DG.Album.Lieder,
VDP.Album.brani;
attribute artist artist ?
mapping rule
EMI.Album.autore,
SONY.Album.artist,
ISLAND.Album.artist,
DG.Album.Autor,
VDP.Album.autore;
};
interface Song
{
attribute string title
mapping rule
EMI.Canzone.titolo,
SONY.Song.title,
ISLAND.Song.title,
DG.Lied.Titel,
VDP.Brano.titolo;
attribute decimal length
mapping rule
EMI.Canzone.lunghezza,
SONY.Song.length,
ISLAND.Song.length,
DG.Lied.Laenge,
VDP.Brano.durata;
attribute string kind ?
mapping rule
EMI.Canzone.genere,
SONY.Song.kind,
DG.Lied.Art;
attribute integer soldCopies
mapping rule
EMI.Canzone.copieVendute,
SONY.Song.soldCopies,
DG.Lied.VerfaufteKopie;
attribute artist artist ?
166
mapping rule
EMI.Canzone.autore,
SONY.Song.artist,
ISLAND.Song.artist,
DG.Lied.Autor,
VDP.Brano.autore;
};
interface MusicalClassification
{
attribute string week
mapping rule
EMI.Classifica.settimanaNumero,
SONY.Classification.week,
ISLAND.MusicalClassification.week,
DG.Rangliste.Woche,
VDP.Classifica.settimana;
attribute string_set sponsor
mapping rule
EMI.Classifica.sponsor,
SONY.Classification.sponsorizedBy,
VDP.Classifica.nomiSponsor;
attribute Album_set Album
mapping rule
EMI.Classifica.album,
SONY.Classification.albums,
ISLAND.MusicalClassification.albumSet,
DG.Ranglist.Alben,
VDP.Classifica.albums;
attribute Song_set Song
mapping rule
EMI.Classifica.canzoni,
SONY.Classification.songs,
ISLAND.MusicalClassification.songSet,
DG.Ranglist.Lieder,
VDP.Classifica.brani;
};
interface TopTenAlbum
{
attribute string title
mapping rule
EMI.TopTenAlbum.titolo,
167
SONY.TopTenAlbum.title,
ISLAND.TopTenAlbum.title,
DG.TopTenAlbum.Titel,
VDP.TopTenAlbum.titolo;
attribute integer year
mapping rule
EMI.TopTenAlbum.pubblicatoNel,
SONY.TopTenAlbum.year,
ISLAND.TopTenAlbum.publicationYear,
DG.TopTenAlbum.Jahr,
VDP.TopTenAlbum.anno;
attribute string kind
mapping rule
EMI.TopTenAlbum.genere,
SONY.TopTenAlbum.kind,
DG.TopTenAlbum.Art;
attribute integer soldCopies
mapping rule
EMI.TopTenAlbum.copieVendute,
SONY.TopTenAlbum.soldCopies,
DG.TopTenAlbum.VerfaufteKopie;
attribute Song_set Song
mapping rule
EMI.TopTenAlbum.canzoni,
SONY.TopTenAlbum.Songs,
ISLAND.TopTenAlbum.SongSet,
DG.TopTenAlbum.Lieder,
VDP.TopTenAlbum.brani;
attribute artist artist
mapping rule
EMI.TopTenAlbum.autore,
SONY.TopTenAlbum.artist,
ISLAND.TopTenAlbum.artist,
DG.TopTenAlbum.Autor,
VDP.TopTenAlbum.autore;
attribute position_TopTenAlbum position
mapping rule
EMI.TopTenAlbum.posizione,
SONY.TopTenAlbum.position,
ISLAND.TopTenAlbum.pos,
DG.TopTenAlbum.Lage,
168
VDP.TopTenAlbum.posiz;
attribute integer lastPosition ?
mapping rule
SONY.TopTenAlbum.lastPosition,
ISLAND.TopTenAlbum.lastPos;
};
interface TopTenSong
{
attribute string title
mapping rule
EMI.CanzoneTopTen.titolo,
SONY.TopTenSong.title,
ISLAND.TopTenSong.title,
DG.TopTenLied.Titel,
VDP.BranoTopTen.titolo;
attribute decimal length
mapping rule
EMI.CanzoneTopTen.lunghezza,
SONY.TopTenSong.length,
ISLAND.TopTenSong.length,
DG.TopTenLied.Laenge,
VDP.BranoTopTen.durata;
attribute string kind
mapping rule
EMI.CanzoneTopTen.genere,
SONY.TopTenSong.kind,
DG.TopTenLied.Art;
attribute integer soldCopies
mapping rule
EMI.CanzoneTopTen.copieVendute,
SONY.TopTenSong.soldCopies,
DG.TopTenLied.VerfaufteKopie;
attribute artist artist
mapping rule
EMI.CanzoneTopTen.autore,
SONY.TopTenSong.artist,
ISLAND.TopTenSong.artist,
DG.TopTenLied.Autor,
VDP.BranoTopTen.autore;
attribute position_TopTenSong position
mapping rule
169
EMI.CanzoneTopTen.posizione,
SONY.TopTenSong.position,
ISLAND.TopTenSong.pos,
DG.TopTenLied.Lage,
VDP.BranoTopTen.posiz;
attribute integer lastPosition ?
mapping rule
SONY.TopTenSong.lastPosition,
ISLAND.TopTenSong.lastpos;
};
interface MusicalReview
{
attribute date day
mapping rule
EMI.SpettacoloMusicale.data,
EMI.RassegnaMusicale.data,
SONY.MusicalReview.day,
ISLAND.Review.date,
DG.Schauspiel.Date,
VDP.Spettacolo.giorno,
VDP.Rassegna.giorno;
attribute string location
mapping rule
EMI.SpettacoloMusicale.luogo,
EMI.RassegnaMusicale.luogo,
SONY.MusicalReview.location,
ISLAND.Review.locateIn,
DG.Schauspiel.Platz,
VDP.Spettacolo.luogo,
VDP.Rassegna.luogo;
attribute MusicalGroup MusicalGroup
mapping rule
EMI.SpettacoloMusicale.gruppo,
EMI.RassegnaMusicale.gruppo,
SONY.MusicalReview.MusicalGroup,
ISLAND.Review = ’U2’,
DG.Schauspiel.Gruppe,
VDP.Spettacolo.gruppo,
VDP.Rassegna.gruppoProtagonista;
};
170
interface MusicalGroup
{
attribute string name
mapping rule
EMI.GruppoMusicale.nome,
SONY.MusicalGroup.name,
DG.Gruppe.Name,
VDP.Gruppo.nome;
attribute string director
mapping rule
EMI.GruppoMusicale.direttore,
SONY.MusicalGroup.director;
attribute string_set components
mapping rule
EMI.GruppoMusicale.componenti,
SONY.MusicalGroup.components,
DG.Gruppe.Mitglieder,
VDP.Gruppo.costituitoDa;
attribute Song_set Song
mapping rule
EMI.GruppoMusicale.pezzi,
SONY.MusicalGroup.Song,
DG.Gruppe.Lieder,
VDP.Gruppo.brani;
};
interface Band
{
attribute string name
mapping rule
EMI.BandaMusicale.nome,
SONY.Band.name,
DG.Kapelle.Name,
VDP.Banda.nome;
attribute string director
mapping rule
EMI.BandaMusicale.direttore,
SONY.Band.director;
attribute string_set components
mapping rule
EMI.BandaMusicale.componenti,
SONY.Band.components,
171
DG.Kapelle.Mitglieder,
VDP.Banda.costituitoDa;
attribute Song_set Song
mapping rule
EMI.BandaMusicale.pezzi,
SONY.Band.Song,
DG.Kapelle.Lieder,
VDP.Banda.brani;
attribute groupType_Band groupType
mapping rule
SONY.Band.groupType;
};
interface Chorus
{
attribute string name
mapping rule
EMI.CoroMusicale.nome,
SONY.Chorus.name,
DG.Chor.Name,
VDP.Coro.nome;
attribute string director
mapping rule
EMI.CoroMusicale.direttore,
SONY.Chorus.director;
attribute string_set components
mapping rule
EMI.CoroMusicale.componenti,
SONY.Chorus.components,
DG.Chor.Mitglieder,
VDP.Coro.costituitoDa;
attribute Song_set Song
mapping rule
EMI.CoroMusicale.pezzi,
SONY.Chorus.Song,
DG.Chor.Lieder,
VDP.Coro.brani;
attribute groupType_Chorus groupType
mapping rule
SONY.Chorus.groupType;
};
interface Orchestra
172
{
attribute string name
mapping rule
EMI.Orchestra.nome,
SONY.Orchestra.name,
DG.Orchester.Name,
VDP.Orchestra.nome;
attribute string director
mapping rule
EMI.Orchestra.direttore,
SONY.Orchestra.director,
DG.Orchester.Direktor,
VDP.Orchestra.dirett;
attribute string_set components
mapping rule
EMI.Orchestra.componenti,
SONY.Orchestra.components,
DG.Orchester.Mitglieder,
VDP.Orchestra.costituitoDa;
attribute Song_set Song
mapping rule
EMI.Orchestra.pezzi,
SONY.Orchestra.Song,
DG.Orchester.Lieder,
VDP.Orchestra.brani;
attribute groupType_Chorus groupType
mapping rule
SONY.Orchestra.groupType;
};
interface MusicalInstrumentCatalog
{
attribute date publishingDate
mapping rule
EMI.CatalogoStrumenti.data,
SONY.MusicalInstrumentCatalog.publishingDate,
ISLAND.InstrumentCatalog.date,
DG.Instrumentkatalog.Date,
VDP.CatalogoStrumenti.data;
attribute string shopName
mapping rule
EMI.CatalogoStrumenti.negozio,
173
SONY.MusicalInstrumentCatalog.shopName,
DG.Instrumentkatalog.Geschaeft,
VDP.CatalogoStrumenti.nomeNegozio;
attribute InstrumentCategory_set InstrumentCategory ?
mapping rule
SONY.MusicalInstrumentCatalog.InstrumentCategory,
ISLAND.InstrumentCatalog.categories;
attribute MusicalInstrument_set MusicalInstrument ?
mapping rule
EMI.CatalogoStrumenti.elencoStrumenti,
SONY.MusicalInstrumentCatalog.MusicalInstrument,
ISLAND.InstrumentCatalog.instruments,
DG.Instrumentkatalog.Instrumente,
VDP.CatalogoStrumenti.strumentiVenduti;
};
interface InstrumentCategory
{
attribute CategoryType_InstrumentCategory CategoryType
mapping rule
EMI.CategoriaStrumenti.tipo,
SONY.InstrumentCategory.CategoryType,
ISLAND.Category.type,
DG.Kategorie.Art,
VDP.Categoria.tipo;
attribute MusicalInstrument_set MusicalInstrument
mapping rule
EMI.CategoriaStrumenti.elencoStrumenti,
SONY.InstrumentCategory.MusicalInstrument,
ISLAND.Category.instruments,
DG.Kategorie.Instrumente,
VDP.Categoria.strumenti;
};
interface MusicalInstrument
{
attribute integer catalogCode ?
mapping rule
SONY.MusicalInstrument.catalogCode,
VDP.Strumento.codiceCatalogo;
attribute string instrumentType
mapping rule
EMI.StrumentoMusicale.tipo,
174
SONY.MusicalInstrument.instrumentType,
ISLAND.Instrument.type,
DG.Instrument.Art,
VDP.Strumento.tipo;
attribute decimal price
mapping rule
EMI.StrumentoMusicale.prezzo,
SONY.MusicalInstrument.price,
ISLAND.Instrument.price,
DG.Instrument.Preis,
VDP.Strumento.prezzo;
attribute string seller
mapping rule
EMI.StrumentoMusicale.venditore,
SONY.MusicalInstrument.seller,
DG.Instrument.Verkaeufer,
VDP.Strumento.venditore;
attribute string payment
mapping rule
EMI.StrumentoMusicale.pagamento,
SONY.MusicalInstrument.payment;
};
interface WindInstrument
{
attribute integer catalogCode
mapping rule
SONY.WindInstrument.catalogCode,
VDP.StrumentoAFiato.codiceCatalogo;
attribute instrumentType_WindInstrument instrumentType
mapping rule
EMI.StrumentoAFiato.tipo,
SONY.WindInstrument.instrumentType,
ISLAND.WindInstrument.type,
DG.Ateminstrument.Art,
VDP.StrumentoAFiato.tipo;
attribute decimal price
mapping rule
EMI.StrumentoAFiato.prezzo,
SONY.WindInstrument.price,
ISLAND.WindInstrument.price,
DG.Atemmusikinstrument.Preis,
175
VDP.StrumentoAFiato.prezzo;
attribute string seller
mapping rule
EMI.StrumentoAFiato.venditore,
SONY.WindInstrument.seller,
DG.Ateminstrument.Verkaeufer,
VDP.StrumentoAFiato.venditore;
attribute string payment
mapping rule
EMI.StrumentoAFiato.pagamento,
SONY.WindInstrument.payment;
};
interface PercussionInstrument
{
attribute integer catalogCode
mapping rule
SONY.PercussionInstrument.catalogCode,
VDP.StrumentoAPercussione.codiceCatalogo;
attribute instrumentType_PercussionInstrument instrumentType
mapping rule
EMI.StrumentoAPercussione.tipo,
SONY.MusicalInstrument.instrumentType,
ISLAND.PercussionInstrument.type,
DG.Schlaginstrument.Art,
VDP.StrumentoAPercussione.tipo;
attribute decimal price
mapping rule
EMI.StrumentoAPercussione.prezzo,
SONY.MusicalInstrument.price,
ISLAND.PercussionInstrument.price,
DG.Schlaginstrument.Preis,
VDP.StrumentoAPercussione.prezzo;
attribute string seller
mapping rule
EMI.StrumentoAPercussione.venditore,
SONY.PercussionInstrument.seller,
DG.Schlaginstrument.Verkaeufer,
VDP.StrumentoAPercussione.venditore;
attribute string payment
mapping rule
EMI.StrumentoAPercussione.pagamento,
176
SONY.PercussionInstrument.payment;
};
interface StringedInstrument
{
attribute integer catalogCode
mapping rule
SONY.StringedInstrument.catalogCode,
VDP.StrumentoACorde.codiceCatalogo;
attribute instrumentType_StringedInstrument instrumentType
mapping rule
EMI.StrumentoACorde.tipo,
SONY.StringedInstrument.instrumentType,
ISLAND.StringedInstrument.type,
VDP.StrumentoACorde.tipo;
attribute decimal price
mapping rule
EMI.StrumentoACorde.prezzo,
SONY.StringedInstrument.price,
ISLAND.StringedInstrument.price,
VDP.StrumentoACorde.prezzo;
attribute string seller
mapping rule
EMI.StrumentoACorde.venditore,
SONY.StringedInstrument.seller,
VDP.StrumentoACorde.venditore;
attribute string payment
mapping rule
EMI.StrumentoACorde.pagamento,
SONY.StringedInstrument.payment;
};
interface MusicalGoodsStore
{
attribute string storeName
mapping rule
EMI.NegozioDiMusica.nome,
SONY.MusicalGoodsStore.storeName,
ISLAND.MusicalStore.name,
DG.Musikgeschaeft.Name,
VDP.Negozio.nome;
attribute string IVA
mapping rule
177
EMI.NegozioDiMusica.pIva,
VDP.Negozio.IVA;
attribute InstrumentCatalog InstrumentCatalog
mapping rule
EMI.NegozioDiMusica.catalogoStrumenti,
SONY.MusicalGoodsStore.InstrumentCatalog,
ISLAND.MusicalStore.instrCatalog,
DG.Musikgeschaeft.Instrumente,
VDP.Negozio.strumenti;
attribute SheetCatalog SheetCatalog
mapping rule
EMI.NegozioDiMusica.catalogoSpartiti,
SONY.MusicalGoodsStore.SheetCatalog,
ISLAND.MusicalStore.sheetCatalog,
DG.Musikgeschaeft.Musikkatalog,
VDP.Negozio.spartiti;
attribute BookCatalog BookCatalog
mapping rule
EMI.NegozioDiMusica.catalogoLibri,
SONY.MusicalGoodsStore.BookCatalog,
ISLAND.MusicalStore.bookList,
DG.Musikgeschaeft.Buecherkatalog,
VDP.Negozio.elencoLibri;
};
interface SheetCatalog
{
attribute date publishingDate
mapping rule
EMI.CatalogoSpartiti.dataPubblicazione,
SONY.SheetCatalog.publishingDate,
ISLAND.SheetCatalog.date,
DG.Musikkatalog.Date,
VDP.ElencoSpartiti.dataPub;
attribute MusicalSheet_set MusicalSheet
mapping rule
EMI.CatalogoSpartiti.spartiti,
SONY.SheetCatalog.MusicalSheet,
ISLAND.SheetCatalog.sheets,
DG.Musikkatalog.Musiken,
VDP.ElencoSpartiti.lista;
};
178
interface BookCatalog
{
attribute date publishingDate
mapping rule
EMI.CatalogoLibri.dataPubblicazione,
SONY.BookCatalog.publishingDate,
ISLAND.BookCatalog.date,
DG.Buecherkatalog.Date,
VDP.ElencoLibri.data;
attribute MusicalBook_set MusicalBook
mapping rule
EMI.CatalogoLibri.libri,
SONY.BookCatalog.MusicalBook,
ISLAND.BookCatalog.books,
DG.Buecherkatalog.Buecher,
VDP.ElencoLibri.lista;
};
interface MusicalSheet
{
attribute decimal price
mapping rule
EMI.Spartito.prezzo,
SONY.MusicalSheet.price,
ISLAND.Sheet.price,
DG.Musik.Preis,
VDP.Musica.prezzo;
attribute string payment
mapping rule
EMI.Spartito.tipoDiPagamento,
SONY.MusicalSheet.payment,
ISLAND.Sheet.payMode,
DG.Musik.Bezahlung,
VDP.Musica.pagamento;
attribute string seller
mapping rule
EMI.Spartito.negoziante,
SONY.MusicalSheet.seller,
ISLAND.Sheet = ’ISLAND Store’,
DG.Musik.Verkaeufer,
VDP.Musica.vendutaDa;
attribute string metrics
179
mapping rule
EMI.Spartito.tempo,
SONY.MusicalSheet.metrics,
ISLAND.Sheet.metrics,
VDP.Musica.tempo;
attribute artist artist
mapping rule
EMI.Spartito.artista,
SONY.MusicalSheet.artist,
ISLAND.Sheet.artist,
DG.Musik.Autor,
VDP.Musica.compostaDa;
};
interface MusicalBook
{
attribute decimal price
mapping rule
EMI.Libro.prezzo,
SONY.MusicalBook.price,
ISLAND.Book.price,
DG.Musikbuch.Preis,
VDP.LibroDiMusica.costo;
attribute string payment
mapping rule
EMI.Libro.tipoDiPagamento,
SONY.MusicalBook.payment,
ISLAND.Book.payMode,
DG.Musikbuch.Bezahlung,
VDP.LibroDiMusica.pagamento;
attribute string seller
mapping rule
EMI.Libro.negoziante,
SONY.MusicalBook.seller,
ISLAND.Book = ’ISLAND Store’,
DG.Musikbuch.Verkaeufer,
VDP.LibroDiMusica.vendutoDa;
attribute string title
mapping rule
EMI.Libro.titolo,
SONY.MusicalBook.title,
ISLAND.Book.titled,
180
DG.Musikbuch.Titel,
VDP.LibroDiMusica.titolo;
attribute string_set author
mapping rule
EMI.Libro.scrittoDa,
SONY.MusicalBook.author,
ISLAND.Book.author,
DG.Musikbuch.Autor,
VDP.LibroDiMusica.autore;
attribute date publishingDate
mapping rule
EMI.Libro.data,
SONY.MusicalBook.publishingDate,
ISLAND.Book.date,
DG.Musikbuch.Date,
VDP.LibroDiMusica.stampatoInData;
};
E.3
Codice completo delle interrogazioni di
esempio
Esempio 1
Interrogazione sull’ontologia
select *
from Biography Biography_1,
artist artist_1,
Composer Composer_1,
Song Song_1,
Song Song_2
where
(Biography_1.author = ’Pietro martinelli’ and
Biography_1.artist = ’Ludwig van Beethoven’)
or
(artist_1.artName != ’Bono’ and
Composer_1.birthDate = artist_1.birthDate)
and
(Song_1.title != Song_2.title and
181
Song_1.length > Song_2.length and
Song_1.artist = Song_2.artist)
Risultato della traduzione
// ##@@ TRADUZIONE per la SORGENTE EMI:
// ##@@ UNION di 1 query:
SELECT *
FROM Biografia Biography_1,
Artista artist_1,
Compositore Composer_1,
Canzone Song_1,
Canzone Song_2
WHERE ((((Biography_1.autore = ’Pietro martinelli’)
AND
(Biography_1.artista = ’Ludwig van Beethoven’))
OR
((artist_1.nomeDArte != ’Bono’)
AND
(Composer_1.dataDiNascita = artist_1.dataNascita)))
AND
(((Song_1.titolo != Song_2.titolo)
AND
(Song_1.lunghezza > Song_2.lunghezza))
AND
(Song_1.autore = Song_2.autore)))
// ##@@ TRADUZIONE per la SORGENTE SONY:
// ##@@ UNION di 1 query:
SELECT *
FROM Biography Biography_1,
Artist artist_1,
Composer Composer_1,
Song Song_1,
Song Song_2
WHERE ((((Biography_1.author = ’Pietro martinelli’)
AND
(Biography_1.artist = ’Ludwig van Beethoven’))
OR
((artist_1.artName != ’Bono’)
AND
(Composer_1.birthDate = artist_1.birthDate)))
182
AND
(((Song_1.title != Song_2.title)
AND
(Song_1.length > Song_2.length))
AND
(Song_1.artist = Song_2.artist)))
// ##@@ Nessuna traduzione possibile per la sorgente ISLAND
// ##@@ Nessuna traduzione possibile per la sorgente DG
// ##@@ TRADUZIONE per la SORGENTE VDP:
// ##@@ UNION di 2 query:
SELECT *
FROM Biografia Biography_1,
Artista artist_1,
Compositore Composer_1,
Brano Song_1,
Brano Song_2
WHERE ((((Biography_1.nomeAutore = ’Pietro martinelli’)
AND
(Biography_1.artista = ’Ludwig van Beethoven’))
OR
((artist_1.soprannome != ’Bono’)
AND
(Composer_1.giornoNascita||Composer_1.meseNascita||
Composer_1.annoNascita = artist_1.giornoNascita||
artist_1.meseNascita||artist_1.annoNascita)))
AND
(((Song_1.titolo != Song_2.titolo)
AND
(Song_1.durata > Song_2.durata))
AND
(Song_1.autore = Song_2.autore)))
union
SELECT *
FROM Biografia Biography_1,
Artista artist_1,
Compositore Composer_1,
Brano Song_1,
Brano Song_2
WHERE ((((Biography_1.nomeAutore = ’Pietro martinelli’)
AND
(Biography_1.artista = ’Ludwig van Beethoven’))
183
OR
((artist_1.nomignolo != ’Bono’)
AND
(Composer_1.giornoNascita||Composer_1.meseNascita||
Composer_1.annoNascita = artist_1.giornoNascita||
artist_1.meseNascita||artist_1.annoNascita)))
AND
(((Song_1.titolo != Song_2.titolo)
AND
(Song_1.durata > Song_2.durata))
AND
(Song_1.autore = Song_2.autore)))
Esempio 2
Interrogazione sull’ontologia
select *
from Biography Biography_1,
MusicalGoodsStore MusicalGoodsStore_1,
MusicalReview MusicalReview_1
where (Biography_1.author = ’Pietro Martinelli’ and
Biography_1.artist = ’Gioacchino Rossini’)
or (MusicalGoodsStore_1.IVA = ’1234567890’ and
not (MusicalGoodsStore_1.storeName = Biography_1.author))
and MusicalReview_1.location = ’via Branze n 38’
Risultato della traduzione
// ##@@ TRADUZIONE per la SORGENTE EMI:
// ##@@ UNION di 2 query:
SELECT *
FROM Biografia Biography_1,
NegozioDiMusica MusicalGoodsStore_1,
SpettacoloMusicale MusicalReview_1
WHERE ((((Biography_1.autore = ’Pietro Martinelli’)
AND
(Biography_1.artista = ’Gioacchino Rossini’))
OR
((MusicalGoodsStore_1.pIva = ’1234567890’)
AND
184
NOT ((MusicalGoodsStore_1.nome = Biography_1.autore))))
AND
(MusicalReview_1.luogo = ’via Branze n 38’))
union
SELECT *
FROM Biografia Biography_1,
NegozioDiMusica MusicalGoodsStore_1,
RassegnaMusicale MusicalReview_1
WHERE ((((Biography_1.autore = ’Pietro Martinelli’)
AND
(Biography_1.artista = ’Gioacchino Rossini’))
OR
((MusicalGoodsStore_1.pIva = ’1234567890’)
AND
NOT ((MusicalGoodsStore_1.nome = Biography_1.autore))))
AND
(MusicalReview_1.luogo = ’via Branze n 38’))
// ##@@ Nessuna traduzione possibile per la sorgente SONY
// ##@@ Nessuna traduzione possibile per la sorgente ISLAND
// ##@@ Nessuna traduzione possibile per la sorgente DG
// ##@@ TRADUZIONE per la SORGENTE VDP:
// ##@@ UNION di 2 query:
SELECT *
FROM Biografia Biography_1,
Negozio MusicalGoodsStore_1,
Spettacolo MusicalReview_1
WHERE ((((Biography_1.nomeAutore = ’Pietro Martinelli’)
AND
(Biography_1.artista = ’Gioacchino Rossini’))
OR
((MusicalGoodsStore_1.IVA = ’1234567890’)
AND
NOT ((MusicalGoodsStore_1.nome = Biography_1.nomeAutore))))
AND
(MusicalReview_1.luogo = ’via Branze n 38’))
union
SELECT *
FROM Biografia Biography_1,
Negozio MusicalGoodsStore_1,
Rassegna MusicalReview_1
WHERE ((((Biography_1.nomeAutore = ’Pietro Martinelli’)
185
AND
(Biography_1.artista = ’Gioacchino Rossini’))
OR
((MusicalGoodsStore_1.IVA = ’1234567890’)
AND
NOT ((MusicalGoodsStore_1.nome = Biography_1.nomeAutore))))
AND
(MusicalReview_1.luogo = ’via Branze n 38’))
Esempio 3
Interrogazione sull’ontologia
select *
from Biography Biography_1,
MusicalGoodsStore MusicalGoodsStore_1,
MusicalReview MusicalReview_1,
artist artist_1
where ((Biography_1.author = Biography_1.artist)
or not (MusicalGoodsStore_1.storeName = Biography_1.author))
and MusicalReview_1.location = ’via Branze n 38’
and (artist_1.birthDate = ’19/03/1978’ or
not artist_1.name = artist_1.artName)
Risultato della traduzione
// ##@@ TRADUZIONE per la SORGENTE EMI:
// ##@@ UNION di 2 query:
SELECT *
FROM Biografia Biography_1,
NegozioDiMusica MusicalGoodsStore_1,
SpettacoloMusicale MusicalReview_1,
Artista artist_1
WHERE ((((Biography_1.autore = Biography_1.artista)
OR
NOT ((MusicalGoodsStore_1.nome = Biography_1.autore)))
AND
(MusicalReview_1.luogo = ’via Branze n 38’))
AND
((artist_1.dataNascita = ’19/03/1978’)
186
OR
NOT ((artist_1.nome = artist_1.nomeDArte))))
union
SELECT *
FROM Biografia Biography_1,
NegozioDiMusica MusicalGoodsStore_1,
RassegnaMusicale MusicalReview_1,
Artista artist_1
WHERE ((((Biography_1.autore = Biography_1.artista)
OR
NOT ((MusicalGoodsStore_1.nome = Biography_1.autore)))
AND
(MusicalReview_1.luogo = ’via Branze n 38’))
AND
((artist_1.dataNascita = ’19/03/1978’)
OR
NOT ((artist_1.nome = artist_1.nomeDArte))))
// ##@@ TRADUZIONE per la SORGENTE SONY:
// ##@@ UNION di 1 query:
SELECT *
FROM Biography Biography_1,
MusicalGoodsStore MusicalGoodsStore_1,
MusicalReview MusicalReview_1,
Artist artist_1
WHERE ((((Biography_1.author = Biography_1.artist)
OR
NOT ((MusicalGoodsStore_1.storeName = Biography_1.author)))
AND
(MusicalReview_1.location = ’via Branze n 38’))
AND
((artist_1.birthDate = ’19/03/1978’)
OR
NOT ((artist_1.firstname||artist_1.middlename||
artist_1.lastname = artist_1.artName))))
// ##@@ Nessuna traduzione possibile per la sorgente ISLAND
// ##@@ Nessuna traduzione possibile per la sorgente DG
// ##@@ TRADUZIONE per la SORGENTE VDP:
// ##@@ UNION di 4 query:
SELECT *
FROM Biografia Biography_1,
Negozio MusicalGoodsStore_1,
187
Spettacolo MusicalReview_1,
Artista artist_1
WHERE ((((Biography_1.nomeAutore = Biography_1.artista)
OR
NOT ((MusicalGoodsStore_1.nome = Biography_1.nomeAutore)))
AND
(MusicalReview_1.luogo = ’via Branze n 38’))
AND
((artist_1.giornoNascita||artist_1.meseNascita||
artist_1.annoNascita = ’19/03/1978’)
OR
NOT ((artist_1.nome||artist_1.cognome = artist_1.soprannome))))
union
SELECT *
FROM Biografia Biography_1,
Negozio MusicalGoodsStore_1,
Rassegna MusicalReview_1,
Artista artist_1
WHERE ((((Biography_1.nomeAutore = Biography_1.artista)
OR
NOT ((MusicalGoodsStore_1.nome = Biography_1.nomeAutore)))
AND
(MusicalReview_1.luogo = ’via Branze n 38’))
AND
((artist_1.giornoNascita||artist_1.meseNascita||
artist_1.annoNascita = ’19/03/1978’)
OR
NOT ((artist_1.nome||artist_1.cognome = artist_1.soprannome))))
union
SELECT *
FROM Biografia Biography_1,
Negozio MusicalGoodsStore_1,
Spettacolo MusicalReview_1,
Artista artist_1
WHERE ((((Biography_1.nomeAutore = Biography_1.artista)
OR
NOT ((MusicalGoodsStore_1.nome = Biography_1.nomeAutore)))
AND
(MusicalReview_1.luogo = ’via Branze n 38’))
AND
((artist_1.giornoNascita||artist_1.meseNascita||
188
artist_1.annoNascita = ’19/03/1978’)
OR
NOT ((artist_1.nome||artist_1.cognome = artist_1.nomignolo))))
union
SELECT *
FROM Biografia Biography_1,
Negozio MusicalGoodsStore_1,
Rassegna MusicalReview_1,
Artista artist_1
WHERE ((((Biography_1.nomeAutore = Biography_1.artista)
OR
NOT ((MusicalGoodsStore_1.nome = Biography_1.nomeAutore)))
AND
(MusicalReview_1.luogo = ’via Branze n 38’))
AND
((artist_1.giornoNascita||artist_1.meseNascita||
artist_1.annoNascita = ’19/03/1978’)
OR
NOT ((artist_1.nome||artist_1.cognome = artist_1.nomignolo))))
189
Bibliografia
[1] Javasoft home page. http://www.javasoft.com.
[2] Omg home page. http://www.omg.org.
[3] Devis Bianchini. Strumenti e metodi per la costruzione di ontologie di
dominio. Master’s thesis, Università degli studi di Brescia, 2002.
[4] S. Castano, V. De Antonellis, S. De Capitani di Vimercati, and M. Melchiori. An XML-based framework for information integration over
the web. In Proc. of Int. Workshop on Information Integration and
Web-based Applications & Services, Yogyakarta, Indonesia, settembre
2000.
[5] S. Castano, V. De Antonellis, S. De Capitani di Vimercati, and M. Melchiori. Designing a three-layer ontology in a web-based interconnection scenario. In First International Workshop on Electronic Business
Hubs: XML, Metadata, Ontologies, and Business Knowledge on the Web
(WEBH2001), Munich, Germany, September 2001.
[6] S. Castano, V. De Antonellis, S. De Capitani di Vimercati, and
M. Melchiori. An XML-based integration scheme for web data sources.
Ingénierie des Systèmes d’Information, 6(1):99–122, 2001.
[7] S. Castano, V. De Antonellis, S. De Capitani di Vimercati, and M. Melchiori. Semi-automated extraction of ontological knowledge from xml
data sources. In Second International Workshop on Electronic Business
Hubs: XML, Metadata, Ontologies, and Business Knowledge on the Web
(WEBH2002), Aix En Provence, France, Settembre 2002.
[8] Stefan Decker, Michael Erdmann, Dieter Fensel, and Rudi Studer. Ontobroker in a nutshell. Research and Advanced Technologies for Digital
Libraries, 1998.
190
[9] Stefan Decker, Michael Erdmann, Dieter Fensel, and Rudi Studer. Ontobroker: Ontology based access to distributed and semi-structured
information. DS-8: Semantic Issues in Multimedia Systems, 1999.
[10] John O. Everett, Daniel G. Bobrow, Reinhard Stolle, Richard Crouch,
Valeria de Paiva, Cleo Condoravi, Martin van den berg, and Livia Polany. Making ontologies work for resolving redundancies across documents.
Communications of the ACM, 45(2), 2002.
[11] Dieter Fensel. Ontologies: Silver bullet for knowledge management and
electronic commerce, 2001.
[12] Simone Foladori. Metodi e strumenti di unificazione di sorgenti xml.
Master’s thesis, Universitá degli studi di Brescia, marzo 2002.
[13] Michael Gruningen and Jintae Lee. Ontology application and design.
Communications of the ACM, 45(2), 2002.
[14] Nicola Guarino and Christopher Welty. Evaluating ontological decisions
with ontoclean. Communications of the ACM, 45(2), 2002.
[15] Clyde W. Holsapple and K.D. Joshi. A collaborative approach to
ontology design. Communications of the ACM, 45(2), 2002.
[16] Henry Kim. Predicting how ontologies for the semantic web will evolve.
Communications of the ACM, 45(2), 2002.
[17] J. Nielsen. Usability engineering. Morgan Kaufmann, San Francisco,
1994.
[18] Steffen Staab and Alexander Mädche. Knowledge portals - ontologies at
work. AI Magazine, 21(2), 2001.
[19] Yannis Tzitzikas, Nicolas Spyratos, and Panos Constantopoulos.
Mediator over ontology-based information sources. 2001.
[20] Mike uschold and Michael Gruningen. Ontologies: Principles, methods
and application. Knowledge Engineering Review, 11(2), giugno 1996.
[21] Mike Uschold and Michael Gruninger. Ontologies: Principles, methods
and application. Knowledge Engineering Review, 1996.
191
Scarica

la mia - Amicofragile