Ricorsione in SQL-99 Introduzione In SQL2 non è possibile definire interrogazioni che facciano uso della ricorsione Esempio Voli(lineaAerea, da, a, parte, arriva) non è possibile esprimere l interrogazione che ritrova tutte le città raggiungibili l una dall altra, con un numero arbitrario di tappe intermedie per risolvere queste interrogazioni con SQL2, è necessario utilizzare SQL da programma in SQL-99 è stata aggiunta la possibilità di esprimere interrogazioni ricorsive Idea di base Base teorica: basi di dati deduttive Uso regole logiche eventualmente ricorsive per definire il contenuto delle relazioni i predicati rappresentano le relazioni le variabili rappresentano attributi la virgola rappresenta AND (join) Definizioni multiple per la stessa relazione rappresentano un OR (unione) 1
Esempio Relazione estensionale Voli(lineaAerea, da, a, parte, arriva) Voli e memorizzata su disco Relazione intensionale 1. Raggiunge(da,a) Voli(lineaAerea, da, a, parte, arriva) 2. Raggiunge(da,a) Voli(lineaAerea, da, citta1, parte, arriva), Raggiunge(citta1,a) Raggiunge è una vista, cioè una relazione intensionale, la cui definizione dipende da se stessa e dalla relazione Voli Ricorsione Esempio (continua) Raggiunge e definita dall unione di due interrogazioni 1. Proiezione (da,a) da Voli R1= da,a (Voli) 2. (i) Join tra Voli e Raggiunge sulla base del campo citta1, che rappresenta una citta intermedia (ricorsione) e (ii) proiezione su (da,a) R2 = da,a (Voli x a = da Raggiunge) 3. Raggiunge = R1 U R2 Una volta definita, la relazione intensionale Raggiunge puo essere utilizzata nel contesto di una interrogazione SQL-99 - comando Supporta il comando per definire relazioni intensionali le relazioni intensionali definite con il comando non diventano parte dello schema ma rappresentano solo dichiarazioni di relazioni da utilizzare nel contesto dell interrogazione l interrogazione può poi essere usata in un qualunque contesto in cui sia possibile utilizzare un interrogazione SQL 2
SQL-99 - comando R 1 AS <definizione di R 1 >,... R n AS <definizione di R n >, Definizione <interrogazione che coinvolge R 1,, R n > Uso SQL-99 - comando ogni dichiarazione può essere ricorsiva e le relazioni possono essere mutuamente ricorsiva ogni relazione coinvolta in una ricorsione deve essere preceduta dalla parola chiave RECURSIVE la definizione per la relazione R i consiste in parola chiave opzionale RECURSIVE il nome della relazione che si sta definendo parola chiave AS interrogazione che definisce R i e può fare riferimento a R 1,, R i-1 l interrogazione finale che può far riferimento a tutte le relazioni definire in precedenza Esempio (continua) predicato Raggiunge (lineare) RECURSIVE Raggiunge(da,a) AS (SELECT da,a FROM Voli) UNION (SELECT R1.da, R2.a FROM Voli AS R1, Raggiunge AS R2 WHERE R1.a = R2.da) SELECT * FROM Raggiunge; Definizione Uso 3
Esempio (continua) predicato Raggiunge (lineare), definizione alternativa Coppie AS SELECT da,a FROM Voli, RECURSIVE Raggiunge(da,a) AS Coppie UNION (SELECT Coppie.da, Raggiunge.a FROM Coppie, Raggiunge WHERE Coppie.a = Raggiunge.da) SELECT * FROM Raggiunge; SQL-99 - restrizione la ricorsione deve essere lineare nella definizione di una relazione R, R può comparire una sola volta Esempio ricorsione non lineare Relazione estensionale Voli(lineaAerea, da, a, parte, arriva) Relazione intensionale 1. Raggiunge(da,a) Voli(lineaAerea, da, a, parte, arriva) 2. Raggiunge(da,a) Raggiunge(da, citta1), Raggiunge(citta1,a) 4
Esempio ricorsione non lineare (non corretto in SQL-99) predicato Raggiunge non lineare RECURSIVE Raggiunge(da,a) AS (SELECT da,a FROM Voli) UNION (SELECT R1.da, R2.a FROM Raggiunge AS R1, Raggiunge AS R2 WHERE R1.a = R2.da) SELECT * FROM Raggiunge; SQL-99 - comando le definizioni all'interno del comando sono disponibili solo all'interno del comando e non possono essere usate al di fuori di questo tali tabelle sono comunque create e memorizzate temporaneamente (per tutta la durata del comando) nel comando si possono definire viste invece che tabelle la differenza sintattica è che si usa la parola chiave VIEW nella definizione della relazione Esempio VIEW Coppie AS SELECT da, a FROM Voli se si definisce Coppie come vista, tale relazione non viene effettivamente generata, ma il suo uso nella costruzione di Raggiunge viene sostituito dall'uso delle componenti dalle tuple di Voli 5
SQL-99 - semantica La semantica delle interrogazioni ricorsive è definita mediante la nozione di punto fisso si costruisce una sequenza R i di relazioni tali che: R 0 è la relazione vuota R i, 1 i, viene ottenuta applicando la definizione della relazione a R i-1 quando, per un certo i, si ha che R i = R i-1 ci si ferma e tale relazione è il risultato dell'interrogazione Esempio Determinare i cammini di un grafo dati gli archi Supponiamo di partire da una relazione Arco(da,a) Cammino(da,a) Arco(da,a) Cammino(da,a) Arco (da,nodo), Cammino(nodo,a) RECURSIVE Cammino(da,a) AS (SELECT da,a FROM Arco) UNION (SELECT R1.da, R2.a FROM Arco AS R1, Cammino AS R2 WHERE R1.a = R2.da); SELECT * FROM Cammino; Esempio (continua) Arco Cammino 0 = { }; Cammino 1 = 6
Esempio - semantica Cammino 2 = Cammino 1 Cammino 3 = Cammino 2 Cammino 4 = Cammino 3 punto fisso e risultato Ricorsione e negazione In alcuni casi è necessario utilizzare la negazione nella definizione di un predicato ricorsivo EXCEPT, INTERSECT NOT IN, NOT EXISTS in presenza di ricorsione, questo può però dare luogo a problemi nel definire la semantica Esempio errato P(X) R(X), NOT Q(X) Q(X) R(X), NOT P(X) P = R - Q Q = R P RECURSIVE P(X) AS (SELECT * FROM R) EXCEPT (SELECT * FROM Q), RECURSIVE Q(X) AS (SELECT * FROM R) EXCEPT (SELECT * FROM P) SELECT * FROM P; 7
Esempio errato (continua) se R contiene solo la tupla 0, l'interrogazione ha due possibili risposte: {R(0), P(0)} {R(0), Q(0)} ma non c è modo di scegliere tra le due al contrario, SQL-99 vuole garantire una semantica deterministica alle interrogazioni Esempio corretto Non sempre l uso di costrutti negativi porta al non determinismo Si vogliono determinare le città: raggiungibili una dall altra anche in più voli della United Airlines (UA) non raggiungibili una dall altra anche in più voli della American Airlines (AA) In questo esempio la negazione e utilizzata nell interrogazione finale e non interviene nella ricorsione Esempio corretto (continua) Triple AS SELECT lineaaerea, da, a FROM Voli, RECURSIVE Raggiunge(lineaAerea,da,a) AS Triple UNION (SELECT Triple.lineaAerea, Triple.da, Raggiunge.a FROM Triple, Raggiunge WHERE Triple.a = Raggiunge.da AND Triple.lineaAerea = Raggiunge.lineaAerea) (SELECT da,a FROM Raggiunge WHERE lineaaerea = 'UA') EXCEPT (SELECT da,a FROM Raggiunge WHERE lineaaerea = 'AA'); 8
Esempio corretto (continua) Esempio corretto (continua) La prima sottointerrogazione restituisce le seguenti coppie la seconda sottointerrogazione restituisce le seguenti coppie Esempio corretto (continua) Il risultato è la differenza tra questi insiemi di coppie 9
Stratificazione Per evitare i problemi dovuti all'uso della ricorsione attraverso la negazione, ci si restringe alla ricorsione in cui la negazione è stratificata la nozione di negazione stratificata permette di limitare l uso della ricorsione a interrogazioni la cui semantica è ben definita quando la negazione è stratificata esiste un algoritmo per calcolare un particolare minimo punto fisso, che corrisponde al contenuto informativo "intuitivo" Stratificazione - grafo Grafo i cui nodi corrispondono alle relazioni definite nella clausola arco dal nodo A al nodo B etichettato da - se nella definizione di A compare B negato arco dal nodo A al nodo B se nella definizione di A compare B non-negato se il grafo ha un ciclo che contiene uno o più archi negativi la ricorsione non è stratificata, altrimenti la ricorsione è stratificato Esempio negazione non stratificata P(X) R(X), NOT Q(X) Q(X) R(X), NOT P(X) P = R - Q Q = R - P P - R Negazione non stratificata - Q 10
Stratificazione Se la ricorsione e stratificata, i predicati intensionali possono essere raggruppati in strati lo strato di un predicato A è il più grande numero di archi negativi su un cammino che comincia da A In questo caso, e possibile calcolare il contenuto delle relazioni in accordo alla semantica di punto fisso nell'ordine dei loro strati, partendo dal più basso Esempio negazione stratificata P(X) R(X), NOT Q(X) Q(X) R(X), T(X) T(X) Q(X), NOT S(X) T(X) R(X) P - R Q T - S P = R Q Q = R X T T = (Q S) U R Non ci sono cicli con archi negativi quindi e stratificato Esempio (continua) R 0 2 P - Q 1 Lo strato dei predicati estensionali e sempre 0 T 1 - S 0 11
Esempio (continua) P = R Q Q = R X T T = (Q - S) U R Strato 0: R = {0,1}, S = {1} Strato 1: applico algoritmo punto fisso per calcolare la semantica dei predicati con strato pari a 1 (T e Q) Tale semantica dipendera solo da predicati con strato pari a 0 (semantica gia calcolata), che vengono considerati come estensionali, utilizzando la loro semantica come estensione Risultato: T 0 = {}, Q 0 = {} T 1 = {0,1}, Q 1 = {} T 2 = {0,1}, Q 2 = {0,1} T 3 = {0,1}, Q 3 = {0,1} punto fisso Esempio (continua) P = R Q Q = R X T T = (Q - S) U R Strato 2: applico algoritmo punto fisso per calcolare la semantica dei predicati con strato pari a 2 (P) Tale semantica dipendera solo da predicati con strato pari a 0 oppure 1 (semantica gia calcolata), che vengono considerati come estensionali, utilizzando la loro semantica come estensione Risultato: P 0 = {} P 1 = {} punto fisso Risultato: R = {0,1}, S= {1}, T = {0,1}, Q = {0,1}, P = {} Stratificazione Si noti che la query che utilizza le relazioni definite nella clausola non puo mai generare problemi di stratificazione Assumendo di assegnarle un nome e di inserire il nodo corrispondente nel grafo Ci possono essere archi uscenti da tale nodo, dati dalle relazioni utilizzate per la sua definizione Non ci possono essere archi entranti Quindi non puo esistere un ciclo che contiene il nodo che rappresenta l interrogazione finale 12
Stratificazione In SQL-99 viene richiesta la stratificazione anche rispetto ad altri costrutti non monotoni, ad esempio aggregati Vale tutto quanto detto per la negazione, in questo caso un arco negato rappresenta una funzione di aggregazione Esempio RECURSIVE P(X) AS (SELECT * FROM R) UNION (SELECT * FROM Q), RECURSIVE Q(X) AS SELECT SUM(X) FROM P SELECT * FROM P; Esempio (continua) R = {12, 34} P 0 = { }, Q 0 = { } P 1 = {12, 34}, Q 1 = {46} P 2 = {12, 34, 46}, Q 2 = {92} P 3 = {12, 34, 92}, Q 3 = {138} Non si raggiunge mai un punto fisso 13
Esempio (continua) P R - Q Comando in Oracle Si puo utilizzare, con la stessa sintassi vista per SQL-99 Non e pero possibile definire relazioni ricorsive Serve quindi solo per definire delle relazioni da utilizzare eventualmente piu volte nel contesto di una interrogazione 14