9.gyak.
Rekurzív
nem-negált Datalog és SQL3 WITH RECURSIVE
> Ma táblás gyakorlatot tartunk,
két fő témakört
nézünk meg:
a.) Tervezés:
>> E/K diagram
és leképezése
relációs modellre
b.) Lekérdezések logikai
lekérdező
nyelven:
>> Lekérdezések
kifejezése Datalogban, relációs
algebra és Datalog átírások
>> Rekurzív
Datalog és
rekurzió az SQL-ben, WITH RECURSIVE
utasítás
> Köv.héttől (10-12.gyak.) Gépes
feladatok III.témakör: PL/SQL
programozás E/K
diagram
és leképezése
relációs modellre
Ullman-Widom:
Adatbázisrendszerek.
Alapvetés
(Második,
átdolg.kiad),
2009.
-- E/K modell és
leképezése
relációs modellre, [UW1] 4.1-4.6.fej., 133-181.o.
-- II.ZH-án várható
feladat: adott E/K diagram
átírása relációs
modellé, vagyis
1.) egyedhalmazok és 2.)
kapcsolatok átírása
relációkká, 3.)
összevonások,
4.) gyenge egyedhalmazok
kezelése, 5.)
osztályhierarchia ("isa")
átalakítása
relációkká (a
három
megközelítés: E/K
típusú,
obj.orientált, nullértékekkel).
Példák: E/K
diagram leképezése relációs
modellre
-- E/K átírása
relációkra,
összevonás, lásd E/K_A1.pdf (Kiss
A./Ullman: Princ.of DB)
-- Gyenge egyedhz, Osztályhierarchia
átalakítása
relációkká,
lásd E/K_A2.pdf
-- Orvosi
adatbázis rendszer
>> lásd E/K_B.pdf
(Kósa B.- kicsit más
jelöléssel)
-- Gyakorló példák:
>> lásd E/K_pl1.pdf
és HF: E/K_pl2.pdf Lekérdezések
kifejezése Datalogban
Áttekintés:
- Az 1-2. gyakorlat lekérdezéseit
először
természetes nyelven fogalmaztuk meg, majd
"táblákban gondolkodva" azt
néztük meg, hogyan mely
táblából milyen műveletekkel
tudjuk megkapni az
eredménytáblát, ezt
megadtuk formálisan is
relációs
algebrában.
- Ezután a 3-4. gyakorlaton SQL SELECT
utasítással (multihalmazokon) fejeztük
ki
ugyanezeket a
lekérdezéseket. Az 5-6. gyakorlaton
néztünk
további lehetőségeket
az SQL SELECT-ben, majd
kiterjesztettük a
relációs algebrát erre a
lehetőségekre.
- A mai gyakorlaton visszatérünk az 1-2.
gyakorlatok relációs
algebrai lekérdezéseire
(halmazokon) és a
lekérdezéseket
fejezzük
ki (nem rekurzív) Datalog programmal.
Segédanyag:
- Relációs
algebra Datalog átírások: AB1_Datalog_pp25_27.pdf
- Tankönyvben
[Ullman-Widom] 5.3-5.4. Datalog
szabályok és
lekérdezések
Megjegyzés. A
rekurziót a
következő menüpontban
tárgyaljuk, például a
tranzitív
lezárt
nem fejezhető ki
relációs algebrában, viszont
rekurzív
Datalog programmal megadható. Rekurzív
nem-negált Datalog és SQL3 WITH RECURSIVE
Segédanyag:
- Rekurzív Datalog: AB1_RekDatalog_pp9_11.pdf
- Rekurzió az SQL3-ban: AB1_RekDatalog_pp29_30.pdf
- Datalog: [Ullman-Widom]
5.3-5.4. Datalog szabályok és
lekérdezések
- Rekurzió: [Ullman-Widom]
10.2.
Rekurzió az SQL-ben (466-474.o.)
Rek1.feladat:
- Az
alábbi feladat a
tankönyv (Ullman-Widom kék
könyv) 10.2 szakaszára épül. Jaratok(legitarsasag,
honnan, hova, koltseg, indulas, erkezes)
táblában repülőjáratok
adatait
tároljuk.
-
Készítsünk ebből
saját példányt: jaratok_tabla.txt
és az
alapján
dolgozzunk
DROP TABLE jaratok;
CREATE TABLE jaratok(
legitarsasag CHAR(2),
honnan VARCHAR2(10),
hova VARCHAR2(10),
koltseg NUMBER,
felszallas NUMBER,
erkezes NUMBER);
INSERT INTO jaratok VALUES('UA', 'SF','DEN', 1000, 930,1230);
INSERT INTO jaratok VALUES('AA', 'SF','DAL', 10000, 900,1430);
INSERT INTO jaratok VALUES('UA','DEN','CHI', 500, 1500,1800);
INSERT INTO jaratok VALUES('AA','DEN','DAL', 2000, 1400,1700);
INSERT INTO jaratok VALUES('AA','DAL','CHI', 600, 1530,1730);
INSERT INTO jaratok VALUES('AA','DAL', 'NY', 2000, 1500,1930);
INSERT INTO jaratok VALUES('AA','CHI', 'NY', 3000, 1900,2200);
INSERT INTO jaratok VALUES('UA','CHI', 'NY', 2000, 1830,2130);
- (Papíros feladat) Fejezzzük ki Datalog
programmal, hogy mely (x,y)
város
párokra
lehetséges egy vagy
több
átszállással eljutni x
városból y városba?
- Megoldás:
1. Eljut(X, Y)
<- Jaratok(L, X, Y, K, F, E)
2. Eljut(X, Y) <-
Eljut(X, Z) AND Jaratok(L, Z, Y, K, F, E)
- (Papíros feladat) A fenti rekurzív Datalog
programot
írd át az SQL3 szabványban
szereplő WITH RECURSIVE
utasítással! (Csak
papíron! Oracle nem támogatja).
- Megoldás:
WITH RECURSIVE eljut AS
(SELECT honnan, hova FROM jaratok
UNION
SELECT eljut.honnan, jaratok.hova
FROM eljut, jaratok
WHERE eljut.hova = jaratok.honnan)
SELECT * FROM eljut;
- (Gépes feladatok: Oracle CONNECT BY PRIOR, lásd
előző
órán 8.gyak#2.5.)
Amennyiben azt
szeretnénk
megtudni, hogy mely
városokba lehet eljutni Dallasból
ezt a következő
hierarchikus lekérdezéssel kapjuk meg
('DAL'='Dallas')
SELECT DISTINCT hova
FROM
jaratok
WHERE
HOVA <> 'DAL'
START WITH honnan = 'DAL'
CONNECT BY PRIOR hova = honnan;
- Most szúrjunk be még egy sort, ami
után
már
irányított kör is lesz a
táblában:
INSERT INTO jaratok
VALUES('LH',
'CHI', 'DEN', 2000, 1900, 2100);
Ekkor a fenti hierarchikus
lekérdezés nem
működik, viszont NOCYCLE-lel igen:
SELECT DISTINCT hova
FROM
jaratok
WHERE
HOVA <> 'DAL'
START WITH honnan = 'DAL'
CONNECT BY NOCYCLE PRIOR hova = honnan;
-
Átszállásokkal mely
városokba lehet eljutni
San Franciscoból ('SF'='San Francisco')
SELECT LPAD(' ', 4*level)
||honnan, hova,
level-1 Atszallasok
FROM jaratok
WHERE
HOVA <> 'SF'
START WITH honnan = 'SF'
CONNECT BY NOCYCLE PRIOR hova =
honnan;
- A hierarchikus lekérdezésben további
pszeudo
oszlopokat is használhatunk, amint
azt az alábbi
példában
láthatjuk az úzvonal
megadását
SELECT
hova,
sys_connect_by_path(honnan||'->'||hova, '/'),
connect_by_isleaf, connect_by_iscycle
FROM
jaratok
START
WITH honnan = 'SF'
CONNECT BY NOCYCLE PRIOR hova
= honnan;
- Mely (x, y)
várospárokra lehetséges
egy vagy több átszállással
eljutni x városból y városba?
Ezt PL/SQL programmal fogjuk
Oracle-ben megoldani (folytatjuk, lásd 11.gyak#Rek1)
Nem kötelező
beadandó gyakorló feladatok:
Kérem, hogy a fenti Datalog_feladatokat fejezzük ki
nem-rekurzív Datalog programmal,
ezt és a másik HF: E/K_pl2.pdf átírást a 10.gyak valamint a 11.gyak elején lehet beadni.
A 10-11.gyakorlaton gépes PL/SQL feladatokat oldunk meg, de a ZH előtt visszatérünk
ezeknek a papíros feladatoknak a megoldására a 12.gyakorlaton (ZH előtti összefoglalás).