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
   
Datalog feladatok:
Egyszerű táblák és lekérdezések a kezdetekhez:
Szeret tábla és feladatok
Sörivók adatbázis és feladatok
Tankönyv Termék sémán alapuló feladatai:
Termék-PC-Laptop-Nyomtató adatbázis
Hajóosztályok-Csaták-Kimenetelek adatbázis
A fenti linkeken elérhető feladatokat fejezzük ki nem-rekurzív Datalog programmal!

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).
    
Vissza az AB1 gyakorlat oldalára             Vissza a Kezdőlapra