9. Weitere Datenbanksprachen ■ Objektorientierte Anfragesprachen (OQL) ■ Objektrelationale SQL-Erweiterungen (SQL:1999) ■ XML-Anfragesprachen (XQuery) ■ Regelbasierte Anfragesprachen (Datalog) OQL - Anfragesprache der ODMG ■ OQL as objektorientierte, deklarative Anfragesprache (basierend auf O2 SQL) ■ SQL-Subset + Nutzung von Objektidentitäten, Pfadausdrücken, Methoden und komplex strukturierten Werten ◆ Anfragen auf Mengen (z.B. Extensionen) und beliebigen Kollektionen ◆ ■ Anfrage mit relationaler, objekterhaltender und objektgenerierender Semantik ■ eingeschränkte Unterstützung in kommerziellen Systemen VL Datenbanken I – 9–1 Objektanfragen mit OQL ■ SFW-Block ■ Namen von atomare, strukturierten oder mengenwertigen Objekten/Werten ■ Beispiele: select * from Mitarbeiter VL Datenbanken I – 9–2 SFW-Block ■ Mitarbeiter Mitarbeiter.ist_beteiligt_an VL Datenbanken I – 9–3 select-Teil ◆ Aufruf von Methoden und Unterfragen möglich ◆ Konstruktion komplexer Ergebnistypen ◆ distinct für Mengensemantik ◆ Beispiel: select distinct struct (m.name, projekte:( select p.projektID from m.ist_beteiligt_an p)) from Mitarbeiter m Ergebnistyp: set<struct<name: string, projekte: bag<long>>> VL Datenbanken I – 9–4 SFW-Block (II) ■ SFW-Block (III) from-Teil ◆ Angabe einer Objekt oder Wertekollektion als Klassenextension, mengenwertiges Referenzattribut, komplexes Attribut, Ergebnis eines Methodenaufrufs oder Unterabfrage ◆ automatische Umwandlung von list und array nach bag ◆ Beispiel select m.name from (select p.wird_geleitet_von from Projekt p where p.status = "abgeschlossen") m where m.gehalt > 9000 ■ where-Teil: ◆ Boolescher Ausdruck ◆ auch Unterabfrage möglich VL Datenbanken I – 9–5 VL Datenbanken I – 9–6 Pfadausdrücke (II) Pfadausdrücke ■ Anfrage kann Pfadausdrücke beinhalten ■ Beispiel (vollständige Anfrage) p.wird_geleitet_von.name ■ Einschränkung: Zwischenelemente des Pfads müssen einelementige Referenzen sein ■ daher nicht erlaubt: p.beteiligt.name Statt dessen: select m.name from p.beteiligt m ■ VL Datenbanken I – 9–7 Mehrere mengenwertige Referenzen innerhalb eines Pfads: select prod.bezeichnung from m.ist_beteiligt_an proj, proj.zugordnet prod VL Datenbanken I – 9–8 Bedeutung von Anfrageergebnissen Bedeutung von Anfrageergebnissen (II) ■ Relationale Semantik (bisherige Beispiele) ■ Objekterhaltende Semantik ■ Objektgenerierende Semantik ■ Objekterhaltende Semantik ■ Resultat einer objekterhaltenden Anfrage ist Objektkollektion oder einzelnes Objekt, z.B. Verwendung von Mengenoperationen ■ Problem: Keine Aussagen über Berechnung des Ergebnistyps bei heterogenen Eingabetypen Konstrukteur union Arbeitsplaner ■ einfache Selektion als objekterhaltende Anfrage berechnet Objektkollektion select p from Projekt p where status = "abgeschlossen" VL Datenbanken I – 9–9 Objekterhaltende Semantik VL Datenbanken I – 9–10 Objektgenerierende Semantik Berechnung eines einzelnen Objektes aus einelementiger Objektkollektion mittels element: element (select p from Projekt p where projektID = 4711) ■ Anfrage generiert neue Objekte ; Konstruktor muss aufgerufen werden ■ Konstruktor legt vordefinierten Typ fest (keine dynamische Typkonstruktion, keine dynamische Einordnung in Spezialisierungshierarchie) ■ Typ einer Anfrage (ohne Mengenoperationen) wird durch Tupelvariable nach dem select festgelegt ■ Erzeugung neuer OID (kein Zusammenhang zu existierenden OID) ■ jedoch explizite Typumwandlung möglich: select (Mitarbeiter) k from Konstrukteur k ■ Objekterhaltende Semantik: Probleme → Typumwandlung folgt nicht Regeln der Substituierbarkeit ■ VL Datenbanken I – 9–11 VL Datenbanken I – 9–12 Objektgenerierende Semantik ■ ■ Weitere Konzepte Anfrage als Konstruktoraufruf: Produkt (produktNr: 0815, bezeichnung: "VW Beetle", status:"ist_fertiggestellt", masse:1390) Anfrage als SFW-Block: select Fertigungsteil( produktNr: p.produktNr, bezeichnung: p.bezeichnung, status: p.status, masse: p.masse, kosten: 1359) from Produkt p where status = ïn_Arbeit" ■ Verbund-Operation analog SQL ■ oft durch Pfadausdrücke ersetzbar ■ Quantoren (for all und exists) sind OQL-Funktionen ■ Kollektionswert und logischer Ausdruck (eine freie Variable) als Parameter und boolescher Rückgabewert ■ Beispiel: exists p in Projekt: p.status = "abgeschlossen" ■ logischer Ausdruck auch als Unteranfrage ■ Sortierung (order by) ähnlich SQL ; Ergebnis ist jedoch eine Liste VL Datenbanken I – 9–13 Gruppierung Aggregatfunktionen ■ Gruppierung (group by): immer an SFW-Block gebunden ■ Gruppierung auch nach mehreren Attributen möglich ■ Angabe einer having-Klausel möglich ■ Ergebnis ist komplexer Typ: select p from Projekt p group by status Ergebnistyp: set<struct<status: enum(...), partition: bag<projekt>>> ■ VL Datenbanken I – 9–14 ■ Aggregatfunktionen (min, max, sum, count und avg): Funktionen auf Kollektionen mit entsprechendem Rückgabetyp max (select gehalt from Mitarbeiter) ■ alternative Anfrage in SQL-Syntax: select max(gehalt) from Mitarbeiter ■ Operationen auf Kollektionstypen ◆ listtoset wandelt Liste in Menge um ◆ flatten vereinfacht geschachtelte Mengen: { {1, 2}, {3, 5} } wird zu { 1, 2, 3, 5 } auf Partitionierung kann innerhalb having-Klausel zugegriffen werden VL Datenbanken I – 9–15 VL Datenbanken I – 9–16 Benannte Anfragen OQL: Zusammenfassung ■ Benannte Anfragen (define as): Vereinfachung von Anfragen ■ Orthogonalität durch funktionale Ausrichtung der Sprache ■ rudimentäres Sichtkonzept ■ ■ Beispiel define ChefProjekte as select p from Mitarbeiter m, m.leitet p where name = "Gates" Mächtigkeit des Objektmodells wird nicht voll ausgenutzt wegen ◆ keine Zuordnung von Ergebnissen zu Klassen ◆ keine Einordnung in Spezialisierungshierarchie ■ Typprobleme aufgrund expliziter Typumwandlung ■ keine formale Semantikdefinition ■ Anwendung: select p from ChefProjekte d, d.zugeordnet p order by status VL Datenbanken I – 9–17 SQL:1999 ■ ■ VL Datenbanken I – 9–18 Neue Prädikate aktuelle Version des ISO-Standards ◆ objektrelationale Konzepe ◆ aktive Datenbanken / Trigger ◆ Programmiersprachen-Anbindung (u.a. Java, prozedurale SQL-Erweiterungen) ◆ Erweiterungen für Text-, Image- und Spatial-Daten ◆ Zugriff auf externe Daten ca. 3800 Seiten, keine vollständige Implementierung VL Datenbanken I – 9–19 ■ similar: Erweiterung von like um reguläre Ausdrücke ◆ ◆ ◆ ◆ ◆ ◆ | für log. Oder + ein- oder mehrfaches Auftreten * 0- oder mehrfaches Auftreten [abc] a oder b oder c [:DIGIT:] für Ziffern, [:ALPHA:] für Zeichen, . . . Beispiel: attrib similar to ’(SQL-(86|89|92|99))|(SQL(1|2|3))’ VL Datenbanken I – 9–20 Operationen auf array-Typen Neue Prädikate (II) ■ distinct from: Tupelvergleich mit Nullwerten ◆ korrespondierende Nullwerte zweier Tupel werden als gleich angesehen ◆ Beispiele: (1,2,3) is distinct from (1, 2, 3) -- false (1, 2, null) is distinct from (1, 2, 3) -- true, siehe <> (1, 2, null) is distinct from (1, 2, null) -- false, <> ; unknown ■ Erzeugung von array-Werten über Arraykonstruktor insert into Bücher (titel, isbn, autoren) values (’Datenbanken’, ’3-8266...’, Array[’Heuer’, ’Saake’]); update Bücher set autoren = Array[’Heuer’, ’Saake’] where isbn = ’3-8266...’; ■ direkter Zugriff über Index select titel, autoren[1] from Bücher; ■ Entschachtelung select a from Bücher, unnest(autoren) a; VL Datenbanken I – 9–21 Operationen auf array-Typen (II) VL Datenbanken I – 9–22 Nutzerdefinierte Datentypen (UDT) Erzeugen von Instanzen ■ Konkatenation über || ■ Anzahl der Elemente über Funktion cardinality ◆ Vergleiche mit <>, <, >, = etc. ◆ ■ ■ ■ Nutzung des Default-Konstruktors Typname() Definition + Nutzung eines überladenen Konstruktors insert into Kunden values (123, ’Müller’, Adresse(’Von-Seckendorff-Platz’, ’06120’, ’Halle/S.’)); Zugriff auf Attribute (Komponenten) Funktionsaufrufe: attribut(obj) select * from Kunden where plz(lieferadresse) = ’06120’; ◆ Punktnotation: obj.attribut select * from Kunden where lieferadresse.plz = ’06120’; ◆ VL Datenbanken I – 9–23 VL Datenbanken I – 9–24 Operationen auf Referenztypen ■ Operationen auf Referenztypen (II) Dereferenzierung (Verfolgen von ref-Verweisen) über ◆ deref-Operator (liefert Attributwerte des referenzierten Objektes) select deref(leiter) from Abteilungen; ◆ Pfeiloperator select name, vorgesetzter->name from Angestellte; ; impliziter Join ! ■ Belegung von Referenzen über Anfragen nach OID update Abteilungen set leiter = (select oid from Angestellte where name = ’Murphy’) where name = ’XP Qualitätskontrolle’; VL Datenbanken I – 9–25 Typprädikate und Typanpassung ■ VL Datenbanken I – 9–26 Umgang mit Tabellenhierarchien Test auf Typzugehörigkeit objekt is [not] of (typ-liste) ■ liefert true, wenn typ-liste einen Typ (inkl. Subtypen) von objekt enthält ◆ Beschränkung auf direkten Typ durch only: pers is of (only (Person)) ◆ ■ Typanpassung ◆ zum Supertyp: (obj as supertypname) ◆ zu einem Subtyp: treat(obj as subtypname) VL Datenbanken I – 9–27 Definition von Tabellenhierarchien create type PersonenTyp ( ...) not final; create type MitarbeiterTyp under PersonenTyp ( ...) not final; create table Personen of PersonenTyp; create table Mitarbeiter of MitarbeiterTyp under Personen; ■ Einfügeoperationen werden an Supertabellen propagiert (Mitarbeiter → Personen) ■ Löschoperationen sowohl auf Super- als auch Subtabellen VL Datenbanken I – 9–28 Umgang mit Tabellenhierarchien (II) ■ ■ Rekursion Zugriff auf Tabellenhierarchien: per Default Behandlung tiefer Extensionen ◆ alle Personen und Mitarbeiter select * from Personen; ◆ alle Mitarbeiter inkl. der Attribute von Personen select * from Mitarbeiter; ■ Anwendung: Bill of Material-Anfragen, Berechnung der transitiven Hülle (Flugverbindungen etc.) ■ Ansatz: benannte Anfragen mit with-Klausel (wiederverwendbare Tabellenausdrücke) with anfr-name as ( SFW-Block ) SFW-Block-über-anfr-name flache Extensionen durch only ◆ Personen, die keine Mitarbeiter sind select * from only(Personen); ■ Rekursion: with recursive rekursive-tabelle as ( select ... from tabelle ... union select ... from tabelle, rekursive-tabelle ...) select ... from rekursive-tabelle where ... VL Datenbanken I – 9–29 Rekursion: Beispiel maschine baugruppe Auto Motor Motor Motor Getriebe ... VL Datenbanken I – 9–30 Rekursion: Beispiel (II) bauteil anzahl teil_kosten Motor 1 5356 Kolben 4 124 Kurbelwelle 1 89 Getriebe 1 560 Kupplung 1 290 ... ... ... VL Datenbanken I – 9–31 with recursive teileliste (btnr, menge, kosten) as (select bauteil, 1, 0.00 from maschine where baugruppe = ’Auto’ union all select m.bauteil, m.anzahl, m.anzahl * m.teil_kosten from teileliste t, maschine m where t.bauteil = m.baugruppe) select btnr, sum(menge), sum(kosten) from teileliste group by btnr; VL Datenbanken I – 9–32 Rekursion: Aspekte ■ Rekursion: Aspekte (II) Berechnung: Breitensuche vs. Tiefensuche ■ bestimmt Ausgabeordnung ◆ explizite Angabe möglich: with recursive ... search breadth | depth first by attrib-liste set ordng-spalte select ... from ... order by ordng-spalte Zyklenerkennung: Endlichkeit des Anfrageergebnisses cycle attrib set cyclemark to ’Y’ default ’N’ using cyclepath ◆ beim Erkennen von Duplikaten im Berechnungspfad von attrib: cyclemark = ’Y’ ◆ Sicherstellen der Endlichkeit des Ergebnisses „von Hand“ ◆ VL Datenbanken I – 9–33 XML-Anfragesprachen SQL:1999 und Oracle9i ■ VL Datenbanken I – 9–34 Besonderheiten in Oracle9i ◆ Entschachtelung über table select a from Bücher, table(autoren) a; ◆ Referenzwerte über ref select ref(a) from angestellte; ◆ rekursive Anfragen → hierarchische Anfragen mittels connect by select bauteil, sum(teil_kosten), sum(anzahl) from maschine start with baugruppe = ’Auto’ connect by prior bauteil = baugruppe group by bauteil; VL Datenbanken I – 9–35 ■ Anforderungen und Basisoperationen ■ XPath ■ XQuery ■ SQL/XML VL Datenbanken I – 9–36 XML-Anfragesprachen: Anforderungen XML-Anfragesprachen: Basisoperationen von Anfragen in XML-Dokumente (XML-Syntax von Anfragen, XML-Fragmente in Anfragen) Selektion: Verarbeitung von Anfragen auf Server-Seite; erfordert Abgeschlossenheit, Kontextfreiheit ; Unabhängigkeit vom Verarbeitungsort Extraktion: Einbettung: Server-Verarbeitung: Ordnung der XML-Elemente muss erhalten bleiben (Schachtelungsreihenfolge, Reihenfolge der Textelemente) Auswahl eines Dokument(fragmentes) anhand von Inhalt, Struktur, Attribut Extraktion ausgewählter Subelemente (Einschränkung der Elementstruktur) Zusammenfassen mehrerer Elemente zu einer neuen Elementstruktur Kombination/Verbund: Ordnungserhaltung: Unterstützung von Hypertextstrukturen (XLink, XPointer, ID/IDREF) Erzeugung neuer Elemente als Anfrageergebnis durch Transformation der Quellelemente (neue DTD) Restrukturierung: Hyperlinks: Aggregation, Gruppierung, Sortierung, Volltextsuche . . . Unterstützung unterschiedlicher Datentypen (XML Schema), explizite Typkonvertierung Flexible Typen: VL Datenbanken I – 9–37 XPath VL Datenbanken I – 9–38 XPath: Datenmodell ■ Sprache zur Adressierung von Dokumentfragmenten ■ Teil von XSLT und XQuery ◆ Bestandteile: ◆ ■ Ausdrücke zur Selektion von Dokumentteilen ◆ Operationen und Funktionen ◆ ■ Nicht-XML-Syntax ■ keine vollständige Anfragesprache (nur Selektion/Extraktion) VL Datenbanken I – 9–39 ■ XML-Dokument als DOM-Baum mit Knoten für XML-Elemente Kanten für Elementbeziehungen ■ Knotenarten: Wurzelknoten, Elementknoten (verweisen auf Subelemente, Attributknoten, Textknoten), Kommentarknoten ■ Datentypen: atomare Werte (Strings, Boolean-Werte, Gleitkommazahlen), Knotenmengen VL Datenbanken I – 9–40 XPath: Pfadausdrücke XPath: Schritte ■ bestehen aus Schritten ■ Schritte getrennt/gekoppelt durch „/“ Notation für Schritt: axis::node-test[predicate] ■ Abarbeitung von links nach rechts ◆ ■ Schritt liefert Knotenmenge oder Wert ■ absoluter Pfad beginnend bei Wurzelelement (vorangestelltes „/“) ■ relativer Pfad in Abhängigkeit vom Kontextknoten (ohne „/“) ■ Beispiele: /buch/titel /buch/autor/nachname autor ■ axis: Beziehung zwischen Kontextknoten und zu selektierenden Knoten (Achse) ◆ node-test: Festlegung des Knotentyps und des Namens der zu selektierenden Knoten ◆ predicate: Prädikat zur Einschränkung der Knotenmenge VL Datenbanken I – 9–41 XPath: Achsen VL Datenbanken I – 9–42 XPath: Knotentests ancestor ■ Einschränkung auf bestimmte Knotentypen ◆ node(): wahr für alle Knoten ◆ text(): wahr für alle Textknoten ◆ *: wahr für alle Elementknoten ◆ qname: wahr wenn der Knotenname gleich qname ■ Beispiele: ◆ descendant::* alle untergeordneten Elemente zum Kontextknoten ◆ child::autor alle Subelement vom Typ autor ◆ attribute::id Attribut id des Kontextknotens ◆ parent::* Vaterknoten following preceding self following sibling preceding sibling descendent child VL Datenbanken I – 9–43 VL Datenbanken I – 9–44 Selektionsprädikate und Funktionen XPath: Verkürzte Schreibweise ■ Kurzschreibweise ◆ ◆ ◆ ◆ ◆ ◆ @ für attribute:: . für self::node() .. für parent::node() child:: ist Standardachse // für /descendant-or-self::node()/ [n] bezeichnet n-tes Element aus der Liste der Knoten ■ Prädikate ◆ Vergleichsoperatoren: <, <=, etc. ◆ logische Operatoren: and, or ◆ arithmetische Operatoren: +, *, -, div ■ Funktionen ◆ contains (str, substr): Test auf Teilzeichenkette ◆ last (): Position des letzten Elementes im Kontext ◆ position (): aktuelle Position im Kontext ■ Beispiele /buch[@isbn = ’1-55860-622-X’] /buch/autor[1]/nachname VL Datenbanken I – 9–45 XQuery VL Datenbanken I – 9–46 XQuery: FLWR-Ausdrücke ■ funktionale Anfragesprache für XML ■ vergleichbar zum SFW-Block in SQL ■ beliebig kombinierbare/verschachtelbare Ausdrücke ◆ XPath-Pfadausdrücke ◆ Elementkonstruktoren ◆ Funktionsaufrufe (Standardfunktionen, nutzerdefinierte Funktionen) ◆ bedingte Ausdrücke, quantifizierte Ausdrücke ◆ datentypspezifische Operationen ◆ FLWR-Ausdrücke ■ Notation (FOR-Ausdruck | LET-Ausdruck )+ [ WHERE Ausdruck ] RETURN Ausdruck mit FOR-Ausdruck ::= FOR $var IN Ausdruck LET-Ausdruck ::= LET $var := Ausdruck ■ Datenmodell: Erweiterungen des XPath-Modells um Sequenzen: geordnete Mengen von Knoten ◆ flache Sequenzen, können Duplikate enthalten VL Datenbanken I – 9–47 VL Datenbanken I – 9–48 XQuery: Variablen ■ Bindung der Ergebnisse der Auswertung von Ausdrücken an Variablen ■ Notation: $name ■ Besonderheiten: XQuery: LET-Klausel Typ ergibt sich aus zugewiesenem Ergebnis ◆ keine Seiteneffekte möglich (Modifikation) ◆ Bindung nur für aktuellen Ausdruck gültig ■ Menge von Werten als Ergebnis eines Ausdrucks wird an Variable gebunden LET $var := Ausdruck ■ Beispiel: LET $b := document("buecher.xml")//buch RETURN $b ■ Auswertung: ◆ 1. Auswertung von /buch aus Dokument buecher.xml 2. Zuweisung der Elementmenge an $b 3. Ausgabe von $b VL Datenbanken I – 9–49 XQuery: FOR-Klausel VL Datenbanken I – 9–50 XQuery: Elementkonstruktoren ■ Binden jedes einzelnen Elementes der Ergebnismenge an Variable FOR $var IN Ausdruck ■ Beispiel: FOR $b IN document("buecher.xml")//buch RETURN $b ■ Auswertung von XQuery-Ausdrücken innerhalb von XML durch Einschluss in { ...} Auswertung: ■ Beispiel: <autoren> { FOR $b IN document("buecher.xml")//buch FOR $a IN $b/autor RETURN <name> {$a/nachname/text()} </name> } </autoren> ■ 1. für jedes Buchelement erfolgt Bindung an $b 2. evtl. folgende Klauseln (WHERE, RETURN, . . . ) werden für jede Iteration ausgewertet, d.h. RETURN wird für jedes Buch ausgeführt VL Datenbanken I – 9–51 ■ Erzeugung von XML-Fragmenten zur Ergebniskonstruktion ◆ ◆ literales XML Berechnung von Elementen und Attributen VL Datenbanken I – 9–52 XQuery: WHERE-Klausel XQuery: Weitere Konzepte ■ Einschränkung der Ergebnismenge ■ Dereferenzierung über =>-Operator für ID/IDREFS ■ Bedingungen mit Ausdrücken ■ Gruppierung / Aggregation über vordefinierte Aggregatfunktionen arithmetische, logische und Vergleichsausdrücke Funktionsaufrufe ◆ Pfafdausdrücke ◆ 1. Durchlaufen der Ausprägungen des Gruppierungselementes in FOR-Klausel 2. Binden der jeweiligen Gruppenmitglieder an Variable mittels LET-Klausel 3. Aggregation in RETURN-Klausel ◆ ■ Beispiel: FOR $b IN document("buecher.xml")//buch WHERE $b/preis < 50 RETURN <buch> { <isbn> $b/@isbn </isbn>, $b/titel } </buch> ■ Sortierung mit SORT BY ■ bedingte Ausdrücke: IF (expr1) THEN expr2 ELSE expr3 ■ Quantoren VL Datenbanken I – 9–53 XQuery: Weitere Beispiele SQL/XML ■ alle billigen Bücher nach Preis sortiert document("buecher.xml")//buch[preis < 20] SORT BY (preis DESCENDING) ■ Bücher, an denen „Ullman“ beteiligt ist FOR $b IN document("buecher.xml")//buch WHERE SOME $a IN $b/autor/nachname SATISFIES $a = "Ullman" RETURN $b ■ VL Datenbanken I – 9–54 Verbund FOR $b IN //buch, $r IN //reviews WHERE $b/titel/text() = $r/buchtitel/text() RETURN <kritik isbn={ $b/@isbn }> <text> { $r/bewertung/text() } </text> </kritik> VL Datenbanken I – 9–55 ■ Standardentwurf für Verarbeitung von XML-Daten mit SQL (Teil von SQL:2003) ■ spezieller XML-Datentyp xml ■ Operatoren zur Konstruktion von XML xmlelement: erzeugt XML-Element xmlforest: erzeugt Sequenz („Wald“) von XML-Elementen ◆ xmlgen: Angabe eines Templates zur Elementkonstruktion ◆ xmlconcat: Aneinanderhängen von XML-Elementen ◆ xmlagg: Aggregatfunktion zur Erzeugung einer Sequenz von XML-Elementen ◆ ◆ VL Datenbanken I – 9–56 SQL/XML: xmlgen SQL/XML: xmlelement ■ Relation: employee(id, fname, lname, dept, hire) ■ Anfrage: select e.id, xmlelement (NAME "Emp", e.fname || ’ ’ || e.lname) as "result" from employee; ■ Ergebnis: id result 1001 <Emp>John Smith</Emp> 1142 <Emp>William Gates</Emp> ■ Anfrage: select e.id, xmlgen (’<Emp name="{$NAME}"> <hire_date>{$HIRE}</hire_date> <dept>{$DEPT}</dept></Emp>’, e.lname as name, e.hire, e.dept) as "result" from employee e; ■ Ergebnis: id result 1001 <Emp name="Smith"> <hire_date>2002-12-5</hire_date> <dept>Shipping</dept></Emp> VL Datenbanken I – 9–57 Logik-basierte Anfragesprachen: Datalog ■ Datalog: von Prolog inspirierte Anfragesprache für deduktive Datenbanken ■ deduktive Datenbanken: Ableitung neuer Fakten anhand von Regeln ■ Anfrage in Datalog: Programm mit endlicher Menge von Regeln VL Datenbanken I – 9–59 VL Datenbanken I – 9–58 Datalog: Notation ■ Programm aus atomaren Formeln ; Horn-Klauseln ■ atomare Formel: Literal der Form p(a1 , a2 , . . . , an ) mit Prädikat p: Datenbankrelation, built-in-Prädikate wie <, >, =, / = ◆ Argumente ai : Konstanten, Variablen ◆ ■ positive Literale, negative Literale (not(atomareFormel )) VL Datenbanken I – 9–60 Datalog: Horn-Klauseln ■ konjunktive Verknüpfung von Klauseln ■ Klausel := Disjunktion von Literalen ■ logische Form: P1 ∧ P2 ∧ · · · ∧ Pn ⇒ Q ■ Datalog-Notation: Q :– P1 , P2 , . . . , Pn . ■ Anfrage: Extensionale vs. intensionale Prädikate BilligBuch(t, i) :– Buch(t, i, p, v), p < 20. ■ ■ extensionales Prädikat: zugehörige Relation ist in der Datenbank gespeichert ; extensionale DB (EDB) ■ intensionales Prädikat: zugehörige Relation wird durch Anwendung von Datalog-Regeln berechnet ; intensionale DB (IDB) ⇒ EDB-Prädikate können nicht im Regelkopf auftreten Bedeutung: ◆ ◆ Relationenprädikate wie im Bereichskalkül Tupel erscheinen im Regelkopf, wenn alle Prädikate des Regelkörpers erfüllt sind VL Datenbanken I – 9–61 Umsetzung relationaler Operationen ■ Projektion VL Datenbanken I – 9–62 Umsetzung relationaler Operationen (II) ■ Join(t, r) :– Buch(t, i, p, v), Review (i, r). Buchtitel (t) :– Buch(t, i, p, v). ■ Selektion ◆ ■ Vereinigung konjunktive Bedingung: preis < 50 ∧ verlag = ’dpunkt’ B (t, i, p, v) B (t, i, p, v) B1(t, i, p, v) :– Buch(t, i, p, v), p < 50, v =0 dpunkt0 . ◆ Verbund disjunktive Bedingung: verlag = ’mkp’ ∨ verlag = ’dpunkt’ ■ :– :– Buch1(t, i, p, v). Buch2 (t, i, p, v). Differenz B (t, i, p, v) :– Buch1(t, i, p, v), not(Buch2 (t, i, p, v)). B2 (t, i, p, v) :– Buch(t, i, p, v), v =0 dpunkt0 . B2 (t, i, p, v) :– Buch(t, i, p, v), v =0 mkp0 . VL Datenbanken I – 9–63 VL Datenbanken I – 9–64 Datalog: Rekursion Auswertung von Datalog-Anfragen ■ neben Umsetzung relationaler Ausdrücke insbesondere auch Unterstützung rekursiver Anfragen ■ Beispiel: Flug (von, nach) ■ Anfrage: „Welche Paare von Städten sind durch – ggf. mehrere – Flühe miteinander verbunden?“ ■ rekursives Datalog-Programm (links rekursiv): Verbindung (v, n) Verbindung (v, n) ■ :– :– Flug (v, n). Verbindung (v, t), Flug (t, n). ■ Grundsätzlich: Prolog-Inferenzmechanismus (Backward Chaining) → ausgehend vom Ziel (Regelkopf) Fakten suchen ■ hier: nur Betrachtung rekursiver Datalog-Anfragen ◆ Basis: System algebraischer Gleichungen (Ersetzen von „:–“ durch „=“) Ri = Ei (R1 , R2 , . . . , Rn ) mit i = 1 . . . n iteriert, bis Ri unverändert bleibt alternative (nichtlineare) Formulierung: Verbindung (v, n) Verbindung (v, n) :– :– Flug (v, n). Verbindung (v, t), Verbindung (t, n). VL Datenbanken I – 9–65 Auswertung von Datalog-Anfragen (II) ■ Umsetzung von Flug (F), Verbindung (V) V (i) (x, y) = πx,y (V (i−1) (x, z) 1 F (z, y)) ∪ F (x, y) ■ monoton wachsende Folge: V (0) (v, n), V (1) (v, n), . . . ∃ kleinstes i mit V (i) (v, n) = V (i+1) (v, n) ; Fixpunkt der Folge ■ Berechnung nur bis zum Fixpunkt notwendig VL Datenbanken I – 9–67 VL Datenbanken I – 9–66 Auswertung von Datalog-Anfragen (III) Naiver Ansatz Eingabe: System algebraischer Gleichungen und EDB Ausgabe: Werte für Relationen R1 , . . . , Rn for i = 1 to n do Ri = ∅; repeat condition = true; for i = 1 to n do Si = Ri ; for i = 1 to n do begin Ri = Ei (S1 , . . . Sn ); if Ri 6= Si then condition = false; end until condition; VL Datenbanken I – 9–68 Auswertung von Datalog-Anfragen (IV) ■ Optimierungen gegenüber naiver Auswertung: Eliminierung redundanter Berechnungen Delta-Optimierung: nur neu berechnete Verbindungen in Join aufnehmen ◆ Selektionen in Rekursion schieben ◆ Regel-Rewriting (Magic Sets): Nutzung von Anfragemustern ◆ VL Datenbanken I – 9–69