Institut für Informationssysteme Prof. Dr. H.-J. Schek F. Akal, K. Jauslin, K. Haller M. Mlivoncic, M. Schmidt, C. Schuler Eidgenössische Technische Hochschule Zürich Swiss Federal Institute of Technology Zurich Informationssysteme IS-K WS 2001/2002 Übung 4 Beispiellösung Aufgabe 1: Datalog, Views und Relationale Algebra Gegeben seien folgende Regeln ledig(X) ledig(Y) verwandt(X,Y) verwandt(X,Z) :- mann(X), \+ ehepaar(X,Y). :- frau(Y), \+ ehepaar(X,Y). :- verwandt(Y,X). :- verwandt(X,Y), verwandt(Y,Z). a) Formulieren Sie obige Regeln über den entsprechenden Relationen durch äquivalente Ausdrücke der Relationenalgebra Verwenden Sie dazu die Relationen Elternteil(Elternteil, Kind) Frau(Frau) Mann(Mann) Ehepaar(Partner1, Partner2) Geschwister(Geschwister1,Geschwister2) Ledig(L) := (F rau[L] − π[L]Ehepaar[X, L]) ∪ (M ann[L] − π[L]Ehepaar[L, Y ]) Die Verwandt-Beziehung lässt sich mittels relationaler Algebra nicht ausdrücken, da sie rekursiv de£niert ist. Dazu bräuchten wir einen Fixpunkt-Operator ähnlich wie in Aufgabe 3. Formulieren Sie die folgenden Anfragen jeweils mittels Datalog-Ausdrücken sowie mittels relationenalgebraischen Ausdrücken. b) Wer ist der Vater von Cecilia? 1. Datalog: ? − elternteil(X, cecilia), mann(X). 2. Relationenalgebra: π[V ]σ[K = Cecilia ](Elternteil[V, K] 1 M ann[V ]) c) Wer sind die Schwager von Charly? Formulieren Sie zunächst die Regel für Schwager in Datalog. • Datalog: schwager(X, Y ) : −ehepaar(Y, A), geschwister(A, X), mann(X). schwager(X, Y ) : −geschwister(Y, A), ehepaar(A, X), mann(X). ? − schwager(X, charly) 1 • Relationale Algebra: π[X]σ[Y = Charly ](Schwager[X, Y ]) = π[X]σ[Y = Charly ](Ehepaar[Y, A] 1 Geschwister[A, X] 1 M ann[X] ∪Geschwister[Y, A] 1 Ehepaar[A, X] 1 M ann[X]) Betrachten sie die die Regel: geschwister(Y,Z) :- elternteil(X,Y), elternteil(X,Z) Y\ ==Z. d) Welchen logischen Zweck erfüllt der Ausdruck Y\ ==Z ? Sonst ist man sich selbst Geschwister. e) Datalog Regeln können nur einen Teil der Wirklichkeit abbilden. Welche zusätzliche Bedingung muss, laut obiger Regel, für Geschwister in unserem Modell gelten? Mindestens ein Elternteil muss in der Datenbank gespeichert sein. Durch die closed world assumption und die De£nition von Geschwister als zwei Fakten mit einem gemeinsamen Elternteil. 2 Aufgabe 2: Modellierung durch Fakten und Regeln > B ? C = @ A Gegeben sei der dargestellte gerichtete Graph mit 7 Knoten und 8 Kanten. a) Modellieren Sie den Graphen durch Fakten. knoten(a) knoten(e) kante(a,b) kante(d,e) knoten(b) knoten(f) kante(a,d) kante(e,f) knoten(c) knoten(g) kante(c,a) kante(f,g) knoten(d) kante(c,d) kante(g,e) b) Geben Sie Regeln an, mit denen abgeleitet werden kann, ob von einem beliebigen Knoten X aus über einen gerichteten Pfad ein anderer Knoten Y erreicht werden kann. Welches mathematische Konzept wird damit beschrieben? Wie können diese Ausdrücke mittels relationenalgebraischer Ausdrücke formuliert werden und wo bestehen hier Schwierigkeiten? pfad(X,Y) :- kante(X,Y). pfad(X,Y) :- kante(X,Z), pfad(Z,Y). Hier wird der transitive Abschluss modelliert. Dieser ist weder mit relationaler Algebra noch mittels SQL ausdrückbar, da hier keine rekursiven Strukturen existieren. Die Modellierung von Hüllen ist aber oft praxisrelevant, was die Bedeutung deduktiver Datenbanken durchaus stärkt. Beispiel für transitive Abschlüsse sind auch die Flugverbindungen aus der Vorlesung. c) Erweitern sie ihre Lösung für ungerichtete Graphen (mit nur einer zusätzlichen Regel). Dies ist wie bisher zu realisieren mit einer zusätzlichen Regel: kante(X,Y) :- kante(Y,X). Dies führt aber unter Umständen bei der Auswertung zu Problemen, da die Termination nicht garantiert werden kann. 3 Aufgabe 3: Fixpunkt Gegeben sei eine relationale Datenbank mit den Relationen Elternteil (Eltern Nr, Kind Nr) Person (P Nr, Name, Vorname, Alter, Geschlecht) Formulieren Sie zu den beiden folgenden rekursiven Anfragen die Fixpunktgleichung der Relationenalgebra. a) Gesucht sind alle Personen – Vorfahren Paare, die den gleichen Vornamen tragen. Es quali£zieren sich also alle Personen, die irgendeinen Vorfahren mit gleichem Vornamen haben. Zunächst wird der Fixpunkt für alle Vorfahren berechnet: vorfahr(ENr,KNr) :- elternteil(ENr,KNr). vorfahr(ENr,KNr) :- elternteil(ENr,Y), vorfahr(Y,KNr). Danach die Anfrage nach gleichem Namen gestellt: ?- vorfahr(X,Y), person(X, ,VN, , ), person(Y, ,VN, , ). Das ganze in Relationenalgebra mit H = G(F ) ∪ H F F := Elternteil[EN r, KN r] H := V orf ahr[EN r, KN r] G(F := F ) H F := π[EN r, KN r](H[EN r, Z] 1 F [Z, KN r]) Aus dem durch H = G(F ) ∪ H F bestimmten Fixpunkt H erhält man schliesslich die Lösung: π[EN r, Knr, V orname] H[EN r, KN r] 1 P erson(EN r, EN ame, V orname, EA, EG] 1 P erson(KN r, KN ame, V orname, KA, KG] 4 b) Gesucht sind Vorfahrenreihen, die über eine oder mehrere Generationen in Folge den gleichen Vornamen getragen haben. Hier muss die Bedingung für den gleichen Namen in die Rekursion hineingezogen werden. Zunächst wieder zuerst Datalog: vorfahrgn(ENr,KNr,VN) :- elternteil(ENr,KNr), person(ENr, ,VN, , ), person(KNr, ,VN, , ). vorfahrgn(ENr,KNr,VN) :- elternteil(ENr,Y), person(ENr, ,VN, , ), vorfahrgn(Y,KNr,VN). Danach die Anfrage nach gleichem Namen gestellt: ?- vorfahrgn(X,Y,Vorname). In Relationenalgebra mit H = G(F ) ∪ H F := π[EN r, KN r, V orname](Elternteil[EN r, KN r] 1 P erson(EN r, EN ame, V orname, EA, EG] 1 P erson(KN r, KN ame, V orname, KA, KG]) H := V orf ahrGN [EN r, KN r, V orname] G(F ) := F H F := π[EN r, KN r, V orname](H[EN r, Z, V orname] 1 F [Z, KN r, V orname]) Aus dem durch H = G(F ) ∪ H F bestimmten Fixpunkt H erhält man die Lösung: F H[EN r, KN r, V orname] Aufgabe 4: Optimieren der seminaiven Iteration In der Vorlesung wurde eine Möglichkeit vorgestellt, die seminaive Iteration mittels Datenbanktabellen zu implementieren. Im vorgestellten Script werden die Zwischenergebnisse nach jedem Schritt von der Tabelle new in die Tabelle delta umkopiert. Durch eine alternierende Verwendung dieser zwei Tabellen lässt sich dieses Kopieren vermeiden. Dabei übernimmt delta die ∆i bei geradem i, die ursprüngliche Tebelle new die ∆i bei ungeradem i. Modi£zieren Sie das in der Vorlesung besprochene Oracle PL/SQL Script entsprechend (Um den Überblick zu bewahren, können Sie die Tabellen zu even und odd umbenennen. Das Original £nden Sie auf der Webseite der Vorlesung http://www.dbs.ethz.ch/isk01/. Testen Sie Ihre Lösung auf Ihrem ISK–Oracle Account. Durch ein Unroll der Schleife erhält mal die Lösung: CREATE TABLE FV_even( von VARCHAR2(20), nach VARCHAR2(20) ); CREATE TABLE FV_odd( von VARCHAR2(20), 5 nach VARCHAR2(20) ); CREATE OR REPLACE VIEW FV_sn_nrec(von,nach) AS SELECT abflug,ziel FROM Flug; CREATE OR REPLACE VIEW FV_sn_rec_even(von,nach) AS SELECT a.von,b.ziel FROM FV_even a, Flug b WHERE a.nach=b.abflug; CREATE OR REPLACE VIEW FV_sn_rec_odd(von,nach) AS SELECT a.von,b.ziel FROM FV_odd a, Flug b WHERE a.nach=b.abflug; DECLARE n INTEGER; BEGIN DELETE FROM FlugVerbindung; DELETE FROM FV_even; INSERT INTO FV_even SELECT * FROM FV_sn_nrec; LOOP INSERT INTO FlugVerbindung SELECT * FROM FV_even; DELETE FROM FV_odd; INSERT INTO FV_odd SELECT * FROM FV_sn_rec_even MINUS SELECT * FROM FlugVerbindung; SELECT COUNT(*) INTO n FROM FV_odd; EXIT WHEN n=0; INSERT INTO FlugVerbindung SELECT * FROM FV_odd; DELETE FROM FV_even; INSERT INTO FV_even SELECT * FROM FV_sn_rec_odd MINUS SELECT * FROM FlugVerbindung; SELECT COUNT(*) INTO n FROM FV_even; EXIT WHEN n=0; END LOOP; END; / show errors; SELECT * FROM FlugVerbindung; 6