9. Weitere Datenbanksprachen OQL - Anfragesprache der

Werbung
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
Herunterladen