Kap. 5 Erweiterung der Relationenalgebra für Deduktive Datenbanken Ziel dieses kurzen Kapitels: – Verbindung herstellen zwischen Logiksprachen und Relationenalgebra. – Umgehen mit (rekursiven) Regeln zusätzlich zu Fakten. – Zulassen von rekursiven Gleichungen in Relationenalgebra – Auflösen solcher Gleichungen = Berechnung von Fixpunkten Wir wissen aus IS-G über die Grenzen von Algebra und SQL: z.B. sind Erreichbarkeitsprobleme in Graphen nicht ausdrückbar. Wie immer ist die explizite Programmierung in SQL eine Abhilfe. Deduktive DB-1 IS-K2001 5.1 Einführung und Problemstellung • In einem nicht deduktiven DBMS werden Informationen ausschließlich extensional in Form von Daten (Fakten) - gespeichert. In einem deduktiven DBMS können Informationen zusätzlich auch intensional - in Form von Regeln - repräsentiert werden. Die Auswertung von Anfragen (eine Form von Inferenz) basiert auf der logischen Deduktion. Im Vergleich zu Prolog bietet ein deduktives DBMS die Dienstleistungen einer Datenbank an (Persistenz, Transaktionen, SQL, …); damit ist die Wissensbasis nicht auf die Grösse des Hauptspeichers begrenzt. • • • Beispiel mit extensionaler Repräsentation Flug FlugNr SR58 AA371 DA77 AA70 AA351 UA111 IS-K2001 Flugverbindung Abflugort Zürich Chicago Phoenix Zürich Dallas Chicago Zielort Chicago Phoenix Flagstaff Dallas Phoenix Dallas ... Abflugort Zürich Zürich Zürich Zürich ... Zielort Chicago Dallas Phoenix Flagstaff ... Deduktive DB-2 • Beispiel mit intensionaler Repräsentation der Flugverbindungen: in SQL99 (rekursive Anfrage): WITH RECURSIVE FlugVerbindung AS (SELECT Abflugort, Zielort FROM Flug UNION SELECT a.Abflugort, b.Zielort FROM FlugVerbindung a, Flug b WHERE a.Zielort = b.Abflugort) SELECT * FROM FlugVerbindung; als Menge von (Prolog-artigen) Regeln: flugverbindung (a,z) :- flug (a,z). flugverbindung (a,z) :- flug (o,z) , flugverbindung (a,o). als relationen-algebraische Gleichung: F=Flug, V=Flugverbindung V = π[Von, Nach] ( F [Nr, Von, Nach] ) ∪ π[Von, Nach] ( F [Nr, Von, Ueber] |×| V [Ueber,Nach] ) Deduktive DB-3 IS-K2001 5.2 Datalog - Hintergrundinformation • Eine deduktive Datenbank enthält Fakten und Regeln: – Fakt: variablenfreie atomare Formel, z.B. flug (sr58,zürich,chicago). – Regel: Formel der From A ⇐ W, wobei A ein Atom ist (=Kopf der Regel) und W eine beliebige Formel (=Körper der Regel). – Typischerweise verwendet man nur normalisierte Regeln, sogenannte Hornklauseln: ∀ X1, ..., Xn: p0 (Z01, ..., Z0k0) ⇐ p1 (Z11, ..., Z1k1)∧ ... ∧ pm (Zm1, ..., Zmkm) mit ki-stelligen Prädikaten pi, Variablen X1, ..., Xn und Argumenten Zij, so dass Zij entweder eine Konstante ist oder eine der Variablen X1, ..., Xn. Eine Hornklausel ist äquivalent zu: ∀ X1, ..., Xn: p0 (Z01, ..., Z0k0) ∨¬ p1 (Z11, ..., Z1k1)∨ ... ∨¬ pm (Zm1, ..., Zmkm) Eine Hornklausel ist also eine Disjunktion von Atomen, wobei höchstens ein nichtnegiertes Atom vorkommen darf. – Ein Fakt kann ebenfalls als Hornklausel geschrieben werden: flug (sr58,zürich,chicago) ⇐ True IS-K2001 (m=0) Deduktive DB-4 • • In Datalog werden Fakten und Regeln analog zu Prolog formuliert: – Fakten: flug(sr58, zürich, chicago). flug(aa371, chicago, phoenix). flug(da371, phoenix, flagstaff). – einfache Regeln: flugVonZuerich(Nr) :- flug(Nr, zürich, _). – rekursive Regeln: flugverb(Von, Nach) :- flug(_, Von, Nach). flugverb(Von, Nach) :- flug(_, Von, Ueber), flugverb(Ueber, Nach). Zur Erinnerung: Schreibweise in Prolog/Datalog – Prädikate werden klein geschrieben, ebenso String-Konstanten – Variablen beginnen mit einem Grossbuchstaben. _ steht für anonyme Variablen, deren Wert nicht weiter benötigt wird (man kann _ mehrfach in einer Regel verwenden, ohne dass implizit der selbe Wert assoziert wird, d.h. vater(_,_) wird auch durch vater(hans,rolf) erfüllt). – Operatoren: , (Komma) steht für UND-Verknüpfung, ; (Semikolon) für ODER; \+ für Negation (z.B. \+vater(rolf)); X\==Y für X ungleich Y – Lesen: vater(rolf) „Rolf ist Vater“ vater(hans,rolf) „Hans ist Vater von Rolf“ Deduktive DB-5 IS-K2001 • Anfragen werden mit einem Widerspruchsbeweis beantwortet: – Anfrage in Prolog: ?- flugVonZuerich(sr58). – Prädikatenlogische False ⇐ flugVonZuerich(sr58) Bedeutung: – In Prolog wird die sogenannte SLD-Resolution verwendet, um einen Widerspruchsbeweis zu führen. D.h. für alle Prädikate der Anfrage werden Regeln oder Fakten gesucht, welche unifiziert werden können. Dabei werden z.T. auch Variablen gebunden. Ausserdem verwendet Prolog Backtracking, um alle möglichen Antworten zu erzeugen. Ziel des Beweises ist es, zu zeigen, dass durch Induktion der Widerspruch False ⇐ True entsteht. Damit wäre die Anfrage erfüllt. Falls dies nicht gelingt, ist das Anfrageprädikat nicht beweisbar. ?- flugVonZuerich(sr58) False ⇐ flugVonZuerich(sr58) False ⇐ flug(sr58,zürich,_) False ⇐ True { flugVonZuerich(Nr) :- flug(Nr, zürich, _). } { flug(sr58, zürich, chicago). } Damit ist der Widerspruchsbeweis gelungen, d.h. das Anfrageprädikat ist erfüllt. In Prolog (sicstus) kann man die Auswertungsstrategie gut verfolgen, wenn man die Trace-Ausgabe (trace. eingeben) aktiviert. IS-K2001 Deduktive DB-6 • Unterschied Datalog <-> Prolog – Keine strukturierten Argumente (z.B. Listen) – Keine oder nur beschränkte Anzahl vordefinierter Funktionssymbole (+,-,*); dadurch kann die Termination der Auswertung garantiert werden. Z.B. terminiert das folgende Prolog-Programm nicht für ?-path(X,Y,L). path(X,Y,1) :- edge(X,Y). path(X,Y,L) :- edge(X,Z), path(Z,Y,L0), L == L0+1. In Datalog möchte man dies verhindern. – Eine deduktive Datenbank sollte typischerweise stratifiziert sein, d.h. ein rekursiv definiertes Prädikat nimmt keinen Bezug auf seine Negation. Also: die Definition von Prädikat p darf \+p nicht enthalten. – Fakten und Regeln müssen bereichsbeschränkt sein. Fakten sind per Definition bereichsbeschränkt; bei Regeln muss jede verwendete Variable bereichsbeschränkt sein, d.h. sie muss in mindestens einem nicht-negierten Prädikat im Körper der Regel vorkommen. In den folgenden Bsp. ist Y jeweils nicht bereichsbeschränkt und somit sind die Regeln nicht zulässig p(X,Y) :- q(X). p(X,Y) :- q(X), X<Y. p(X,Y) :- q(X), \+r(X,Y). Deduktive DB-7 IS-K2001 Beispiel: Adam ♥ Abigail Jonny ♥ Bonnie Bill ♥ Jill Bob Clyde Claire Cerise Charly Cecilia Fakten: mann(adam). mann(jonny). mann(bob). mann(bill). frau(abigail). frau(bonnie). frau(jill). mann(clyde). mann(charly). frau(claire). frau(cerise). frau(cecilia). ehepaar(adam, abigail). ehepaar(jonny, bonnie). ehepaar(bill, jill). elternteil(adam, bonnie). elternteil(abigail, bonnie). elternteil(jonny, clyde). elternteil(bonnie, clyde). elternteil(bill, cerise). elternteil(jill, cerise). elternteil(adam, bob). elternteil(abigail, bob). elternteil(jonny, claire). elternteil(bonnie, claire). elternteil(bill, charly). elternteil(jill, charly). elternteil(adam, bill). elternteil(abigail, bill). IS-K2001 elternteil(bill, cecilia). elternteil(jill, cecilia). Deduktive DB-8 Regeln vater(X,Y) :- mann(X), elternteil(X,Y). mutter(X,Y) :- frau(X), elternteil(X,Y). vorfahr(X,Y) :- elternteil(X,Y). vorfahr(X,Z) :- elternteil(X,Y), vorfahr(Y,Z). geschwister(Y,Z) :- elternteil(X,Y), elternteil(X,Z), Y \== Z. cousine(W,Y) :- geschwister(X,U), elternteil(X,Y), elternteil(U,W), frau(W). selbeGeneration(X,Y) :- ehepaar(X,Y). selbeGeneration(X,Y) :- elternteil(U,X), elternteil(V,Y), selbeGeneration(U,V). Datalog mit Negation: ledig(X) :- mann(X), \+ ehepaar(X,_). ledig(Y) :- frau(Y), \+ ehepaar(_,Y). Beispiele für Anfragen ?- ledig (X). ?- cousine (X, clyde). ?- selbeGeneration (clyde, X). Deduktive DB-9 IS-K2001 5.3 Gleichungen in Relationenalgebra und Berechnung von Fixpunkten • Kleine Zusammenfassung der Relationenalgebra: – Sei {D1, ..., Dm} eine Menge von Wertebereichen. Eine Relation R besteht aus • einem Schema, das eine Menge {A1, ..., An} von Attributen ist, kurz sch(R) = { A1, ..., An}. • jedem Attribut Ai wird ein Wertebereich dom(Ai) aus {D1, ..., Dm} zugeordnet. einer Ausprägung (auch Extension genannt) val(R) ⊆ dom(A1) x … x dom(An). t ∈ val(R) heisst Tupel der Relation R. t.A mit A⊆{ A1, ..., An} bezeichnet ein Tupel, welches nur die Attribute A von t enthält. – Mengenoperationen: Für zwei Relationen R, S mit sch(R) = sch(S) Vereinigung R ∪ S: Durchschnitt R ∩ S: Differenz R - S: – val(R ∪ S) = {t | t ∈ val(R) ∨ t ∈ val(S)} val(R ∩ S) = {t | t ∈ val(R) ∧ t ∈ val(S)} val(R - S) = {t | t ∈ val(R) ∧ t ∉ val(S)} Selektion σ (Filterung, Auswahl von Tupeln): Sei F eine Boolesche Formel über den Attributen einer Relation R und beliebigen Konstanten. Dann selektiert σ[F](R) genau jene Tupel von R, welche F erfüllen: sch(σ[F](R)) = sch(R) val(σ[F](R)) = {t | t ∈ R ∧ F(t)} IS-K2001 wobei F(t) bedeutet, dass t die Bedingung F erfüllt. Deduktive DB-10 – Projektion π (Auswahl von Spalten): Sei A ⊆ sch(R) eine Teilmenge der Attribute einer Relation R. Das Resultat einer Projektion π[A](R) auf der Relation R ist wie folgt definiert: sch(π[A](R)) = A val(π[A](R)) = {t | ∃ r ∈ val(R): t.A = r.A} Achtung: Die Projektion beinhaltet eine Duplikateliminierung. – Natural Join |×| (Natürlicher Verbund, Verbindung zweier Relationen über gleiche Attributnamen und gleiche Attributwerte der Tupel): Seien R, S Relationen mit Schemata A=sch(R) und B=sch(S). Das Resultat des Joins R |×| S ist wie folgt definiert: sch(R|×|S) = sch(R) ∪ sch(S) val(R|×|S) = {t | ∃ r ∈ val(R) ∃ s ∈ val(S): t.A = r.A ∧ t.B = s.B} – Umbennung von Attributen: Sei die Relation Ehepaar(MN,FN) gegeben. • Ehepaar steht für die Relation mit den Attributen MN und FN. • Ehepaar[Mann,Frau] steht für die gleiche Relation, aber die Attribute heissen nun Mann und Frau. • Mit solchen Umbennungen kann man einen Natural Join zwischen zwei Relationen erzwingen, auch wenn die Attribute der Relationen ursprünglich unterschiedlich benannt waren. Deduktive DB-11 IS-K2001 Datalog -> Relationenalgebra • Fakten und Regeln in Datalog lassen sich sehr leicht auch mit Hilfe der Relationenalgebra ausdrücken. Die Fakten werden in Extensionen gespeichert, wobei für jedes Prädikat mit Faktenbestandteil eine eigene Relation definiert wird. Mann Ehepaar • IS-K2001 MN Adam Jonny Bob MN Adam Jonny Bob ... FN Abigail Bonnie Jill Frau Elternteil FN Abigail Bonnie Jill ... E Adam Adam Abigail ... K Bonnie Bob Bonnie Datalog Regeln lassen sich mit relationen-algebraischen Ausdrücken formulieren. Dabei muss allerdings zwischen rekursiven und nicht-rekursiven Prädikaten unterschieden werden. Deduktive DB-12 • Darstellung von nicht-rekursiven Prädikaten: – vater(X,Y) :- mann(X), elternteil(X,Y). Vater(X,Y) := Mann[X] |×| Elternteil[X,Y] – mutter(X,Y) :- frau(X), elternteil(X,Y). Mutter(X,Y) := Frau[X] |×| Elternteil[X,Y] – geschwister(Y,Z) :- elternteil(X,Y), elternteil(X,Z), Y \== Z. Geschwister(Y,Z) := π[X,Y] ( σ[Y<>Z] ( Elternteil[X,Y] |×| Elternteil[X,Z] ) ) – cousine(W,Y) :- geschwister(X,U), elternteil(X,Y), elternteil(U,W), frau(W). Cousine(W,Y) := π[W,Y] ( Geschwister(X,U) |×| Elternteil[X,Y] |×| Elternteil[U,W] |×| Frau(W) ) Deduktive DB-13 IS-K2001 • Wie aber können rekursive Prädikate umgesetzt werden? – Versuch: wie nicht-rekursive Prädikate: vorfahr(X,Y) :- elternteil(X,Y). vorfahr(X,Z) :- elternteil(X,Y), vorfahr(Y,Z). Vorfahr(X,Y) = Elternteil(X,Y) ∪ π[X,Y] ( Elternteil(X,Y) |×| Vorfahr(Y,Z) ) IS-K2001 – Offensichtliches Problem: Vorfahr(X,Y) ist rekursiv definiert; aber wie bestimmt man nun die Extension der Relation Vorfahr? • Dazu muss man den sogenannten Fixpunkt von Vorfahr(X,Y) berechnen, so dass die linke Seite identisch mit der rechten Seite der Gleichung wird. Allg. interessiert uns der kleinste Fixpunkt von Vorfahr. – Allgemeine Notation: • Ein rekursives Prädikat kann allg. in einen nicht-rekursiven Teil und einen rekursiven Teil zerlegt werden. In unseren Datalog Beispielen bildet häufig eine Faktentabelle den nicht-rekursiven Teil (z.B. Elternteil); der rekursive Teil entsteht meist durch Komposition der Faktentabelle mit dem zu definierenden Prädikat (z.B. Elternteil |×| Vorfahr) Deduktive DB-14 • Allgemeine Vorgehensweise bei rekursiven Prädikaten: – Identifikation des nicht-rekursiven Teils. Sei G(F) ein relationen-algebraischer Ausdruck über der Faktenrelation F, der diesen Teil erzeugt. – Bestimmung des rekursiven Teils. Dieser setzt sich meist aus einer Komposition (join) der zu definierenden Relation H und der Faktenrelation F zusammen. – Damit lautet die Fixpunktgleichung für die Relation H: H = G(F) ∪ H ⊗ F – • Die Erweiterung auf mehrere Faktenrelationen ist einfach. Bestimmung des Fixpunktes resp. Berechnung der Extension von H: – Wie in der numerischen Mathematik lösen wir diese Gleichung iterativ: – Naive Iteration H0 := {}; i := 0; repeat i := i+1; Hi := G(F) ∪ Hi-1 ⊗ F; until Hi = Hi-1; Deduktive DB-15 IS-K2001 Naive Iteration am Einstiegsbeispiel: Datalog: flug(sr58,zuerich,chicago). flug(da77,phoenix,flagstaff). flug(aa351,dallas,phoenix). flug(aa371,chicago,phoenix). flug(aa70,zuerich,dallas). flug(ua111,chicago,dallas). flugverb(Von, Nach) :- flug(_, Von, Nach). flugverb(Von, Nach) :- flug(_, Von, Ueber), flugverb(Ueber, Nach). Relationenalgebra: Flug(Nr,Abflug,Ziel) = { <SR58, z,c>, <AA371, c,p>, <DA77, p,f>, <AA70, z,d>, <AA351, d,p>, <UA111, c,d> } FlugVerb: F := Flug H := FlugVerb G(F) := π[Von, Nach] ( F [Nr, Von, Nach] ) H⊗F := π[Von, Nach] ( F [Nr, Von, Ueber] |×| H [Ueber,Nach] ) Naive Auswertung: H = G(F) ∪ H ⊗ F IS-K2001 i Hi 0 1 2 3 4 { } { <z,c>, { <z,c>, { <z,c>, { <z,c>, <c,p>, <c,p>, <c,p>, <c,p>, <p,f>, <p,f>, <p,f>, <p,f>, <z,d>, <z,d>, <z,d>, <z,d>, <d,p>, <d,p>, <d,p>, <d,p>, <c,d> } <c,d>, <z,p>, <c,f>, <d,f> } <c,d>, <z,p>, <c,f>, <d,f>, <z,f> } <c,d>, <z,p>, <c,f>, <d,f>, <z,f> } Deduktive DB-16 • Der naive Algorithmus berechnet im i-ten Durchgang nochmals das Resultat des (i-1)-ten Durchgangs. Diese unötigen Operationen können mittels des semi-naiven Algorithmuses verhindert werden. – Das Ziel ist, nur jene Tupel zu berechnen, welche beim Schritt von i zu i+1 neu entstehen können. – Setze für i=1,2,... : Hi = Hi-1 ∪ Di – Ferner muss gelten: (A ∪ B) ⊗ F = A ⊗ F ∪ B ⊗ F Hi+1 = G(F) ∪ Hi ⊗ F = G(F) ∪ ((Hi-1 ∪ ∆i) ⊗ F) = G(F) ∪ (Hi-1 ⊗ F) ∪ (∆i ⊗ F) ∪ (∆i ⊗ F) = Hi ∪ (∆i ⊗ F - Hi) = Hi ∆i+1 = ∆i ⊗ F - Hi – Delta-Iteration (semi-naive Auswertung) H0 := {}; ∆1 := G(F); i := 0; repeat i := i+1; Hi := Hi-1 ∪ ∆i; ∆i+1 := ∆i ⊗ F - Hi; until |∆i+1| = 0; Deduktive DB-17 IS-K2001 Semi-naive Iteration am Einstiegsbeispiel: i=0 IS-K2001 H0 = { } 1 H1 = { <z,c>, <c,p>, <p,f>, <z,d>, <d,p>, <c,d> } ∆1 = { <z,c>, <c,p>, <p,f>, <z,d>, <d,p>, <c,d> } 2 H2 = { <z,c>, <c,p>, <p,f>, <z,d>, <d,p>, <c,d>, <z,p>, <c,f>, <d,f> } ∆2 = { <c,f>, <d,f>, <z,p> } 3 H3 = { <z,c>, <c,p>, <p,f>, <z,d>, <d,p>, <c,d>, <z,p>, <c,f>, <d,f>, <z,f> } ∆3 = { <z,f> } 4 ∆4 = { } Deduktive DB-18 Vergleich Datalog mit Relationenalgebra Sätze: 1) Die Menge der Anfragen, die sich mit (rekursivem) Datalog mit Negation ausdrücken lassen, ist eine echte Obermenge der Menge von Anfragen, die sich mit der Relationenalgebra ausdrücken lassen. Datalog mit Negation Relationenalgebra = Nicht-rekursives Datalog mit Negation 2) Nichtrekursives (sicheres) Datalog mit Negation ist äquivalent zur Relationenalgebra 3) Nichtrekursives Datalog ohne Negation ist äquivalent zur Relationenalgebra ohne Differenz. Datalog ohne Negation (ohne Beweise, siehe dazu z.B. Ullman) RA ohne Differenz = Nicht-rekursives Datalog ohne Negation Deduktive DB-19 IS-K2001 5.3 Implementierung einer deduktiven Datenbank mit SQL • Prolog eignet sich nur bedingt für deduktive Datenbanken – Wissensbasis beschränkt durch Hauptspeicher – Keine Unterstützung für Performance, Persistenz, Concurrency Control, Recovery, Integritätskontrolle, Datenunabhängigkeit... – Häufig liegen die Daten in einer relationalen Datenbank und können nur umständlich nach Prolog exportiert werden. • Idee: Abbildung von Datalog auf SQL-Schnittstelle analog zur Abbildung von Datalog auf die Relationenalgebra – Für jedes Prädikat mit Faktenbestandteil wird ein Tabelle angelegt. Z.B.: CREATE TABLE Flug ( flugNr VARCHAR2(6) PRIMARY KEY, abflug VARCHAR2(20), ziel VARCHAR2(20) ); INSERT INSERT INSERT INSERT INSERT INSERT IS-K2001 INTO INTO INTO INTO INTO INTO Flug Flug Flug Flug Flug Flug VALUES VALUES VALUES VALUES VALUES VALUES ('SR58','Zürich','Chicago'); ('AA371','Chicago','Phoenix'); ('DA77','Phoenix','Flagstaff'); ('AA70','Zürich','Dallas'); ('AA351','Dallas','Phoenix'); ('UA111','Chicago','Dallas'); Deduktive DB-20 – Für Prädikate, welche über nicht-rekursive Regeln definiert sind, definiert man eine View. Bsp: • jusiva(X,N) :- father(X), age(X,N), \+married(X), N<25. CREATE VIEW SELECT FROM WHERE AND jusiva(Name, Age) AS f.Name,a.Age father f,age a f.Name=a.Name NOT EXISTS (SELECT * FROM married m WHERE m.Name=f.Name) AND a.Age<25; – Prädikate, die über rekursive Regeln definiert sind, müssen mittels Fixpunktiteration berechnet werden. Hierzu gibt es zwei Ansätze: • Materialisierte Prädikate: Zur Gewährleistung der Korrektheit können Triggers auf den Basisrelationen verwendet werden. Nach Änderungen in den Basisrelationen kann entweder ein neuer Fixpunkt berechnet werden (teuer, dafür einfach zu implementieren) oder der Fixpunkt wird inkrementell angepasst (billig, aber kompliziert [z.B. Löschen]) • Materialisierung der Anfrage: Die vollständige Materialisierung eines Prädikats kann unter Umständen unerwünscht sein (zu grosse Datenmenge). Stattdessen wird der Fixpunkt für jede Anfrage (mit genügend starken Einschränkungen, z.B. Flüge von Zürich) einzeln berechnet. Die Methoden sind dann dieselben wie bei der Materialisierung. Deduktive DB-21 IS-K2001 – Naive Iteration in SQL (Flugbeispiel) • Ausgangslage: Faktentabelle Flug (siehe 2 Folien vorher). Zusätzlich benötigen wir für die Materialisierung ein Tabelle für die Flugverbindungen: CREATE TABLE FlugVerbindung( von VARCHAR2(20), nach VARCHAR2(20) ); • Für die rekursive Regel flugverb(Von, Nach) :- flug(_, Von, Nach). flugverb(Von, Nach) :- flug(_, Von, Ueber), flugverb(Ueber, Nach). wird jeweils eine View für den nicht-rekursiven und den rekursiven Teil der Regel definiert. CREATE VIEW FV_nrec(von,nach) AS SELECT abflug,ziel FROM Flug; CREATE VIEW SELECT FROM WHERE IS-K2001 FV_rec(von,nach) AS a.von,b.ziel FlugVerbindung a, Flug b a.nach=b.abflug; Deduktive DB-22 • Letztlich wird der Fixpunkt mit einem SQL Skript gemäss naiver Iteration berechnet (hier: Oracle PL/SQL Syntax): DECLARE last INTEGER; n INTEGER; BEGIN last:=-1; DELETE FROM FlugVerbindung; INSERT INTO FlugVerbindung SELECT * FROM FV_nrec; LOOP SELECT COUNT(*) INTO n FROM FlugVerbindung; EXIT WHEN last=n; last:=n; INSERT INTO FlugVerbindung SELECT * FROM FV_rec MINUS SELECT * FROM FlugVerbindung; END LOOP; END; / – Semi-naive Iteration in SQL (Flugbeispiel) • Die semi-naive Iteration benötigt zwei zusätzliche, temporäre Tabellen zur Berechnung und Speicherung der ∆i Mengen. CREATE TABLE FV_delta( von VARCHAR2(20), nach VARCHAR2(20) ); CREATE TABLE FV_new( von VARCHAR2(20), nach VARCHAR2(20) ); Deduktive DB-23 IS-K2001 • Die View für den rekursiven Teil der Regel muss angepasst werden: CREATE FV_sn_rec(von,nach) AS SELECT a.von,b.ziel FROM FV_delta a, Flug b WHERE a.nach=b.abflug; • Der Fixpunkt kann mit folgendem SQL Skript gemäss semi-naiver Iteration bestimmt werden (hier: Oracle PL/SQL Syntax): DECLARE n INTEGER; BEGIN DELETE FROM FlugVerbindung; DELETE FROM FV_delta; INSERT INTO FV_delta SELECT * FROM FV_nrec; LOOP INSERT INTO FlugVerbindung SELECT * FROM FV_delta; DELETE FROM FV_new; INSERT INTO FV_new SELECT * FROM FV_sn_rec MINUS SELECT * FROM FlugVerbindung; SELECT COUNT(*) INTO n FROM FV_new; EXIT WHEN n=0; DELETE FROM FV_delta; INSERT INTO FV_delta SELECT * FROM FV_new; END LOOP; END; / IS-K2001 Deduktive DB-24 – Anfragen können schliesslich als SELECT Anweisung über Faktentabellen, Views für nicht-rekursive Prädikate und/oder materialisierte Fixpunkte formuliert werden. • ?- parent(X, laura). SELECT FROM WHERE • ?- flugVonZuerich(sr58). SELECT FROM WHERE – p.Parent parent p p.Child=‘Laura’; COUNT(*) flugVonZürich f f.Nr=‘SR58’; SQL99 lässt zudem ein Mischform von Definition und Anfrage von rekursiven Prädkaten zu. WITH RECURSIVE FlugVerbindung AS (SELECT Abflugort, Zielort FROM Flug UNION SELECT a.Abflugort, b.Zielort FROM FlugVerbindung a, Flug b WHERE a.Zielort = b.Abflugort) SELECT * FROM FlugVerbindung; IS-K2001 Deduktive DB-25 Literatur • • • • J.D. Ullman. Principles of Database and Knowledge-Base Systems, Volume II: The New Technologies. Computer Science Press, 1989. A.B. Cremers, U. Griefahn, R. Hinze. Deduktive Datenbanken, Vieweg, 1994. S. Ceri, G. Gottlob, L. Tanca. Logic Programmin and Databases, Springer, 1990. J.W. Lloyd. Foundations of Logic Programming. Springer, 1987. Links • • SBB, Fahrplanauskunft, http://www.sbb.ch/. Airlines of the Web, Quick Reservations Check, http://www.flyaow.com/. IS-K2001 Deduktive DB-26