Vergleichende Untersuchung verschiedener deduktiv – objektorientierter Datenbanksprachen Mohammad Reza Shahnas Vorgelegt als Diplomarbeit bei Prof. Dr. Rainer Manthey Institut für Informatik, Abteilung III Rheinische Friedrich-Wilhelms-Universität Bonn April 2004 Meiner Mutter und meinem Vater, der im letzten Jahr verstorben ist 2 Danksagung An dieser Stelle möchte ich einigen Menschen danken: Mein ganz besonderer Dank gilt Prof. Dr. Rainer Manthey für die viele Zeit, die er der Betreuung meiner Arbeit gewidmet hat und insbesondere für die vielen substanziellen Diskussionen. Diese Diplomarbeit während meiner beruflichen Tätigkeit durchzuführen, war mir nur aufgrund seines Verständnisses und seiner Flexibilität in der Korrelierung der Besprechungstermine mit meinen Arbeitszeiten möglich. Meiner Ehefrau Cana, für Ihre Geduld, ihre moralische Unterstützung, das Korrekturlesen und Ihr Verständnis für aufgeschobene Flitterwochen. 3 Versicherung Hiermit erkläre ich, dass ich diese Diplomarbeit selbständig durchgeführt und keine anderen als die angegebenen Quellen und Hilfsmittel benutzt habe. Bonn, den 29. April 2004 M. Reza Shahnas 4 INHALTSVERZEICHNIS 1 EINLEITUNG........................................................................................................... 2 2 DEDUKTIVE DATENBANKEN ............................................................................... 4 2.1 Sprachen für deduktive Datenbanken .................................................................................................... 10 2.1.1 Datalog.............................................................................................................................................. 10 2.1.2 Structured Query Language SQL....................................................................................................... 14 3 OBJEKTORIENTIERTE DATENBANKEN............................................................ 18 3.1 Sprachen für objektorientierte Datenbanken......................................................................................... 23 3.1.1 Object Query Language OQL............................................................................................................. 26 4 DEDUKTIVE OBJEKTORIENTIERTE DATENBANKEN DOOD ......................... 28 4.1 Rule-based Object Language ROL........................................................................................................ 30 4.2 ROL 2...................................................................................................................................................... 41 4.3 C-Logic.................................................................................................................................................... 48 4.3.1 Beschreibung und Berechnung komplexer Objekte............................................................................. 50 4.4 F-Logic .................................................................................................................................................... 51 4.5 Chimera................................................................................................................................................... 58 5 ANALYSE ............................................................................................................. 68 5.1 Vergleich deduktiver objektorientierter Datenbanksprachen ............................................................... 69 6. ERGEBNISSE ...................................................................................................... 80 6.1 Diskussion................................................................................................................................................ 81 6.2 Zusammenfassung und Bewertung......................................................................................................... 85 LITERATUR VERZEICHNIS .................................................................................... 87 1 1 Einleitung Die Forschung an Datenbanksystemen hat besonders in den letzten zwei Jahrzehnten enorme Fortschritte geleistet, so dass Datenbanksysteme zu den wohl wichtigsten Entwicklungen auf dem Gebiet der Softwareentwicklung gerechnet werden [CBS, 02]. Dabei ist vor allem die Verbindung von Datenbanksystemen und Logikprogrammierung intensiv untersucht worden, mit dem Ziel traditionelle sowie neue Datenbankanwendungen besser zu kombinieren. Dies führte zu Erweiterungen der herkömmlichen, relationalen Datenbanksysteme um regelbasierte Sprachen zur Wissensrepräsentation – die sowohl als Modellierungs- als auch als Anfragesprache verwendet werden – und um Deduktionsmethoden zur Wissensverarbeitung [KG, 90/94]. Um auch Inferenzprozesse und rekursive Relationen in solchen Datenbanken zu ermöglichen , wurden deduktive Datenbanken entwickelt, [W, 99]. Deduktive Datenbanken verbinden die Vorteile einer deklarativen logischen Programmiersprache mit Datenbanktechniken zur Anfragebearbeitung und -optimierung [F, 03]. Syntaktische und semantische Konzepte deduktiver Datenbanken werden heute in modernen Datenbank-Anfragesprachen, in Workflow-Managementsystemen, in XMLAnfragesprachen, zur Wissensrepräsentation, im Constraint Reasoning und vielen anderen Bereichen eingesetzt. Damit stellen deduktive Datenbanken ein Bindeglied zwischen Logikprogrammierung und Datenbanksystemen dar. Bezüglich der Logikprogrammierung ergeben sich Effizienzvorteile durch eine effiziente Datenbankverwaltung. Die Datenbankprogrammierung profitiert durch eine unkomplizierte Formulierung von Regeln, Anwendungen und Datenbankanfragen, [CGH,93]. Nach der Entwicklung erster objektorientierter und deduktiver Datenmodelle als Erweiterung der relationalen Datenbanktheorie konnten in beiden Paradigmen orthogonale Merkmale bzw. Funktionalitäten aufgezeigt werden. 2 Durch Integration beider Modelle sind die ersten deduktiven objektorientierten Datenbankmodelle entstanden, und in der Folge wurden dazu zahlreiche Datenbanksprachen entwickelt, wie O-Logic [M, 86], C-Logic [CW, 89], IQL [AK, 89], F-Logic [KLW,95], LLO [LO, 91], LOGRES [CCCtTZ,90],]. Mit der Integration von aktiven Datenbanktechnologien in diese Datenmodelle wurden schließlich neue deduktive, objektorientierte Datenbanksprachen generiert. Beispiele für diese neue Sprachengruppe sind Rock &Roll [BFPW,95 und Chimera [CM,94]. In meiner Diplomarbeit vergleiche ich die wichtigsten Gemeinsamkeiten und Unterschiede von deduktiven objektorientierten Datenbanksystemen anhand von ausgewählten Datenbanksprachen. Dazu werden in Kapitel 2 die theoretischen Grundlagen deduktiver Datenbanken vorgestellt, und die Architektur der wichtigsten implementierten deduktiven Datenbanksysteme behandelt. In Kapitel 3 wird das objektorientierte Datenmodell dargelegt, sowie der zugrunde gelegte Standard (Object Database Management Group, ODMG) erläutert. Im zweiten Abschnitt dieses Kapitels wird die Anfragesprache „Object Query Language OQL“, die eine deklarative Anfragsprache für objektorientierte Datenbankmanagementsysteme (OODBMS) darstellt, behandelt. Die Kombination des logischen Teils der deduktiven Methoden und der Modellierung von objektorientierten Methoden bildet die Grundlage für die Erweiterung des relationalen Datenmodells um den objektorientierten – und den deduktiven Ansatz. Dazu werden in Kapitel 4 ausgewählte Sprachen (ROL, ROL 2, C-Logic, F-Logic und Chimera) beschrieben. In Kapitel 5 werden die Gemeinsamkeiten und Unterschiede der vorgestellten Datenbanksprachen miteinander verglichen. Die Ergebnisse werden in Kapitel 6 abschließend diskutiert und bewertet. 3 2 Deduktive Datenbanken Bei der Entwicklung deduktiver Datenbanksysteme wurden Ergebnisse aus der Forschung zur Künstlichen Intelligenz (KI) und Datenbank-Managementsystemen (DBMS) zugrunde gelegt [Ull88]. Erste Anwendungen basierten auf Experimente, die unter Kopplung von automatischen Beweissystemen mit Datenbanksystemen durchgeführt wurden [CBS, 02]. Ziel war es, effizientere Methoden zu entwickeln, die es erlaubten, große Faktenmengen durch möglichst einfache und einzeln definierte Ausdrücke darzustellen. Mitte der achtziger Jahre verlagerte sich der Forschungsschwerpunkt auf die Entwicklung verschiedener Implementierungstechniken, insbesondere auf das relationale Datenmodell [CBS, 02]. Dabei wurden auch die regelbasierte Wissensdarstellung und die automatische Datenableitung im Rahmen anderer Datenmodelle, insbesondere innerhalb objektorientierter Systeme untersucht. Deduktive Datenbanksysteme stellen eine Erweiterung des relationalen Datenmodells um eine sogenannte Deduktionskomponente dar. Die Deduktionskomponente basiert auf dem Prädikatenkalkül, also der Logik erster Stufe. Deshalb können deduktive Datenbanken auch als eine relationale Datenmodellierung mit Logikprogrammierung betrachtet werden [KE, 96]. Deduktive Datenbanken bieten die Möglichkeit, aus explizit gespeicherten Fakten neue Fakten abzuleiten. Der Zusammenhang zwischen den ableitbaren Fakten sowie den Basisfakten wird dabei durch Regeln ausgedrückt. Regeln sind deklarative Ausdrücke und erlauben eine Darstellung ableitbarer Fakten. Um auf ableitbare Fakten zugreifen zu können, muss das Datenbanksystem entsprechende Methoden zur Materialisierung bereitstellen. Ein Datenbankmanagementsystem (DBMS) - für beliebige Datenmodelle - wird als deduktiv bezeichnet, wenn es zusätzlich zu den üblichen Funktionalitäten eines DBMS die Möglichkeit zur Spezifikation, Verwaltung und Herleitung ableitbarer Daten bietet. [Skript] Eine deduktive Datenbank enthält Fakten und Regeln, wobei die Menge der Fakten als extensionale Datenbank (EDB) und die Menge der Regeln als intensionale Datenbank (IDB) bezeichnet wird. Zudem beruht die Auswertung von Abfragen auf logischer Deduktion. 4 Eine deduktive Datenbank kann mit relativ wenig Aufwand aus einer relationalen Datenbank abgeleitet werden. Die Abfrageauswertung in deduktiven Datenbanksystemen erfolgt durch einen Mechanismus entsprechend der logischen Programmierung. Dieser Mechanismus basiert auf einer deklarativen Semantik und folgt damit der Anwendungstechnik relationaler Datenbanksysteme. Formal lassen sich deduktive Datenbanken wie folgt definieren: Sei ∑ = (S, Ω, Π) eine Signatur und X eine Variabelenmenge zu ∑. • • • Eine Datenbankklausel bezüglich ∑ und X ist eine Formel der Form: A ← W, wobei A∈ A∑ (X) ein Atom und W ∈F∑ (X) eine Formel ist. Das Atom A stellt den Kopf und W den Rumpf der Datenklausel dar [A. Cremers, 94]. Eine Datenbankabfrage bezüglich ∑ und X hat folgende Form: false ← W, wobei W ∈ F ∑ (X) die Formel darstellt. Eine deduktive Datenbank bezüglich ∑ und X ist eine endliche Menge von Datenbankklauseln bezüglich ∑ und X.[CG,93] Eine Regel ist eine Formel mit der Form: A ← W, wobei A ein Atom darstellt und als Kopf der Regel bezeichnet wird; W ist eine Formel und stellt den Körper der Regel dar. Eine Regel dieser Form wird auch generalisierte Klausel genannt. Im Gegensatz zur gängigen Theorie der logischen Programmierung ist der Körper einer generalisierten Klausel nicht auf eine Konjunktion von Literalen eingeschränkt. Eine generalisierte Klausel kann in eine oder mehrere normale Klausel transformiert werden. Ein Datenbankprädikat p wird durch eine Menge von Formeln definiert, die jeweils die Form einer Implikation p(t1,…, tn) ← W besitzen. Die Formel W beschreibt die Bedingungen unter denen das Literal (t1, ..., tn) erfüllt ist.[B,99] Regeln in deduktiven Datenbanken dienen in erster Linie zur Datendefinition. Regeln, wie Datenbankabfrage, sind deklarative Ausdrücke, das heißt, sie werden lediglich zur Beschreibung der Zusammenhänge zwischen Datenmengen genutzt. Sie beschreiben nicht, wie diese einzusetzen sind. In Datalog können beliebig viele Regeln zur Definition einer Relation kombiniert werden. Im Rumpf einer Regel darf ebenfalls eine regeldefinierte Relation angesprochen werden, daraus folgt die hierarchische Abhängigkeit von Relationen untereinander (Abstraktionshierarchie). Die regeldefinierten Relationen können von sich selbst abhängen, das bedeutet, dass die Regeln rekursiv sein dürfen. Voraussetzung ist, dass die rekursiven Regeln mit mindestens einer nichtrekursiven Regel kombiniert werden. Sei R eine Menge deduktiver Regeln, dann ist eine Schichtung λ auf R, eine eindeutige Abbildung von der Menge aller Prädikatensymbole RelD in die Menge der natürlichen Zahlen, so dass für alle p, q ∈ RelD gilt: 5 p ∉ def(R) p ∈ def(R) p hängt von q ab ⇔ λ(p) = 0 ⇔ λ(p) ≥ 1 ⇔ λ(p) ≥ λ (q) Darüber hinaus definiert λ eine vollständige und disjunkte Zerlegung von R in die Teilmenge R1,..., Rm, so dass für jedes Prädikatensymbol p∈ def(R) alle Fakten und Regeln, die p definieren, in Rλ(p) enthalten sind. Die Teilmengen R1, ..., Rm werden als Schichtung von R bezeichnet. Eine Schichtung wird Stratifikation von RelD genannt, wenn zusätzlich folgende Bedingung gilt:[Behrend,99] p hängt negativ von q ab ⇔ λ(p) > λ(q). Eine wichtige Einschränkung in deduktiven Datenbanken ist, dass alle Variablen einer Klausel bereichbeschränkt sein müssen. Jede Variable im Regelkopf muss auch in Regelrumpf vorkommen. Ein Variable gilt als bereichbeschränkt, wenn sie in einem nicht negierten, benutzerdefinierten Prädikat im Körper einer Regel vorkommt. Analog heißt eine Regel bereichbeschränkt, falls jede in der Regel vorkommende Variable ebenfalls bereichbeschränkt ist. Da Fakten als Regeln ohne Körper aufgefasst werden können, ist eine Einschränkung auf bereichbeschränkte Regeln, eine Verallgemeinerung der Bedingung, dass Fakten variablenfrei sein müssen. Das Kriterium der Bereichbeschränkung stellt sicher, dass ein benutzerdefiniertes Prädikat eine endliche Anzahl von Lösungen besitzt.[Behrend,99] Schließlich wird verlangt, dass eine deduktive Datenbank stratifiziert ist, (lat. Stratum: die Schicht). Das bedeutet informell, dass ein rekursiv definiertes Prädikat p in seiner Definition nicht auf die Negation von p Bezug nehmen darf. Eine deduktive Datenbank ist stratifizierbar, wenn mindestens eine Stratifikation existiert, andernfalls wird die Datenbank als nicht stratifizierbar bezeichnet. Wenn keine negativen Abhängigkeiten existieren, ist die Regelmenge immer stratifizierbar. In diesem Fall wird die Datenbank als positive deduktive Datenbank bezeichnet. Ein weiterer Spezialfall liegt vor, wenn nur negative Abhängigkeiten von extensionalen Prädikaten in einer gegebenen Regelmenge existieren. Auch in diesem Fall ist die Regelmenge immer stratifizierbar: [Behrend,99] Sei R eine Menge deduktiver Regeln und λ eine Schichtung auf R mit den Schichten R1,..., Rm. Bezüglich λ sind folgende Regelklassen zu unterscheiden. Die Klasse der hierarchischen Regeln R°, die sich nur auf Relationen tieferer Schichten beziehen, also: R°: = ∪ k = 1, ..., m R°k, wobei gilt R°k: = {A ← W ∈ Rk für alle Literale L in W gilt: λ (L) < k} 6 Die Klasse der nicht stratifizierbaren Regeln R*, die sich jeweils mindestens einmal negativ auf Relationen der gleichen Schicht beziehen, also: R*: = ∪ k=1, ..., m R*k, wobei gilt R*k: = {A ← W∈ Rk ∃ ein negatives Literal L in W mit λ (L) =k}. Hierbei wird eine deduktive Datenbank D = 〈F, R〉 als komplette Darstellung einer relationalen Datenbank, dass heißt einer expliziten Faktenmenge F* betrachtet, die F sowie alle durch die Regeln in R ableitbaren Fakten (und keine weiteren Fakten) enthält. Für eine genaue Charakterisierung der Faktenmenge F* wird im Folgenden die Fixpunktsemantik für positive bzw. semi-positive, stratifizierbare und allgemeine deduktive Datenbanken vorgestellt. Dazu wird zunächst die Definition eines Ableitungsoperators T benötigt, in welcher genau spezifiziert wird, was mit der Anwendung einer Regel erzielt werden soll.[Behrend,99] Sei R eine deduktive Regel der Form A ← W, wobei W j (1≤ j ≤ n) positive Literale Lj und Ck (0≤ k ≤ m) negative Literale Ck enthält. Sei weiterhin F eine beliebige Menge von Fakten, auf die die Regel angewendet wird. T [Regeln] (Fakten) : = {Aσ | σ konsistente Substitution und ∀ 1≤ j ≤ n : Lj σ ∈ Fakten, 1≤ k ≤ m : Bk σ∉ Fakten}. Aufgrund der Definition der deduktiven Regeln sowie der Beschränkung auf positive Fakten ist eine direkte Bestimmung des Wahrheitswerts eines negativen Literals nicht möglich. Für Datalog ¬ muss daher die Closed Word Assumption (CWA) durchgeführt werden. Es wird angenommen, dass die Negierung eines Faktes wahr ist, wenn es weder in F enthalten ist, noch durch Auswertung der Regeln aus F abgeleitet werden kann.[Behrend,99] CWA ist also eine Annahme über vollständiges Wissen. Somit kann die Bedeutung negativer Literale charakterisiert werden: Wenn für ein negatives Literal einer Regel das entsprechende positive Fakt nicht in der Faktenmenge enthalten ist, kann aus der CWA gefolgert werden, dass das negative Literal wahr ist. Dieses Prinzip wird als Negation as failure (NFA) bezeichnet. Dabei ist die Folgerung aus einer CWA für eine gegebene Regelmenge R nur korrekt, wenn andere Regeln aus R das negative Fakt nicht durch Anwendung des T- Operators als positives Fakt ableiten können. Dieses Problem wird im Zusammenhang mit der Einführung einer kumulativen Form des Ableitungsoperators genauer behandelt. Das Resultat der Simulation ’Anwendung aller Regeln einer Regelmenge R’ ist gegeben durch: TR (Fakten) : = ∪ Regel ∈ R T [Regel] (Fakten) 7 Dabei sind die Fakten, die durch die Anwendung von TR erzeugt wurden, während der Ableitung für die einzelnen Regeln noch nicht sichtbar. Für die Regeln, die ausschließlich von Basisrelationen abhängen, erhält man bereits nach einmaliger Anwendung von TR auf die Basisfakten F den Anteil, welcher zusammen mit F die Faktenmenge F* ergibt. Wenn R Regeln enthält, die selbst von regeldefinierten Relationen abhängen, sind weitere Anwendungen des TR –Operators auf die Resultate vorhergehender Schritte erforderlich, um die impliziten oder ableitbaren Fakten von D zu erhalten. Da der Operator aber nicht die Faktenmenge F, auf die er definiert ist, enthält, sondern nur die Menge der aus Fakten ableitbaren Fakten beschreibt, ist eine kumulative Form von TR erforderlich, um auch mehrstufige Ableitungen charakterisieren zu können.[B,99] T*Rs (Fakten) : = TRs (Fakten) ∪ Fakten Der T*R –Operator übernimmt bei wiederholter Anwendung alle früheren Ableitungen. Wenn entsprechende positive Fakten zu spät abgeleitet werden, kann daher die Auswertung von negativen Literalen zu unerwünschten Ableitungen führen. Um die negativen Literale nicht zu früh auszuwerten, müssen demzufolge die Regeln aus R von T*R in einer kontrollierten Reihenfolge abgeleitet werden. Wenn die Regelmenge stratifizierbar ist, kann dafür eine Stratifikation verwendet werden. Mit T*R und dem Stratifikationskonzept ist es möglich, die Semantik von positiven bzw. semi-positiven und stratifizierbaren Datenbanken zu charakterisieren. Die Semantik deduktiver Datenbanken wird mittels der Definition von Fixpunkoperatoren eingeführt, die die Ableitbarkeit formalisieren.[Behrend,99] Diese Fixpunktsemantik kann gleichzeitig als konstruktives Verfahren zur Materialisierung regeldefinierter Daten genutzt werden. Dabei werden iterativ solange regeldefinierte Fakten generiert, bis keine neuen Ableitungen mehr auftreten, und damit ein Fixpunkt erreicht ist. Ein solcher Fixpunkt - Iterationsprozess kann neben der Materialisierung auch als Grundlage für andere Konzepte deduktiver Datenbanken verwendet werden, zum Beispiel zur Abfragebearbeitung und Änderungspropagierung. Definition 2.1: Fixpunktsemantik für stratifizierbare deduktive Datenbanken Sei D = 〈F, R〉 eine positive oder semi-positive, deduktive Datenbank, dann ist D der kleinste Fixpunkt F* von T*R ( lfp (T*R, F) ) D = 〈 F, R〉, der F ganz enthält. Sei D = 〈F, R〉 eine stratifizierbare, deduktive Datenbank und λ eine Stratifikation auf R mit den Partitionen R1, ..., Rm., also Fo : = F Fi : = lfp( T*Ri, Fi-1 ) für 1≤ i ≤ m, dann ist D definiert als F* : = Fm (iterierter Fixpunkt von D). 8 Die Existenz, die Endlichkeit und die Eindeutigkeit von F* = lfp (T*R, F) ist eine fundamentale Eigenschaft von deduktiven Datenbanken. Dabei liegt die Existenz und Eindeutigkeit im Wesentlichen an der Monotonie des kumulativen Ableitungsoperators T*R (nach Traxi´s Fixpunkt 1955). Die Endlichkeit von F* beruht hauptsächlich auf der Endlichkeit von F und R sowie der Einschränkung, dass die Regeln keine Funktionssymbole enthalten. Für nichtstratifizierbare Regelmengen wird eine andere Sichtweise auf deduktive Datenbanken, basierend auf einer dreiwertigen Logik, benötigt. Man unterscheidet dabei die Menge aller möglichen Fakten, die aus den Relationssymbolen RelD und den Konstanten in D konstruierbar sind (Herbrandbasis von D), die Menge der positiven (ableitbaren) Fakten F*+ , die Menge der negativen Fakten F*-, sowie die Menge der Fakten mit undefinierten Wahrheitswert F*?. Um die Bedeutung einer deduktiven Datenbank charakterisieren zu können, müssen mindestens zwei dieser Teilmengen explizit bestimmt werden. Hier wird die Bedeutung einer deduktiven Datenbank als das Paar 〈F*+, F*-〉 betrachtet. Das Problem nicht stratifizierbarer Regelmengen ist offenbar die korrekte Auswertung negativer Literale.[Behrend,99] 9 2.1 Sprachen für deduktive Datenbanken 2.1.1 Datalog Der Begriff Datalog leitet sich aus dem englischen Wort Database für Datenbank und dem Namen der Logikprogrammiersprache Prolog ab. Datalog stellt die Sprache dar, in der die Regeln für deduktive Datenbanken formuliert werden. Sie entspricht in vielerlei Hinsicht der vereinfachten Version der logischen Programmiersprache Prolog. Datalog als Datenbanksprache zur prototypischen Untersuchung von Grundphänomenen deduktiver Datenbanken ist eine Abfrage- und Regelsprache für das relationale Datenmodell, welche auf dem Bereichkalkül aufbaut. Grundbausteine jedes Datalogausdrucks sind Literale. Ein Literal besteht aus einem Relationsnamen und einer (anhängenden) Parameterliste. Sind in dieser Parameterliste Variablen angegeben, so stellt das Literal eine Abfrage nach Parameterwerten zu passenden Datenbankfakten für diese Variable dar. Falls in der Parameterliste eines Literals keine Variablen sondern nur Konstanten aufgeführt sind, dann repräsentiert ein solches Literal ein spezifisches Einzelfakt, bzw. eine Abfrage nach genau diesem einen Einzelfakt. Die Bildung konjunktiver Ausdrücke ist die einzige Möglichkeit, in Datalog Literale miteinander in Beziehung zu setzen. Konjunktion zweier Literale in Datalog: Relationsname 1 (X1,…, Xn), Relationsname 2 (Y1, …, Yn), wobei Xi und Yj sowohl Variablen als auch Konstanten sein können. Ein weiteres wichtiges, syntaktisches Konzept in Datalog ist die sogenannte Regel. Durch sie werden neue Datenbankfakten definiert. Dies geschieht, indem ein Datalogausdruck die Parameterwerte der neuen Fakten festlegt. In diesem Sinne sind auch die Datalogregeln genau wie die Deduktionsregeln konstruktiv. Das Aussehen dieser Regeln und die Benennung der Regelbestandteile entspricht ebenfalls den Deduktionsregeln: p(…, Xi, …, Yj, …) ⇐ q( X1, …, Xn), r(Y1, …, Yn), wobei wiederum gilt, dass Xi und Yj sowohl Variablen als auch Konstanten sein können. Die linke Seite des Implikationspfeils wird Regelkopf genannt und stellt ein Muster für neue Fakten dar. Die rechte Seite heißt Regelrumpf und ist der Ausdruck, der die neuen Fakten definiert. Die Definition einer neuen Relation durch mehrere Regeln ist möglich. Dazu erhalten diese Regeln alle den gleichen Regelkopf. Eine Ausnahme bilden umbenannte Variablen. Dies kann als eine Spezialform der Disjunktion oder auch Vereinigungssemantik interpretiert werden. 10 Ein neues Fakt wird genau dann hergeleitet, wenn die Variablenbelegung des jeweiligen Regelrumpfs der ersten oder zweiten Regel oder einer der anderen Regeln mit gleichem Regelkopf konsistent ist. Im Gegensatz zu solchen regeldefinierten Relationen spricht man bei Relationen, die vollständig in der Faktendatenbank realisiert werden, von Basisrelationen. Die Interpretation der Semantik einer Regel hängt dabei auch von der Art der Parameter des Regelkopfes ab. Sind im Regelkopf keine Parameter vorhanden, handelt es sich um aussagenlogische Ausdrücke. Enthält die Parameterliste des Regelkopfs nur Konstanten, so handelt es sich um Fakten. Im Regelrumpf dürfen nicht nur Basisrelationen auftreten, sondern auch andere, durch Regeln definierte Relationen. Daraus ergeben sich hierarchisch voneinander abhängige Relationen, welche sich sehr anschaulich in einem Abhängigkeitsgraph darstellen lassen. Durch diese erlaubte Verschachtelung von Relationen ergibt sich die Möglichkeit, rekursive Regeln zu definieren. Allerdings muss für jede rekursive Relation immer mindestens eine nichtrekursive Regel angegeben werden. Ein Datalogprogramm ist genau dann rekursiv, falls der Abhängigkeitsgraph zyklisch ist, also ein Zyklus vorhanden ist. [Kemper]. Für die Variablen in Datalogregeln gibt es weitere bestimmende Annahmen bzw. Einschränkungen. So sind alle Variablen, die im Regelrumpf auftreten, implizit als ∃quantifiziert anzusehen, wobei alle ∃-Quantoren am Beginn des Regelrumpfs stehen. Des Weiteren müssen bei Auswertung des Regelrumpfes alle im Regelkopf auftretenden Variablen durch solche Konstanten ersetzbar sein, die von abgespeicherten oder durch andere Regeln generierten Fakten stammen. In der ursprünglichen Form von Datalog gibt es keine Möglichkeit, negative Informationen direkt darzustellen, da dort keine negativen Literale definiert sind. Es gibt jedoch die Möglichkeit, mittels NAF (Negation as failure) und CWA (Closed World Assumption) Aussagen über nicht vorhandene Informationen zu machen. Diese fehlende Ausdrucksfähigkeit von Datalog wird durch Zulassung negativer Literale im Regelrumpf aufgehoben. Diese Sprache wird ’Datalog ¬’ (Datalog neg) genannt. Die Bedeutung der negativen Literale entspricht dem Negation as failure - Konzept. Solche Fakten sind weder in den Basisfakten, noch in den durch Deduktion hergeleiteten Fakten enthalten. Die Auswertung negativer Literale hat jedoch nicht die Speicherung von negativen Fakten in einer negativen Datenbank zur Folge. Negative Literale dienen ausschließlich zur Überprüfung, ob das betrachtete Literal wirklich nicht vorhanden ist. Dies macht eine zusätzliche Anforderung an die Bereichsbeschränkung notwendig: Jede Variable im Rumpf einer Regel in Datalog ¬ kommt in mindestens einem positiven Literal vor. Wie in Datalog ohne Negation, können auch in Datalog¬ die freien Variablen in den negativen Literalen bei einer Auswertung eines Ausdrucks durch jede Konstante ersetzt werden. Auf Grund der CWA gilt auch hierbei, dass alle Fakten, die nicht in der Basis- bzw. in der aus herleitbaren Fakten bestehenden Faktenmenge enthalten sind, als falsch gelten. Dies ist insofern problematisch, da die Möglichkeit besteht, alle in einem ne- 11 gativen Literal vorkommenden Variablen unendlich oft zu ersetzten. Daher ist beabsichtigt, die Bereichsbeschränkung von positiven Literalen innerhalb des Regelrumpfs nach vorne zu ziehen. Dadurch wird erreicht, dass alle Variablenbindungen der negativen Literale aus mindestens einer Relation stammen. ’Nach vorne ziehen’ von positiven Literalen bedeutet, dass die Auswertung des negativen Literals so lange aufgeschoben wird, bis alle Variablen durch die Auswertung aller positiven Literale ersetzt worden sind. Erst danach erfolgt die Auswertung der negativen Grundliterale über das NAF. Mit Hilfe von Integritätsbedingungen können gewisse Datenbankzustände oder gewisse Folgen von Datenbankzuständen ausgeschlossen werden. Im ersten Fall spricht man von statischen -, im zweiten Fall von dynamischen Integritätsbedingungen. Eine Integritätsbedingung ist eine geschlossene Formel, deren Auswertung T (true, also wahr) oder F (false, also falsch) ergibt. Eine Integritätsbedingung gilt bezüglich eines Datenbankzustands als erfüllt, genau dann, wenn die Integritätsbedingung eine logische Folge des Datenbankzustandes ist. Mit anderen Worten: Sie ist erfüllt, wenn sie den Wahrheitswert T besitzt, anderenfalls ist die Integritätsbedingung verletzt. Die Integritätsbedingungen können in Datalog und Datalog¬ vergleichbar ausgedrückt werden. Es wird ein parameterloses Prädikat eingeführt, dessen Erfülltheit zwingend erforderlich ist. In Datalog können auf diese Weise Integritätsbedingungen in negativer Form ausgedrückt werden, genau genommen werden zunächst Fehlerzustände durch Regeln definiert. Es gibt jedoch auch Integritätsbedingungen, die sich nur mit Hilfe negativer Literale innerhalb der Fehlerzustände ausdrücken lassen (folglich erst mit Datalog¬ ). Dies gilt beispielsweise dann, wenn formuliert werden soll, dass Paare von Parametern verschiedener Literale in Relation vorkommen müssen, in anderen Relationen hingegen aber nicht vorkommen dürfen. Beispiel: Fehler ⇐ p(X,Y), q(X,Y), ¬¬ Fakten werden als atomare Formeln dargestellt, deren Parameter ausschließlich aus Konstanten bestehen. Man kann Fakten als degenerierte Regeln mit Rumpfliteral gleich ’wahr’ ohne Variablen betrachten. Beispiel: P(a, b) ← wahr Damit ist ein einheitliches Klauselformat für Fakten und Regeln möglich. L ← L1, ..., Ln, wobei n ≥ 1 und Li ein Literal 12 Im Gegensatz zur Structured Query Language SQL, wo der Lösungsweg vorgegeben wird, ist die Abfragesprache von deduktiven Datenbanken abstrakt, und eine Vielzahl von Operationsmöglichkeiten ist offen. Und auch die Wahl der Auswertungsstrategie ist möglich. Es gibt zwei Grundprinzipen: 1. 2. Bottom - Up Methode Top - Down Methode Bei der Bottom–Up Methode wird der Fixpunkt berechnet, während mit der Top – Down Methode versucht wird, die Abfrage durch Auflösung auf abgespeicherte Fakten zu reduzieren. 13 2.1.2 Structured Query Language SQL Das Datenbankmanagementsystem (DBMS) ist das technische Werkzeug (engl. Tool), das Informationen, die in einer Datenbank gesammelt werden, speichert und verwaltet. Die Structured Query Language (SQL) hingegen ist die Sprache, die es ermöglicht, dem DBMS den Befehl zu erteilen, etwas mit den in der Datenbank vorhandenen Daten zu tun. Die Structured Query Language wurde in den 70er Jahren in den Forschungslabors von IBM entwickelt, um im ersten relationalen Datenbanksystem Daten verwalten zu können. Mit SQL ist man in der Lage, Datenbanken und Tabellen einzurichten und zu entfernen, Relationen zu definieren oder Daten in den Tabellen zu verwalten und abzufragen. SQL funktioniert wie eine Programmschnittstelle zwischen einen Datenbankanwender oder einer Anwendungssoftware, die auf eine Datenbank zugreift, und dem Datenbanksystem. SQL ist eine Skriptsprache, die gleichermaßen dem Datenbankadministrator, dem Datenbank-Entwickler und dem Datenbankbenutzer einen Zugriff auf die Datenstruktur und die Daten in einer Datenbank ermöglicht. Die Komplexitätsstärke von SQL beruht allerdings nicht so sehr auf den Basisbefehlen (wie SELECT, DELETE, oder CREATE), sondern vielmehr auf den zahlreichen Anweisungsoperationen.[D,03] Den Durchbruch als standardisierte Kommunikationsschnittstelle schaffte SQL zu Beginn der 80er Jahre, als die ORACLE corp. unter dem Namen ’ORACLE’ eines der ersten und zugleich populärsten, kommerziellen Datenbanksysteme auf den Markt brachte. Seitdem gilt SQL als Standardsprache für Datenbanken, und wurde später in andere Datenbanksysteme wie INFORMIX, SYBASE oder MY-SQL implementiert. Es dauerte allerdings noch bis 1986, bis SQL durch die ANSI (American National Standard Institute) als Standard normiert wurde.[D,03] Der Standard von 1986 enthielt alle wesentlichen Anweisungen für die Definition (DDL) und die Manipulation (DML) von Daten einer relationalen Datenbank. 1987 wurde SQL als ISO-Standard international von der ISO (International Standard Organization) übernommen. Mit einer Reihe von Erweiterungen, wie Einführung von Schlüsseln und Integritätsbedingungen, wurde 1989 SQL1 in der Version SQL89 zum verbindlichen, weltweiten Industriestandard erklärt. Erst der 92er Standard SQL92 oder SQL2 nahm eine Reihe weiterer Spracherweiterungen auf. Dazu gehört der Befehl ’ALTER’ zur nachträglichen Modifikation von Tabellenstrukturen, Domänen und Transaktionen. Mit zunehmendem Einsatz objektorientierter Ansätze im Datenbankbereich entstand Mitte der 90er Jahre verstärkt die Notwendigkeit, die Verwaltung von objektorientierten Daten in einem erweiterten SQL-Sprachkonzept zu verankern. Deshalb wurde intensiv an einem neuen Standard SQL3 gearbeitet, der vor allem objektorientierte Ansätze berücksichtigen sollte [CBS,02]. Eine SQL- Anweisung kann aus reservierten und benutzerdefinierten Befehlen zusammengesetzt werden. 14 Reservierte Wörter sind ein fester Bestandteil der SQL- Sprache und haben eine bestimmte, festgelegte Bedeutung. Benutzerdefinierte Befehle können vom Anwender erstellt werden. Sie dienen als Bezeichnungen für verschiedene Datenbankobjekte. Vereinfacht dargestellt, unterscheidet man in SQL drei grundlegende Operationen: Insert: Daten werden eingegeben. Update: Inhalte einzelner Datenfelder werden geändert. Delete: Daten werden gelöscht. Eine SQL-Abfrage ist prinzipiell immer nach dem gleichen Schema aufgebaut: Das erste Element ist stets eine SQL-Anweisung, wie ’Create’, ’Select’ und ’Drop’. Es folgen Objekte, mit denen diese Anweisung ausgeführt werden soll, und Daten, die für die Operationen benötigt werden. Zusätzlich gibt es auch spezifische Bedingungen, die durch Klauseln und Prädikate ergänzt werden. So ist z.B. eine Select- Anweisung folgendermaßen strukturiert: Select: Um Daten abzufragen. From : Gibt an, welche Tabelle benutzt wird. Where: Filtert die Zeilen gemäß bestimmter Bedingungen. Group by: Um Zeilen mit jeweils gleichem Spaltenwert zu gruppieren Having: Ähnlich wie where, aber für Gruppen Select: Bestimmt, welche Spalte in der Ausgabe erscheinen soll. Order by: Die Reihenfolge der Ausgabe wird festgelegt. Bei der Definition von SQL –Anweisungen sind darüber hinaus noch einige andere wichtige Regeln zu beachten: • • • Eine SQL-Abfrage kann in einer oder mehreren Zeilen eingegeben werden. Eine SQL-Abfrage kann aus mehreren Anweisungen bestehen. Jede Anweisung wird mit einem Semikolon ’ ; ’ abgeschlossen. Die Datenkontrolle in SQL wird durch die Verwaltung eines Datenbanksystems realisiert. 15 Dazu gehören die Zugriffberechtigungen für Datenbankbenutzer (Grant und Revoke), das Anlegen (Create Database) und das Löschen (Drop Database) von Datenbanken, sowie die Nutzung der aktuellen Datenbank (Use Database). Die Datendefinitionssprache DDL beinhaltet Anweisungen zur Definition (Create Tabelle), Manipulation (Alter Tabelle) und zum Löschen (Drop Tabelle) einer Tabellenstruktur. Mit der Anweisung ’Explain’ kann die Datenstruktur einer Tabelle jederzeit betrachtet werden. Durch diese Befehle kann das Datenmodell aufgebaut, und die Datenbank für die Aufnahme von Daten vorbereitet werden. Nachdem eine Tabellenstruktur erstellt wurde, kann die Tabelle mit Daten gefüllt werden. Diese Aufgabe wird durch die Anweisungen der Datenmanipulationssprache DML ausgeführt. In SQL verfügbare DML-Anweisungen sind: Select: Fragt Daten einer Datenbank ab. Insert: Fügt Daten in eine Tabelle ein. Update: Aktualisiert die Daten in einer Tabelle. Delete: Entfernt Daten aus einer Tabelle. Um in SQL Berechnungen oder Vergleichsoperationen auszuführen, werden Ausdrücke eingesetzt. Dazu werden Operatoren und Funktionen benötigt. Die Rechenoperationen werden in der Regel auf die Daten in den Tabellenspalten angewendet. So können z.B. mit Select Ergebnisse einer Datenbankabfrage mathematisch aufbereitet und dargestellt werden. Des Weiteren sind für die Datenbankabfrage einfache oder mit Hilfe logischer Operatoren zusammengesetzte Vergleichsausdrücke wichtig. Da ein Datenmodell in der Regel nicht nur aus einer einzigen Tabelle, sondern aus mehreren besteht, müssen die Tabellen miteinander verknüpft werden können. Mit der Anweisung Create Database wird lediglich eine Tabellenstruktur definiert, jedoch keine Tabellenverknüpfung. Die relationale Verknüpfung von Tabellen wird erst bei einer Datenbankabfrage mit Hilfe der Anweisung Select definiert. Durch diese Anweisung erhält man die Informationen aus verschiedenen Tabellen. Die einfachste Art, zwei oder mehrere Tabellen paarweise miteinander zu verknüpfen, besteht darin, eine Where - Klausel in die Select - Anweisung einzufügen, und den Primärschlüssel der einen Tabelle mit dem Fremdschlüssel der anderen Tabelle abzugleichen. [R,02] Um eine benutzerspezifische Sicht auf den Datenbankinhalt zu ermöglichen, existiert in SQL die Möglichkeit, neben den realen Tabellen (Basisdaten), sogenannte virtuelle Tabellen (engl. Views, Sichten) zu erstellen. Views sind Tabellen, deren Inhalt durch Abfragen aus anderen Tabellen extrahiert wird. Bei einer View handelt es sich um eine in einer Datenbank gespeicherte Abfrage, die sich nach außen wie eine logische Tabelle verhält. Man kann die View wie eine Tabelle verwenden, obwohl sie keine eigenen Daten enthält, denn Views sind keine 16 physischen Tabellen. Die Zugriffsmöglichkeiten entsprechen weitgehend denen von realen Tabellen. Die Anlage einer solchen View erfolgt zumeist mit Hilfe des Befehls Create View, dem der Name der anzulegenden View folgt. Anschließend können die von der View bereitgestellten Spaltennamen in den Klammern ausgeführt werden. Zum Schluss folgt eine normale Auswahlabfrage, mit deren Hilfe die aufgezählten Spalten selektiert werden. Im Select - Teil sind bis auf die Komponente Order by alle Formulierungen des Select- Kommandos erlaubt.[R,03] create view <viewname> as select <Abfrage> 17 3 Objektorientierte Datenbanken In objektorientierten Datenbanksystemen werden die in Zusammenhang mit der relationalen Datenbankmodellierung existierenden Probleme vermieden. Dies geschieht hauptsächlich durch Integration der Verhaltens - und Strukturbeschreibung in eine einheitliche Objekttypdefinition. Das anwendungsspezifische Verhaltensmuster, dass heißt die Operationen, ist ein integraler Bestandteil der Objektdatenbank. So sollen die umständlichen und ineffizienten Transformationen zwischen der Datenbank und der Programmiersprache vermieden werden. Operationen, die den Objekten zugeordnet werden, sind direkt ausführbar, ohne detaillierte Kenntnis der strukturellen Repräsentation der Objekte. Dies wird durch das sogenannte Geheimnisprinzip realisiert, wonach an der Schnittstelle des Objekttyps eine Menge von Operationen angeboten werden, für deren Ausführung lediglich die Signatur (Aufrufstruktur) bekannt sein muss. Oft wird in diesem Zusammenhang auch von einer Objektkapselung gesprochen, da die interne Struktur eines Objekts, d.h. die strukturelle Repräsentation, dem Benutzer verborgen bleibt. Der Benutzer bekommt nur die den Objekttypen zugeordneten Operationen zu sehen.[CBS,02] Objekte sind Grundbausteine, aus denen objektorientierte Anwendungssysteme aufgebaut werden. Jedes Objekt ist eine eigenständige Einheit, die über Daten (Attributwerte des Objekts) verfügt. Jedes Objekt wird durch seine datenspezifischen Eigenschaften (Attribute) und durch sein funktionsspezifisches Verhalten (Methoden) charakterisiert. Ein Attribut oder Merkmal eines Objekts ordnet jeder Instanz einen bestimmten Datenwert aus einem definierten Wertbereich zu. Neben dem Attribut müssen die Methoden festgelegt werden, die sich aus dem Kontext des Problembereichs ergeben.[H,92] Unter eine Methode versteht man eine klar definierte Dienstfunktion, durch die Werteingaben, Wertänderungen und Wertselektionen der Objekte geregelt werden. Objekte werden in einer objektorientierten Datenbank durch Methoden manipuliert. Eine Methodendefinition besteht aus zwei Teile, Signatur und Implementation. Folgende Objektbestandteile werden in der Objekttyp- Definition festgelegt: 18 • • • • Die Strukturbeschreibung der Instanzen, bestehend aus den Attributen und Beziehungen zu anderen Objekten. Die Verhaltensbeschreibung der Instanzen, bestehend aus einer Menge von Operationen. Die Typeigenschaften, zum Beispiel Generalisierung und Spezialisierungsbeziehungen zu Typen. Die Datenwerte eines Objekts: Diese können ausschließlich durch die Methoden verändert oder selektiert werden, dass heißt die Daten sind gekapselt. Die Kapselung ist ein wichtiges Konzept in der objektorientierten Softwareentwicklung, und hat entscheidenden Einfluss auf die Integrität und Stabilität einer objektorientierten Datenbank. Im relationalen Modell ist das Tupel die einzige Möglichkeit, die Entitäten darzustellen. Ein Tupel besteht aus einer festen Anzahl von atomaren Literalen. Im objektorientierten Modell hat jedes Objekt eine systemweit eindeutige Objektidentität, die sich während seiner Lebenszeit nicht verändert. Der Objekttyp legt die Struktur und das Verhalten des Objekts fest.[CBS,02] Individuelle Objekte werden durch die sogenannte Instanziierung eines Objekttyps erzeugt. Damit wird sichergestellt, dass ein Objekt die in dem Objekttyp festgelegte Struktur besitzt und die dem Typ zugeordneten Operationen versteht. Ein Objekt hat zu jedem Zeitpunkt seiner Lebenszeit einen bestimmten Zustand. Der Zustand eines Objekts ist durch die Werte seiner beschreibenden Attribute sowie die mit anderen Objekten bestehenden Beziehungen gegeben. Die eindeutige Zuordnung von Objekten wird mit Hilfe eines Objektidentifikators (Objektidentifier, OID) realisiert. Anschaulich ist ein Objektidentifikator ein Zeiger auf ein Objekt. Genau wie gleichartige Entitäten zu Entitätstypen zusammengefasst werden, werden gleichartige Objekte durch einen gemeinsamen Objekttyp - oft auch Klasse genannt modelliert. Die einem Objekttyp zugehörigen Objekte werden als Instanzen dieses Typs bezeichnet. Sie weisen eine gemeinsame Typdefinition auf, also eine einheitliche, strukturelle Repräsentation sowie ein einheitliches Verhaltenmuster. Die Menge aller Objekte (Instanzen) eines Typs fasst man als Extension zusammen. Eine Eigenschaft von Klassen betrifft die Klassenbezogenen Attribute und Methoden. Ein Klassenattribut ist ein Attribut der Klasse, welches als Ausprägung einmal pro Klasse vorkommt und nicht jedes Mal pro Instanz. Neben Klassenattributen können Klassenmethoden definiert werden. Eine Klassenmethode ist unabhängig von der Existenz von Objektausprägungen, und arbeitet auf Klassenattributen oder übernimmt spezifische Aufgaben der jeweiligen Klassen.[MW,00] Die Ableitung von Klasseneigenschaften und Klassenverhalten stellt ein mächtiges Modellierungskonzept des objektorientierten Ansatzes dar. Jede Beziehung zwischen zwei Objekten bzw. Klassen wird durch einfache - und mehrfache Assoziationen ausgedrückt. Jede Assoziation charakterisiert also sowohl die Bedeutung (Semantik) wie die Mächtigkeit der entsprechenden Beziehungsrichtung. Eine einfache Assoziation von einer Klasse K1 nach einer Klasse K2 sagt aus, dass zu jedem Objekt in K1 genau ein Objekt in K2 zugeordnet ist. 19 Eine konditionell einfache Assoziation von einer Klasse K1 zu einer Klasse K2 bedeutet, dass zu jedem Objekt der Klasse K1 höchstens ein (dass heißt kein oder ein) Objekt aus K2 zugeordnet ist. Eine mehrfache Assoziation von einer Klasse K1 zu einer Klasse K2 besagt, dass jedem Objekt aus K1 mehrere Objekte aus K2 zugeordnet sind. Eine Beziehungsklasse beschreibt eine Klasse, die von mehr als einer Klasse abhängig ist. Sie besitzt eigene Attribute, die die Eigenschaft der Beziehung näher umschreibt. Zudem kann sie über Methoden zur Darstellung der Zugriffsfunktionen für die Objekte der Beziehungsklasse verfügen. Eine weitere wichtige Beziehungsstruktur bildet die Aggregation, die das Kombinieren von Teilobjekten zu zusammengesetzten Objekten ermöglicht. Aggregationsbeziehungen bauen auf speziell ausgezeichnete Assoziationen mit entsprechender Semantik und Mächtigkeit auf, um so eine Komponentenstruktur ausdrücken zu können. Eine Aggregationsklasse kann aus unterschiedlichen Komponentenklassen zusammengefügt sein. Mit dem Begriff Generalisierung wird eine Verallgemeinerung von Klassen in einer hierarchischen Beziehungsstruktur umschrieben. Dabei werden Klassen in Überklassen verallgemeinert. Umgekehrt werden Klassen in untergeordneten Unterklassen verfeinert. Als Spezialisierung wird die zur Verallgemeinerung inverse Sicht bezeichnet. Ausgehend von einer umfassenden Klasse definiert die Spezialisierung eine oder mehrere Unterklassen, die eine Überklasse verfeinern. Falls die Überklasse gemeinsame Attribute oder Methoden der Unterklasse besitzt, besteht zwischen den Klassen eine Generalisierungsbeziehung. Generalisierung und Spezialisierung sind logische Beziehungen zwischen involvierten Klassen, die in objektorientierten Systemen mittels Vererbung direkt realisiert werden. Die Generalisierung stellt demnach ein wichtiges Abstraktionskonzept für die Analyse dar.[MW,00] Sind Attribute und Methoden von Superklassen in einer Unterklasse, auch Subklasse genannt, verfügbar, so spricht man von Vererbung. Dieses Vererbungsprinzip gewährleistet die Wiederverwendbarkeit von Datenstrukturen (Attributen) und Verhaltenseigenschaften (Methoden). Ist der Weg von einer Unterklasse zu den Überklassen eindeutig, dass heißt stehen Klassen in einer hierarchischen Beziehung zueinander, so spricht man von einer einfachen Vererbung. Falls zu einer bestimmten Unterklasse mehrere Überklassen existieren und das gewünschte Attribut nicht in der Subklasse auffindbar ist, so muss eventuell in mehreren Überklassen nach den gewünschten Informationen gesucht werden. In diesem Fall liegt eine mehrfache Vererbung vor.[CBS02] Die Überschreibung (Overriding) ist ebenfalls ein wichtiges Prinzip der objektorientierten Softwareentwicklung. Sie erlaubt es, Methoden mit gleicher Signatur in verschiedenen, abhängigen Klassen aufzurufen. Durch unterschiedliche Methodenimplementierung können so Subklassen mit spezifischen Eigenschaften generiert werden. 20 Die Festlegung von Vererbungshierarchien (einfache Vererbung) und Vererbungsnetzen (mehrfache Vererbung) bildet eine wesentliche Aufgabe beim Aufbau eines Objektmodells. Neben der Modellierung von Datenstrukturen und Zugriffsfunktionen einzelner Objekte oder Klassen muss zusätzlich der Meldungsverkehr zwischen den Objekten geregelt werden. Unter einer Meldung (Message) versteht man die Aufforderung eines Objekts an ein anderes, eine bestimmte Methode auszuführen. Die Menge aller öffentlichen Meldungen, die einer Klasse zur Verfügung gestellt werden, wird als Protokoll bezeichnet. Um persistente Objekte logisch adressieren zu können, dient die Vergabe von Datenbanknamen, die Einstiegspunkte in die Datenbank darstellen. Das Festlegen von Datenbanknamen gehört ebenfalls zu einem Datenbankentwurf. Nachfolgend sind die wesentlichen Schritte, die beim Entwurf einer objektorientierten Datenbank beachtet werden müssen, aufgelistet:[MW,99] • • • Die Ergänzung beziehungsweise Vervollständigung von Klassen und Beziehungsklassen mit Attributen und Methoden. Die Bestimmung von Assoziationstypen und Dokumentation der Bezeichnungen. Auflösung von Generalisierung - und Aggregationsklassen und - bei Bedarf – Bereicherung durch abstrakte Klassen. Eine abstrakte Klasse ist eine künstlich eingeführte Klasse, die keine Instanzen enthält. Abstrakte Klassen bilden ein wichtiges Modellierungsinstrument, da sich damit Objektmengen beliebig verallgemeinern lassen. Bei objektorientierten Datenbanken spielt die Integritätsbedingung eine bedeutende Rolle. Die folgenden Integritätsbedingungen müssen bei den Entwurfsarbeiten einbezogen werden: • • Fortpflanzungseffekte bei Lösch-, Änderungs- und Einfügeoperationen. Beim Einfügen, Ändern und Löschen eines Objekts aus einer Objektmenge muss festgelegt werden, ob Seiteneffekte auftreten oder nicht. Auch muss die Beziehung für eine gewünschte einfache - beziehungsweise komplexe Beziehung zwischen K1 und K2 definiert werden. Da der Assoziationstyp von K1 zu K2 mehrfach ist, muss beim Einfügen eines Objekts in die Objektmenge K1 mindestens ein weiteres Objekt in K2 zwingend erzeugt werden. Analoge Regeln bestehen beim Löschen von Objekten aus einer Objektmenge, falls abhängige Objekte mitgelöscht werden müssen. Änderungsoperationen sind insofern problematisch, wenn mit einer Operation auch Beziehungsabhängigkeiten tangiert werden. Bidirektionale Abhängigkeiten: Ein Objekt aus einer Klasse K1 kann nicht existieren, ohne dass sein zugehöriges Objekt in Klasse K2 vorkommt und umgekehrt. 21 Erweiterte Kardialitätsbedingung bei Beziehungen: Die Mächtigkeit der Beziehung muss immer erhalten bleiben, dabei ist zu berücksichtigen, dass Kardinalitäten konstant sein müssen. Beliebige Prädikate als Konsistenzbedingungen: Beliebige Konsistenzbdingungen, die sich nicht durch Beziehungen oder Kardialitäten ausdrücken lassen, können durch Prädikate formuliert werden.[MW,00] Der objektorientierte Ansatz zeichnet sich dadurch aus, dass er grundsätzlich dieselben Konstruktionselemente für die Analyse wie für den Entwurf verwendet. Die Modellierungseigenschaften eines objektorientierten Datenmodells sind: • • • • • • Die Darstellbarkeit komplexer Objekte . Objekte müssen mit einer eigenen Identität versehen werden. Das Schema einer Datenbank besteht aus Klassen, deren Attribute jeweils von einem bestimmten Typen sind. Klassen können in einer Vererbungshierarchie angeordnet werden und sich darüber hinaus gegenseitig referenzieren. Es muss möglich sein, Struktur und Verhalten eines Objektes zu kapseln. Dabei sollen die Struktur und das Verhalten auf alle Objekte innerhalb einer Klasse ausführbar sein. Dazu sind Typen als abstrakten Datentyp beschreibbar. Methodennamen können in der Vererbungshierarchie bzw. dem Klassenverband überladen werden; Durch Überschreiben werden entsprechende Implementierungen ihrem jeweiligen Kontext angepasst. Falls das betreffende Modell vordefinierte Typen bereitstellt, und ein Benutzer zu diesen zusätzlich neue Typen hinzufügt, werden beide Kategorien gleichbehandelt. Aus formaler Sicht besteht ein objektorientiertes Datenmodell aus einem strukturellen sowie einem Verhaltensmäßigen Anteil.[MW,00] 22 3.1 Sprachen für objektorientierte Datenbanken Der Standard der Object Database Management Group (ODMG Standard), ist ein wichtiger Schritt zum Aufbau einer Architektur für Objektdatenbanken. Diese Architektur enthält ein Objektmodell und ein Typsystem, eine Menge von Imperativen Sprachen sowie die Object Query Language (OQL, deklarative Abfragesprache). Ein Standard ist die Zusammenfassung von Regeln, Abläufen und Modellen gemäß einer Konvention, und dient der Qualitätssicherung, Interoperabilität und, Kompatibilität. Genügt ein Produkt einem Standard, ist mit einem Synonym eine Vielzahl von Eigenschaften beschrieben. Standards sind für jede neue Technologie von wesentlicher Bedeutung, insbesondere auch für die objektorientierten Datenbanksysteme, da sie unter anderem die Basis für die kommerzielle Nutzung und Verarbeitung darstellen. Wenn objektorientierte Programmier- bzw. Datenbanksprachen ihre jeweils eigenen Modelle und Sprachkonstrukte verwenden, und damit nicht oder nur partiell kompatibel zu anderen Sprachen sind, wird es schwierig bzw. unmöglich, ein bestimmtes Objekt aus unterschiedlichen Sprachen aufrufen und verarbeiten zu können.[CBS,02] Ziel der Object Management Group (OMG) - Entwicklung ist es, insbesondere die Portabilität und Interoperabilität objektorientierter Software für verteilte Umgebungen zu ermöglichen. Portabilität beschreibt den Grad der Anpassungsfähigkeit eines Programms an unterschiedliche Rechnerplattformen. Je geringer die Anzahl der Programmiereingriffe bei einer Anpassung ist, umso höher ist die Portabilität der entsprechenden Software. Interoperabilität ist ein Maß, Software für verteilte Systeme und deren Umgebung bereitstellen zu können. Um unabhängig von Betriebssystemen, Datenbanksystemen und Programmierumgebungen Software entwickeln, betreiben und wieder verwenden zu können, müssen Kommunikationsschnittstellen definiert werden. Dabei kann die Software nur als Schnittstelle realisiert werden, die lediglich ein Protokoll und nicht dessen Implementierung vereinbart. Interface Definition Language IDL ist eine Definitionssprache für Schnittstellen, mit welcher sich ein Client (aufgerufenes Programm) und entsprechender Server (Dienstprogramm) auf eine Menge von Methoden einigen, die der Client aufruft und die der Server in beliebige Weise realisieren kann. Dieser Standard besteht aus einem Objektmodell und einer Objektdefinitionssprache. Diese ist mit der Datendefinitionssprache (Data Definition Language DDL) eines herkömmlichen Datenbanksystems gleichzusetzen. Das ODMG - Objektmodell bildet eine Obermenge des Objektmodells der Objekt Management Group (OGM). Mit diesem wird versucht, objektorientierte Standardfunktionen zur Unterstützung einer Reihe von erweiterten Leistungsmerkmalen zu definieren. Ziel ist es, einen Standard für objektorientierte Datenbanksysteme zu definieren. Daher hat ODMG ein Objektmodell erstellt, das ein Standardmodell für die Semantik von Datenbankobjekten spezifiziert. Dieses Modell ist essentiell, da damit die Se- 23 mantik festgelegt wird, die eine OODBMS (objektorientiertes Datenbankmanagementsystem) verstehen und einhalten kann.[CBS,02] Das Design von Klassenbibliotheken und Anwendungen, die diese Semantik verwenden, sollte auf verschiedene objektorientierte Datenbanksysteme, die das Objektmodell unterstützen, portierbar sein. Die wesentlichen Komponenten der ODMG- Architektur für ein objektorientiertes Datenbankmanagementsystem (OODBMS) sind: • • • • Objektmodell OM Objektdefinitionssprache ODL Objektabfragesprache OQL Anbindung an eine Programmiersprache Analyse- und Entwurfmethoden sind für die Gestaltung von Informationssystemen unumgänglich. Die Analyse bezweckt eine nachvollziehbare und widerspruchsfreie Beschreibung des Problembereichs. Gleiches gilt für den Entwurf bezüglich des informationstechnischen Lösungsbereichs. Objektorientierte Analyse -und Entwurfmethoden verfolgen einen ganzheitlichen Ansatz, bei welchem Objektstruktur und Objektverhalten modelliert und beschrieben werden. Die einheitliche Darstellung von Struktur und Verhalten in einem Objektmodell ist für den objektorientierten Ansatz typisch und vorteilhaft im Gebrauch. Wesentliche Komponenten des Objektmodells sind das Strukturmodell mit der Definition der Klassen und Beziehungsstrukturen, sowie das Verhaltensmodell mit Integritätsbedingungen und Zustandübergangsdiagrammen.[CBS,99] Das Objektmodell der ODMG ist eine Obermenge des OMG - Objektmodells, das die Portierung des Entwurfs und der Implementierung zwischen konformen Systemen ermöglicht. Die Objektdefinitionssprache ODL ist rein deklarativ und übernimmt die Rolle einer objektorientierten Datendefinitionssprache. Eine konkrete Repräsentation eines in ODL definierten Objektmodells wird durch die jeweilige Sprachanbindung realisiert. ODL unterstützt sowohl Schnittstellen als auch Klassendefinitionen (in Anlehnung an Java). Klassen sind Typen, die direkt instanziierbar sind, im Gegensatz zu Schnittstellen, die abstrakten Vereinbarungen entsprechen. Die Mehrfachvererbung von Zuständen hat sich als problematisch erwiesen, deshalb wird bei Klassen nur eine einfache Vererbung zugelassen. Dabei können die Klassen von mehreren Schnittstellen abgeleitet werden. Ein Objekttyp wird durch eine Menge von Attributen, eine Menge von Beziehungen zu anderen Objekttypen sowie eine Menge von Methoden beschrieben. Mit der Objektdefinitionssprache werden Spezifikationen von Objekttypen in ODMG Systemen definiert. Wesentliches Ziel dieser Sprache ist es, die Portierbarkeit von Schemata zwischen konformen Systemen zu erleichtern, und dadurch unter anderem auch die Zusammenarbeit von objektorientierten Datenbanksystemen untereinander zu ermöglichen. 24 ODL kann mit der Datendefinitionssprache DDL herkömmlicher Datenbanksysteme verglichen werden. Sie gibt Attribute und Bezeichnungen für Typen an und legt die Kennung von Operationen fest. 25 3.1.1 Object Query Language OQL Die Abfragesprache Object Query Language (OQL) ist eine deklarative Abfragesprache der OODBMS. Sie ist an SQL angelegt und bildet die Grundlage für den ODMG Standard. Jeder atomare oder komplexe Wert, und jedes benannte Objekt kann in OQL abgefragt werden. Eine deklarative Datenbankabfragesprache bietet die Möglichkeit des Datenzugriffs ohne aufwendige Programmierung. Hier kann festgelegt werden, welche Objekte mit welchen Eigenschaften beschaffen werden. Der Benutzer definiert auf deskriptive Weise das “Was“ und überlässt dem Datenbanksystem das “Wie“, dass heißt, die Art der Datensuche und Datenbeschreibung. OQL erfüllt die Kriterien einer deskriptiven Abfragesprache und unterstützt das Objektmodell. Die Grundstruktur einer Abfrage mit OQL ist dreiteilig: • • • Select → Wie soll die Resultatmenge (Objekte oder Werte) aussehen? From → Welche Objektmenge soll inspiziert werden? Where → Welche Eigenschaften müssen die Objekte erfüllen?[MW,00] Das Resultat einer Abfrage in OQL ist stets ein Wert, ein Objekt beziehungsweise eine Sammlung von Werten oder Objekten. Folglich ist die Sprache nicht objekterhaltend, da die Resultatmenge nicht zwingend Objekte, sondern auch Werte enthalten kann. Eine weitere Einschränkung bezüglich objektorientierter Konzepte ist die Verletzung der Kapselungseigenschaft. Kapselung verbirgt für den Anwender die Implementationsdetails des Objekts, und definiert eine Menge von Methoden als Zugriffsschnittstelle. Datenbanknamen repräsentieren eine Menge von Objekten bzw. Werten. Diese werden in OQL normalerweise als Basisobjektmengen für Abfragen benötigt. Zudem können zur einfacheren Handhabung häufig gestellter Auswertungen bereits benannte Abfragen (named Query) verwendet werden. Die benannten Abfragen vergeben dem Resultat einer Abfrage einen eindeutigen Namen und erlauben, auf dem dynamisch stets von neuem erzeugten Resultat weitere Auswertungen vornehmen zu können. Durch Aggregation wird die Kombination von Teilobjekten zu zusammengesetzten Objekten ermöglicht. Eine Aggregationsklasse kann aus unterschiedlichen Komponentenklassen zusammengefügt sein. OQL bietet eine Reihe von Aggregationsfunktionen wie Count für Zählung, Min für Minimum, Max für Maximum, Avg für den Durchschnitt und Sum für die Summe an. Numerische Operatoren auf den Basistypen sowie auf werterzeugenden Abfragen sind erlaubt. Zudem sind die üblichen Vergleichsoperatoren wie die Bool`schen Operatoren (and, or, not) in OQL definiert.[CBS,02] Modifikationen auf bestehenden Objekt- oder Wertmengen müssen in OQL immer über die vorgegebenen Methoden ausgeführt werden. Damit erfolgt eine geschützte Datenbankänderung unter Wahrung der in den Methoden implementierten Integritätsbedingungen. OQL unterstützt des Weiteren den navigierenden Zugriff auf eine objektorientierte Datenbank. 26 Dies erfolgt durch so genannte Pfadausdrücke: Ausdrücke, die entlang den im Datenbankschema festgehaltenen Beziehungen verlaufen. Bei objektorientierten Datenbanken können über die Beziehungsattribute Objekte unterschiedlicher Klassen erreicht werden, sofern solche Beziehungsstrukturen im Objektmodell festgehalten sind. Darüber hinaus können auch neue Objekt- oder Wertmengen beliebig konstruiert werden, ohne einzelnen Beziehungsstrukturen zu folgen. Die Sprache OQL ist mittels algebraischer Umformungen optimierbar. Anhand von Statistiken und eventuell vorhandener Indizes können Ausführungsstrategien berechnet werden. Die optimale Strategie bezüglich des Leistungsverhaltens wird dann ausgewählt und ausgeführt. Problematisch beim geschätzten Laufzeitverhalten ist lediglich der Aufruf der Methoden, da nicht alle Auswirkungen und Seiteneffekte im Voraus berechnet oder abgeschätzt werden können.[MW,00] Die Objektabfragesprache stellt einen deklarativen Zugriff auf Objektdatenbanken zur Verfügung. Sie bietet keine ausdrücklichen Operatoren für die Aktualisierung an, sondern überlässt diese Aufgabe den zu den Objekttypen definierten Operationen. Die Struktur eines objektorientierten Datenmodells enthält folgende charakteristischen Eigenschaften: • • • Es erlaubt die Definition der Aggregationshierarchie. Es erlaubt die Definition von Generalisierungshierarchien. Es unterstützt die einzige Identifikation von Objekten, das heißt, dass jedes Objekt nur einen einzigen Identifikator besitzt. Das Verhalten eines objektorientierten Datenmodells ist durch eine Operation definiert und registriert, die das Verhalten von Objekten in dieser Klasse beschreibt. Eine Abfrage (Query) in OQL gibt eine Subdatenbank an, die eine mit der Originaldatenbank ähnliche Struktur besitzt. Das bedeutet, das Resultat einer Abfrage kann auf eine andere Abfrage übertragen werden. Eine Subdatenbank gibt durch die Repräsentation einer Abfrage einen Kontext an, durch den die Operationen durchgeführt werden können. Die Spezifikation eines Kontexts in einer OQL- Abfrage ist von der Spezifikation der Operationen in dieser Subdatenbank getrennt. Das ermöglicht unterschiedliche Operationen aus unterschiedlichen Objektklassen durchzuführen. Die Menge der Operationen kann über eine vereinigungskompatible (union-compatible) Subdatenbank durchgeführt werden. Das Ergebnis dieser Operationsmenge ist eine neue Subdatenbank, die auf herkömmliche Weise manipuliert werden kann.[ASL,89] 27 4 Deduktive objektorientierte Datenbanken DOOD Die deduktive objektorientierte Datenbank DOOD ist eine Kombination der logischen Eigenschaften von deduktiven Methoden mit der Modellierung von objektorientierten Methoden. Es gibt eine Reihe von DOOD Sprachen, wie O- Logic [Maier-1986], C-Logic [Ch,89], IQL [AK,98], LLO [Lou und Ozs, 1991], Rock and Roll [Barja 95], F-Logic, ROL [Liu1991], ROL 2 [LG,98],Chimera [CM,94 ]. Bei diesen ist die Kapselung regelbasierter Methoden in Klassen unzulässig. Das heißt, wenn Regeln in Klassen gekapselt werden, ist die Semantik nicht mehr eindeutig. Es gibt jedoch Entwicklungen, wie Datalog++ und Datalogmath , die die Kapselung mit einer rewriting-based semantic ermöglichen. Diese Sprachen können grob in zwei Arten klassifiziert werden: • • Lossely- coupled (leicht gekoppelt) und Tightly coupled (fest gekoppelt) Bei der ersten Vorgehensweise werden vornehmlich Datalog ähnliche Sprachen als Abfragesprache für objektorientierte Datenbanken eingesetzt. Da die resultierende Sprache aus zwei unterschiedlichen Teilen mit nicht vereinheitlichter Semantik besteht, stellt dies jedoch nur eine unbefriedigende Methode dar. Typische Beispiele sind IQL und Rock and Roll. Die zweite Vorgehensweise ist eine elementare Methode, in der eine neue, einheitliche Logik vorgeschlagen wird, um die zugrundliegende objektorientierte Datenbanknotation zu formulieren. C-Logic, F- Logic und ROL gehören zur zweiten Methode. Die Methoden in objektorientierten Programmiersprachen und Datenmodellen sind in der Klassendefinition enthalten, und werden durch Funktionen und Prozeduren definiert. Sie können durch Instanzen abgerufen werden. In deduktiven Datenbanken werden Regeln anstelle von Funktionen und Prozeduren eingesetzt. Mit Regeln und durch Schachtelung in der Klassendefinition können mit derselben Vorgehensweise die Methoden in deduktiven objektorientierten Datenbanken festgelegt werden. 28 Einige Methoden lassen sich durch Klasseninstanzen abrufen. Die Mehrheit der deduktiven objektorientierten Datenbanksprachen, wie F-Logic, IQL oder ROL erlaubt jedoch keine regelbasierte Methode zur Schachtelung in der Klassendefinition, dass heißt die Schachtelung wird nicht unterstützt. Sofern Regeln in Klassen gekapselt sind, bleibt die Definition der Semantik unklar. Daher benutzen viele Sprachen, wie Datalog math und Datalog ++ eine umgeschriebene Semantik, die nicht direkt an die Quelle adressiert ist. Bei Sprachen wie O2 und Orion kann der Benutzer vererbte Attribute oder Methoden aus der Superklasse umdefinieren oder auch blockieren. Schwieriger wird es, wenn Attribute oder Methoden in mehreren Superklassen definiert sind. Derzeit gibt es noch keine logische Semantik für eine mehrfache Vererbung mit den Funktionen Überschreiben beziehungsweise Blockieren, und es existiert dahingehend auch noch kein erfolgsversprechender Ansatz. Sprachen wie O-Logic, F-Logic und Chimera erlauben nur eine einheitliche, mehrfache Vererbung. Darüber hinaus existieren Sprachen wie Datalog math, die eine Überschreibung nur bei einer mehrfachen Vererbung unterstützen. ROL wiederum hat eine Semantik, die eine nicht-einheitliche Vererbung mit Überschreiben unterstützt, jedoch wird auch hier das Blockieren nicht ermöglicht [Liu,02]. Die deduktiven und objektorientierten Datenbanken bilden zwei wichtige Erweiterungen im Bereich der traditionellen Datenbanktechnologie. Die deduktive Datenbank ergänzt die Aussagekraft der herkömmlichen Datenbank mit Hilfe der Rekursion und der deklarativen Abfrage. Objektorientierte Datenbanken erweitern die Datenmodellierung durch die Objektidentität, Klassen, Klassenhierarchie und Schema. Die deduktiven Datenbanken benötigen einen Datenmodellierungsmechanismus, während für objektorientierte Datenbanken eine deklarative Querysprache erforderlich ist. 29 4.1 Rule-based Object Language ROL Die Rule-based Object Language (ROL) wurde in der University of Regina von Mengchi Lui entwickelt. ROL ist eine regelbasierte, deklarative Sprache für Definitionen und Manipulationen von Datenbanken und Datenbankabfragen. Sie hat wesentliche Merkmale von deduktiven und objektorientierten Datenbanken, und unterstützt die Objektidentität, die Objektkomplexität, die Klassenhierarchie sowie die mehrfache Vererbung mit den Funktionen Überschreiben und Blockieren. Darüber hinaus unterstützt ROL strukturierte Werte als Functor Objekt (Objekte, die sich wie Funktionen verhalten und wie Objekte gehandhabt werden) und Menge und liefert einen Mechanismus für die Repräsentation von Teil- bzw. vollständigen Mengeninformationen. Dabei werden die wesentlichsten Merkmale, wie Domain, Schlüssel, Funktionalenabhängigkeit und Kardinalität in einer einheitlichen Form unterstützt. ROL stellt eine regelbasierte Objektsprache dar, welche als Regelsprache bestimmte Merkmale von objekt – und wertorientierten Methoden integriert. Anstelle des Objektidentifikators können strukturierte Werte für Objekte benutzt werden, falls sich die Benutzung eines Objektidentifikators als nicht erforderlich bzw. kompliziert darstellt. ROL kann einerseits wie eine objektorientierte Datenbankprogrammiersprache und andererseits wie eine wertorientierte deduktive Datenbankprogrammiersprache benutzt werden. Dabei ist wichtig, dass ROL die gleichzeitige Nutzung wertorientierterund objektorientierter Merkmale zulässt. Sie stellt die Menge der Repräsentationsmechanismen, welche die Sprachen LDL- und F-Logic kombiniert. Zur Beschreibung der Syntax von ROL wird folgendes angenommen. B={integer, real, string} ist eine Menge von value Klassen. C ist eine Menge von Objektklassen, die Funktionssymbolen mit n≥0 enthalten. A ist eine unendliche Menge von Attributen. D ist eine unendliche Menge von Werten (Values), vereinigt mit der Menge I (integer) und der Menge R (real) sowie der Menge S (string). In ROL wird eine Menge von Objekten, die gemeinsame Attribute teilen, als eine Klasse bezeichnet. Ein Objekt einer Menge, die als Klasse bezeichnet wird, ist eine Instanz diese Klasse. ROL ist eine Sprache, die auf Objekten und deren Attributen aufgebaut ist. Es gibt vier Objektarten in ROL: • • • Values: Werte (integer, real und string) wie 5, 3, 4.12, “John“, “ Smith“ Objektidentifikatoren: Wie smith, s, p, …, Functor Objekte: Family (bob, ann) 30 • Sets: Wie { }, {bob, ann} Dabei ist darauf zu achten, dass in Werten (Values) die ersten Buchstaben zwischen“ “ groß geschrieben aber in Objektidentifikatoren (OID) klein geschrieben werden. Objekte werden durch Attribute beschrieben. Attribute sind in ROL partielle Abbildungen von Objekten zu Objekten. Angewandte Attribute für Objekte müssen in den gleichen Klassen durch Attributdefinitionen definiert werden. Wenn p und q Klassen sind, und l ein Attribut bezeichnet, dann legt p[l ⇒q] das value Attribute von p fest. Wenn q eine Menge von Klassen darstellt, dann ist l ein set value Attribute. Nicht nur Objektidentifikatoren besitzen Attribute, auch Values und Functor Objekte können Attribute haben. Attributwerte können Objekte verschiedener oder auch unbekannter Art sein.[Lui,96] Klassen in ROL werden zur Definition einer Menge von Objekten, die gemeinsame Attribute teilen, eingesetzt. Auf dieser Definition basierend werden vier Klassenarten unterschieden: • Value Klasse: integer, real, string sind value Klassen wenn i1 ∈ I und i2 ∈ I und i 1≤ i2, dann ist integer (i 1..i2) eine value Klasse. wenn r1∈ R, r2 ∈R und r1≤ r2, dann ist real (r1..r2) eine value Klasse. wenn si ∈ S für i= 1,…, n, dann ist string ({s1, …, sn}) eine value Klasse. Allgemein: I, S, R {i∈I i11≤ i ≤ i2} und genauso {s1,...,sn} und (r1..r2). • Functor Objektklasse: wenn p1, .., pn Klassen sind und f∈C eine n-stellige Objektklasse ist, dann ist f(p1, .., pn) eine Objektklasse, genauer eine Functor Objektklasse. • OID- Klasse: wenn n= 0 ist, dann wird dies eine OID - Klasse genannt. • Setklasse: wenn p eine Klasse ist, dann ist {p} eine Setklasse und p die Komponente der Klasse {p}.[ Lui,96] Die Menge, die als Objektklasse bezeichnet wird, ist von dem ROL- Programm abhängig. Die Menge, die als Setklasse bezeichnet wird, ist von der Menge der Komponenten dieser Klasse abhängig. • • Value Klasse OID - Klasse integer, string, integer (20...50), string ({´Male´, ´Female´}) person, student 31 • • Functor Objektklasse family ({person}), supplies (supplier, part) Setklasse {integer}, {person}, {family({person})} Die Klassen sind durch Aggregation und Generalisierung miteinander verbunden. Dadurch entsteht eine Klassenhierarchie. In ROL werden die Untermengen von integer, real und string, sowie die Mengeneinschränkung unterstützt.[Lui,96] Beispiel {Person} (0,2) bedeutet eine Mengenkollektion mit maximal zwei Personen. (Person} (2,2) bedeutet eine Mengenkollektion mit exakt zwei Personen. Die OID- Klasse und Functor Objektklasse haben zwei Arten von Instanzen: • • Immediate (direkte) Instanz Non- immediate Instanz Immediate Instanzen müssen genau festgelegt werden. Beispiel bob: Student der Objektidentifikator bob stellt die immediate Instanz der Klasse Student fest. Family (bob, ann) legt eine non-immediate Instanz der Klasse Family (Person, Person) fest. Das bedeutet, dass bob und ann beide Instanzen der Klasse Person sind. Objektidentifikator und Functor Objekte können nur unmittelbare (immediate) Instanzen aus genau einer Klasse sein. Zusätzlich müssen die zutreffenden Attribute aller Instanzen der Klasse durch Attributsdeklaration definiert sein. Die Attributsdeklarationen einer Klasse werden zur Einschränkung aller möglichen Attributswerte von ihren repräsentierten intensionalen und extensionalen Instanzen benutzt. In ROL kann eine Klassenhierarchie durch direkte Unterklassendeklaration definiert werden. Nur die direkte Unterklasse der OID- und Functor Objektklassen können deklariert werden. Allgemein werden Unterklassen durch direkte Unterklassendeklaration erzielt. Eine Unterklasse erbt alle Attributsdeklarationen von ihrer Superklasse, außer bei der Überschreibung oder wenn sie blockiert wird. In ROL kann der Anwender die Attributserbschaft aus der Superklasse blockieren. Eine Einführung von zusätzlichen Attributdeklarationen ist ebenfalls möglich. Wenn p und q Objektklassen sind, dann definiert p isa q , p als eine direkte Unterklasse von q, wobei q die direkte Superklasse von p darstellt. 32 In ROL kann die Mehrfachvererbung mit einer Überschreibung (Overriding) durch extend isa (e-isa) erfasst werden. E-isa ist eine Beziehung (Relationship) mit folgenden Eigenschaften: p e-isa q, wenn p und q value Klassen sind und p eine Untermenge von q ist. p e-isa q, wenn p isa q • {p} e-isa {q}, wenn p e-isa q isa* ist die reflexive Form von isa, und e-isa* die transitive Form von e-isa. Folgende Notation macht die Mehrfachvererbung mit overriding anschaulich: {p[l ⇒q’] ∃ p’, p e-isa* p’[l⇒ q’] ∈ DA, and not ∃p’’, p’ ≠ p’’, p e-isa* p’’, p’’ e-isa* p’, p’’ [l⇒q’’] ∈ DA} Eine ROL- Datenbank besteht aus zwei Teilen: Schema und Programm. • Ein Schema ist eine Menge von Klassen mit ihren Attributsdeklarationen, sowie den direkten Unterklassendeklarationen. • Ein Programm enthält Objektinformationen und besteht aus Fakten und Regeln, die Extensionale und Intentionale Informationen über Objekte und deren Attributswerte repräsentieren. Ein Schema ist ein Tupel K= (B, C, A, DC, isa, DA), wobei B ⊆ B, C ⊆ C, A ⊆ A und DC eine unendliche Menge von Klassendefinitionen darstellt, die auf B und C basiert. Jede Objektklasse f ∈ C ist genau mit einer Klasse in DC verbunden. Isa ist eine unendliche Menge von direkten Unterklassendefinitionen. DA ist eine unendliche Menge von Attributsdefinitionen. Alle Klassen und Attribute in DA sind Bestandteil aus DC ∪ A. Ein Schema hat folgende Form: c [a1 ⇒c1,..., an ⇒ cn ] isa d1,…, dm, wobei c1,…,cn, und d1,…, dm Klassen sind, a1,…,an sind Attribute mit n ≥0, m ≥ 0. a1,..., an gehören zu den Klassen c1,..., cn, und d1,...,dm und bilden Superklassen von c1,..., cn.[Lui,96] Beispiel: student [age ⇒ integer (20...30), taking ⇒ {course}] isa person Die Klasse c erbt alle Attribute der Superklasse d, wobei die Überschreibung und das Blockieren von Attributen auch möglich sind. 33 Wie bereits erwähnt, liefern Fakten und Regeln liefern extensionale und intensionale Informationen über Objekte und deren Attributswerte. Ein Fakt lässt sich durch zwei Formen repräsentieren: • O: c [a1 → o1, …, an → on ] • f (o’1, …, o’n )[a1→o1, …, an → on ] wobei o, o’1, …, o’m Objekte sind, c eine OID- Klasse darstellt, und f für Functor Klassen und a1, ..., an für Attribute steht. Die erste Form bedeutet, dass O ein OID ist und c eine Klasse; a1, ..., an beschreiben Attribute mit den Werten o1, ..., on. Die zweite Form legt fest, dass das Functor Objekt f (o’1, …, o’n) die Hauptklasse f mit den Attributen a1, …, an und die Attributswerte o1, ..., on besitzt. Eine Regel hat die Form: A :--- L1, ..., Ln, wobei der Regelkopf A einen nicht negativen Ausdruck und L den Körper (eine Folge von Objekten und Vergleichsoperationen) darstellt. [Lui,00] Eine Regel ohne Körper ist ein Fakt. Fakten repräsentieren extensionale Informationen über Objekte und ihre Attribute. Attribute können in allen Instanzen der Klassen angewendet werden. Diese Attribute werden Instanzattribute genannt. Vorraussetzung ist die Deklaration in einer Klasse. Ein Objekt kann maximal einen Wert für die gegebenen Attribute haben. Falls mehr als ein Wert zugeordnet wird, ist die Datenbank inkonsistent. Da ROL eine regelbasierte Sprache ist, lassen sich Informationen über Objekte und Attribute durch verstärkte Regeln in ROL repräsentieren. Beispiele zu Schema, Fakt und Regeln in ROL: Beispiel Schema: Person [age ⇒ integer (1..120), Parents ⇒ {person}, Ancestors ⇒ {person}, TrueAnts ⇒ {person}] Orphan [parents ⇒ none, ansector ⇒ none, 34 trueAnta ⇒ none] isa person family({person}) [childeren ⇒ {person}, childCount ⇒ integer] {person}[cardinality ⇒ integer] Fakten: Pam: Tom: Joe: Sam: Joe: Liz: Ann: Pat: Jim: orphan [age→ 60] orphan [age→ 65] person [age→ 40] person [age→ 25] person [age→ 40, parents → {pam, tom}] person [age→ 43, parents → {pam, tom}] person [age→ 20, parents → {bob, joe}] person [age→ 23, parents → {bob, joe}] person [age→ 40, parents → {pat}] Regeln: X [ancestors → 〈 Y〉]:---X [parents → 〈Y〉] X [ancestors → 〈 Y〉]:---X [ancestors → 〈Z〉], Z [parents → 〈Y〉] X [trueAncs → 〈 Y〉] : ---X [ancestors → 〈Y〉], not X [parents → 〈Y〉] family (S)[children → 〈X〉] :---X[parents → S] {X}[cardinality → 1]:---X: person S [cardinality → Y] :---S=S1∪S2, S1∩2={}, Y= Y1 + Y2 S1 [cardinality → Y1], S2 [cardinality → Y2] X [childCount → Y] :--- X [children → S], S [cardinality → Y] Hier gibt es vier Klassen: person, orphan, family und {person}. • OID - Klasse person hat age, parents, ancestors, und trueAnts als Attribute. 35 • • • OID - Klasse orphan ist eine Unterklasse von person und erbt das Attribut age und blockiert die Attribute parents, ancestors, und trueAnts der Klasse person. Functor-Klasse family besitzt die Attribute children und childcount. Setklasse {person}besitzt nur cardinality als Attribut.[Lui,00] Fakten geben extensionale Informationen über Klassen, parents und age von OID’s. Mit den Regeln wird bestimmt, wie Attributswerte für entsprechende OID, Functor Objekte und Set abgeleitet werden können. Wenn O1,…, On Terme sind, dann ist 〈O1,…,On〉 ein Teil- (partial) Set davon. Ein partial Set allein stellt in ROL kein Objekt dar, sondern wird benutzt, um eine Teilmenge zu zeigen. Falls {smith, john} eine Menge ist, kann ein Teil dieser Menge als partiale Menge 〈smith〉, 〈john〉 gezeigt werden. 〈X1, ..., Xn〉 mit n > 0 ist eine Teilmenge von Termen, {X1, ..., Xn } ist die Menge der Terme. [LY,97] Um die Negation auszuführen, muss die Regelmenge der ROL Objektbank stratifizierbar sein. Stratifikation wird durch einen abhängigen Graphen determiniert. Der Graph wird wie folgt konstruiert: Für jede Klasse oder Attribut einer Objektdatenbank wird ein Knoten eingefügt. Wenn eine Regel existiert, in der x den Regelkopf und y den Regelkörper darstellt, dann existiert auch eine Kante von x nach y. Die Kante, die von x nach y verläuft ist mit X markiert. Wenn y ein negativer Ausdruck ist, oder ein Ausdruck mit der Form: P [y? Q], sodass Q keinen partialen Set Term darstellt, existiert eine Regel wie P[y? ‹Q1, ..., Qn›] im Regelkopf. ChidrenCount cardinality trueAncs family children Person X parents Abbildung 4.1.1 (Abhängiger Graph) 36 ancestors Die Menge von Regeln in einer Objektdatenbank gilt als stratifiziert, wenn im Abhängigkeitsgraphen kein Zyklus mit der markierten Kante enthalten ist. In diesem Beispiel enthält die markierte Kante X keinen Zyklus, daher ist die Menge der Regeln stratifiziert.[Lui,00] In ROL gibt es drei Arten von Abfragen (Queries): • • • Schema Abfragen, Objekt Abfragen, Fakt- und Regel Abfragen. Eine Abfrage (Query) in ROL hat die Form: Query L1,..., Ln. Schema Abfragen werden benutzt, um Informationen über Klassen, deren Attribute und Unterklassenbeziehungen zu gewinnen. Die direkte Unterklassenbeziehung kann mit isa definiert werden, die generelle Definition wird mit isa* dargestellt. Beispiele Schema Abfragen: query X: Abfrage nach jeder definierten Klasse X isa person: Abfrage nach der direkten Unterklasse von Person query orphan [A⇒X]: Abfrage nach jedem definierten Attribut query X [A⇒integer]: Abfrage nach jeder Klasse und deren in integer definierten Attributen Objekt Abfragen: Abfrage von Informationen über Objekte, die extensional durch Fakten oder intensional durch Regeln in der Objektdatenbank definiert sind: query X: person Abfrage nach jeder Instanz der Klasse Person. query X[age→Y], Y> 45 Abfrage nach Personen über 45 query P[ancestors →Y] Abfrage nach der Person und ihrer Vorfahren query{pam, liz, bob, tom}[cardinality →Y] Abfrage nach der Kardinalität der Menge {pam, liz, bob, tom}. 37 (Die Kardinalität geben an, wie komplex die zueinander in Beziehung gesetzten Instanzierungen der für die Bearbeitungsfunktion benötigten Objekte sind). Fakt und Regel Abfragen: Objektabfragen ermöglichen kombinierte Informationen über Objekte, welche extensional und intensional repräsentiert werden. Zur Gewinnung von Informationen über die Art der Objektrepräsentation innerhalb der Objektdatenbank sind Fakten- und Regelabfragen erforderlich. query [ancestors] Abfrage aller Regeln zur Ableitung der Attributswerte von ancestors (Vorfahren) query family[ ] Abfrage aller Regeln zur Ableitung der Attributswerte aller Instanzen der Klasse Familie query person [ ] Abfrage aller Regeln zur Ableitung der Attributswerte der Instanzen der Klasse Person query ann [children] Abfrage aller Fakten und Regeln zur Angabe der Attributswerte Kinder (children) von Objekt Ann Abfragen können in einer kombinierten Form benutzt werden: query liz: P [A→ X], P [A ⇒ Y] Hier wird nach der Klasse von Liz sowie ihrer Attributswerte und der Attributsdeklaration gefragt. Die Abfragen werden in ROL auf besondere Weise ausgegeben.[Lui,00] Beispiel: query X[age→Y] Ausgabe: X=john, Y=25 ROL unterstützt die objektorientierte Datenmodellierung und die value orientierte Datenmodellierung sowie ihre Kombination. Es gibt in ROL drei verschiedene Möglichkeiten zu zeigen, dass Jim und Pat die gemeinsamen Kinder von Bob und Ann sind, und dass die Familie in 123 King St, Regina wohnt. In der erste Methode, der value orientierten Methode, werden Sprachen wie LDL und CORAL benutzt. Hier gibt es Mengen und Functor Objekte, aber keinen Objektidentifikator. person (’Bob’,{’Jim’, ’Pat’}, adresse (’123 King St’, ’Regina’)) 38 person(’Ann’,{’Jim’, ’pat’}, adresse (’123 King St’,’Regina’)) Das Problem dieser Methode ist, dass die gemeinsame Nutzung von Objekten, also ein Objekt Sharing nicht unterstützt wird. Das heißt, wenn Bob und Ann weitere Kinder bekommen oder umziehen, müssen beide Fakten aktualisiert werden, (Update). Bei dieser Methode unterstützt der Objektidentifikator ein Objekt Sharing und Update Management. bob[children→s, adresse → a] ann [children → s, adresse → a] s [set → {jim, pat}] a [city →’Regina’, street→’123 King St’] Die dritte Methode nutzt die Kombination aus beiden beschriebenen Methoden: Den Objektidentifikator, die Mengen - und Functor Objekte. bob[children → {jim,pat}, adresse→addr(‘Regina’, ‘123 king St’)] ann [children → X, adress → Y]:--bob [children → X, adress → Y], mit X und Y als Variablen Diese Regel besagt, falls X die Kinder und Y die Adresse von Bob darstellen, dann gilt dies ebenfalls bezüglich der Kinder und der Adresse von Ann. Diese Vorgehensweise eignet sich nicht für objektorientierte Methoden. Um zu zeigen, dass Jim und Pat die gemeinsamen Kinder von Bob und Ann sind, aber auch Sam ein Kind von Ann ist, muss für ein maximales Objekt Sharing die dritte Methode benutzt werden. bob [children → {jim, pat}] ann [children → 〈sam〉] ann [children → 〈X〉]:---bob [children → 〈X〉] Hier liefert {jim, pat} die vollständigen (complete) Werte für die Attribute children von Bob, während die partielle Menge 〈sam〉 nur die partiellen Werte der Attribute children von ann liefert. Die Regel besagt, wenn X die Anzahl der Kinder von Bob darstellt, dann gibt X auch die Anzahl der Kinder von Ann an. Der Wert {jim, pat, sam} für die Attribute children von Ann kann durch Kombination des partiellen Werts 〈sam〉 mit den partiellen Werten 〈jim 〉 und 〈pat〉 erhalten werden, und ist aus der Regel herzuleiten. In ROL werden Klassen Updates sowie Fakt- und Regelupdates unterstützt. Update Befehle werden im Körper der Regel oder in der Abfrage eingesetzt. Klassen oder 39 direkte Super- und Unterklassen können eingeführt oder gelöscht werden. Attributsdeklarationen können eingeführt, gelöscht oder geändert werden. insert person [age⇒ integer] führt einen Attributswert für Person ein, falls die Klasse Person nicht existiert, wird die Klasse eingeführt. insert student [age ⇒integer(15..30), takes ⇒ {course}] isa person führt die Klasse student als direkte Unterklasse von Person sowie den Attributswert takes ein. modify person [age ⇒ integer(0..100)] ändert den Attributswert age (Alter) von Person. delete student [age ⇒ _] Operation löscht das Attribut age (Alter) von Student. delete course löscht die Klasse course und alle ihre Instanzen. Fakten können neu eingeführt oder auch teilweise über Objekte gelöscht werden. Beim Einführen neuer Fakten in ROL Datenbanken muss beachtet werden, dass die neuen Fakten zur Klassendeklaration passen. Genauso können auch neue Regel eingeführt und bei Bedarf gelöscht werden. Bei der objektorientierten Methode gibt es n: n Beziehungen (many-to-many relationships) zwischen den Objekten. Diese Beziehungen können in ROL auf verschiedene Weise behandelt werden. Eine symmetrische Methode ist die Benutzung des Functor Objekts zur Repräsentation von Updates über existierende Informationen. Diese Methode ist leichter durchzuführen als in eine relationalen Datenbank. Hierbei wird zwischen den intensionalen und extensionalen Datenbanken nicht unterschieden, es gibt nur eine Datenbank für die Anwendungen in ROL: Die Objektbank. Es gibt Objektinformationen, die extensional definiert sind und Fakten nutzen, und wiederum Objektinformationen, die intensional definiert sind und Regeln einsetzen. Darüber hinaus gibt es Informationen, die in der Objektbank gespeichert sind und für Updates genutzt werden. 40 4.2 ROL 2 Objektorientierte- und deduktive Datenbanken sind zwei wichtige Erweiterungen der traditionellen Datenbanktechnologie. Die objektorientierte Datenbank liefert einen besseren Weg zur Organisation und Manipulation strukturierter Objekte. Den objektorientierten Datenbanken fehlen die deklarative Abfrage (Query) und das logische Fundament. Die deduktiven Datenbanken bieten eine logisch basierte Schnittstelle zur deklarativen Abfrage mit einem sicheren Fundament. Die fehlende Datenmodellierung wird durch Nutzung objektorientierter Datenbanken repräsentiert. Der folgende Abschnitt geht näher auf die Erweiterung von ROL zu ROL 2 ein. ROL 2 enthält alle wesentlichen Eigenschaften von ROL. Zwischen der Notation der Schemata und der Instanzen gibt es eine Teilung. Die Schemata der Datenbank bestehen aus einer Menge von Klassendefinitionen. Die Instanz der Datenbank besteht aus der Faktenmenge für die Beschreibung der Klassen, der Attributdefinitionen, der vorgegebenen Werte (default values), der Methoden und der Klassendefinitionen. In ROL 2 liegt der Schwerpunkt auf den Objekten und ihren Eigenschaften. Dabei wird zwischen Objekten und Werten nicht unterschieden. Viele physikalische und konzeptuelle Entitäten sowie deren Beziehungen in der realen Welt können in ROL 2 als Objekte angesehen werden. Objekte mit gemeinsamer Struktur und Verhalten gehören zu einer Klasse. Eine Klasse bezeichnet eine Menge von Objekten mit einer spezifischen Struktur und spezifischem Verhalten. Der Strukturierungsteil einer Klasse besteht aus einer Menge von Attributdefinitionen und deren Werten. Der Verhaltensteil besteht aus einer Menge von Definitionsmethoden, die durch Regeln definiert werden. In ROL 2 werden fünf Arten von Klassen unterschieden: Value Klassen, OID- Klassen, Functor Klassen, Tupel Klassen und Set Klassen. • • Value - Klasse: OID – Klasse: • Functor Klasse: Klassen für primitive Werte wie integer, string, real, ... . Vorraussetzung ist eine explizite Klassendefinition, diese kann in ROL 2 konkret oder abstrakt sein, wobei die konkrete Klasse eine direkte Instanz haben kann, während die abstrakte Klasse dies nicht kann. Die abstrakte Klasse wird hauptsächlich zur Organisation der Klassenhierarchie benutzt. Wird zur Mengendarstellung der Funktionsklassen genutzt, die die Beziehungen zwischen Entitäten der realen Welt identifizieren. 41 • Set Klasse: • Tupel Klasse Bezeichnet eine Klasse von homogenen Mengen. Eine Set Klasse hat die Form{c}, wobei c wiederum eine Klasse ist. Bezeichnet Tupel. Eine Tupel hat die Form: (a1⇒c1, …, an ⇒cn), wobei a1, …, an Attribute und c1, cn Klassen darstellen.[Lui,99] Beispiel: (city ⇒ string, street ⇒ string) ist eine Tupel Klasse mit string als einziger Komponente der Klasse. Im Gegensatz zu OID - und Functor Klassen brauchen Tupel Klassen keine ausdrückliche Klassendefinition. Sie können direkt in der Klassendefinition einer anderen Klasse ausgeführt werden. Die Menge, die als Tupel Klasse bezeichnet wird, ist abhängig von der Menge der Komponenten dieser Klasse und wird automatisch vom System determiniert. Genau wie Tupel Klassen können Set Klassen direkt ohne explizite Definition benutzt werden, sobald ihre Klassenkomponenten definiert sind. Zusätzlich werden in ROL 2 zwei eingebaute Klassen, - Objekt und None -, unterstützt: Die erste bezeichnet alle Objekte, während die zweite leer ist. Objekte können Attribute besitzen, die untereinander in Beziehung stehen. Attribute, die in allen Instanzen der Klassen anwendet werden, werden Instanzattribute genannt. Voraussetzung ist ihre Deklaration in einer Klasse. Die Aussage zu einer Attributsdefinition hat die Form: c [[Public| Private]a==>c’[default o]], wobei c, c´ Klassen sind, a ist ein Attribut und o eine Instanz von c’. [Lui,99] Dies zeigt, dass a eine partielle Abbildung der Klasse c in der Klasse c’ darstellt. Wenn c’ eine Set Klasse ist, dann ist a ein set valued Attribute, aber wenn c’ eine Tupel Klasse darstellt, ist a ein tupel valued Attribute. Wenn c’ für eine Functor Klasse steht, dann ist a ein functor valued Attribute, sonst ist a ein atomic Attribute. person [birthyear ⇒ integer (1900..2000) default 1970; gender ⇒ char ({‘M’, ‘F’}) default ‘F’; spouse ⇒ person; parents ⇒ {person}]; address ⇒ (city ⇒ string, street ⇒ string)]; 42 Birthyear, gender, spouse sind atomic Attributes, parents ist ein set valued Attribute und adress ein tupel Attribute. Wenn die Werte für die Attribute birthyear und gender nicht gegeben sind, können default valued Attribute benutzt werden. Falls die Werte von spouse, parents und adresse auch nicht gegeben sind, ist eine Ausführung nicht mehr möglich. Eine Reihe von Attributsdefinitionen für gleiche Klassen c[A1], …, c[An] lassen sich in ROL 2 folgenderweise zusammenfassen: c[A1, …, An].[Lui,99] Verschiedene Objekte können gemeinsame Attribute besitzen. Voraussetzung ist, dass alle Instanzattribute in der Klasse deklariert werden. Um darzustellen, dass das definierte Attribut ein Klassenattribut ist, werden Attributsklassenbeschreiber gebraucht. Eine Klasse enthält zwei Arten von Informationen, die Attributsdefinition mit voreingestellten Werten (default value) und die Methodendefinition. In ROL 2 werden diese zwei Informationsarten zu einer Klassendefinition zusammengeschlossen. [abstract] class c [isa c1, , cl][[A1;…;Am;M1…Mn S1;…;So]], wobei c, c1, , cl mit l ≥ 0 Klassen sind, und c[A1],…,[Am] die Attributsdefinition von c darstellt; c [M1]…[Mn] steht für die Methodendefinition von c. Und S1;…;So stellt die Vererbungsbeschreibung mit m, n, o ≥ 0 dar Die Klassen werden mit Hilfe von insert Befehlen definiert. Als Beispiel wird die Klasse person eingeführt. Beispiel insert class person[ birthyear ⇒ integer(1900..2000) default1970; gender ⇒ char({’M’, ’F’}) default ’F’; spouse ⇒ person; parents ⇒ {person}; age( )⇒ integer(0..100){age( )→ :-birthyear→B, A=1998-B} ancestors( ) ⇒ {person} {ancestors( )→〈A〉 :-parents( )→〈A〉; {ancestors( )→〈A〉 :-parents( )→〈P〉, P.ancestors( )→〈A〉} children( ) ⇒ {person}{children( )→〈C〉 :-C.parents→〈Self〉} divorce( ){divorce( ) :- delete spouse→S, not spouse→Self} marry(person){marry(S) :- not spose→S1, not S.spouse→S2, insert spouse→S, insert S.spouse→Self}] 43 Um zu zeigen, mit welcher Methode die Instanz verbunden ist, wird in ROL 2 eine spezielle Variable Self eingeführt.[Lui,99] In ROL 2 wird die Klassenhierarchie mit zwei built-in Klassen, - Objekt und none -, beziehungsweise durch direkte subclass/ superclass - Definitionen organisiert. Eine Unterklasse erbt in ROL 2 alle Attribute, default values und Methoden direkt von ihrer Superklasse, und kann zusätzliche Attributdefinitionen, default values und Methoden einführen. Es gibt zwei Arten von Vererbung: Property-Vererbung und Instanz-Vererbung. Bei der Property-Vererbung erbt eine Unterklasse alle Instanzattribute mit deren default werten und Instanzmethoden direkt von der Superklasse. Klassenattribute und Methoden können nicht vererbt werden. In einer Instanz -Vererbung ist jede Instanz der Unterklasse eine undirekte Instanz aus der Superklasse. [Lui,99] Andererseits kann in der Property-Vererbung eine Unterklasse eine Attributsdefinition, default values und die Erbschaftsmethoden neu einführen, überschreiben oder blockieren. Hierdurch wird die mehrfache Vererbung ebenfalls unterstützt, wodurch Konflikte entstehen können. Beispiel: class employee[…room⇒string] class student[… room⇒integer default 321] class wstudent isa employee, student[…] Wie dargestellt, ist wstudent eine Unterklasse von employee und student. Diese Unterklasse erbt Attribute und Methoden von beiden Klassen. Das führt zu einem Konflikt beim Attribut ’room’. Zur Lösung dieses Konflikts werden vier verschiedene Methoden vorgeschlagen: User-Specified Priority: Hier werden die Unterklassen in einer Klassendefinition von links nach rechts geordnet. Nach diesem Prinzip wird wstudent das Attribut von room erben. Overriding: Soll wstudent die Attributsdefinition und das default value von room und nicht von employee erben, dann muss die Definition von student in wstudent wiederholt werden, dadurch werden Attribute von employee überschrieben. class wstudent isa employee, student[room⇒integer default 321] Mit dieser Methode wird die Verbindung zwischen dem Attribut room von student und von wstudent gebrochen, sodass jede Änderung der Attributsdefinition und der default values in student keine Wirkung auf wstudent hat. 44 Inheritance Path Selection: Es wird angenommen, dass employee und student die Methode income mit gleicher Signatur aber verschiedener Implementierung haben. Damit wstudent Attribut room und Methode income von student statt von employee erbt, kann folgende Definition benutzt werden: class wstudent isa employee, student[room, income( ) from student] Laut dieser Definition erbt wstudent nicht nur die Attributsdefinition, sondern auch das default value room von student. Explicite Renaming: Eine alternative Methode zur Lösung des oben beschriebenen Konflikts stellt die Umbenennung der Attribute und der Methoden, die zu diesem Konflikt führen, dar. Angenommen ein student hat zwei verschiedene rooms, erstes als student room und zweites als employee room. [Lui,99] Beispiel: class wstudent isa employee, student [employee.room as eroom; student.room as sroom] Objekte, Klassen und auch ihre Attribute können durch Methoden abgefragt und manipuliert werden. Die Methoden, die zur Manipulation von Objekten und deren Attributen benutzt werden, werden Instanz Methoden genannt. Methoden in ROL 2 sind regelbasiert, und müssen definiert und in der Klassendefinition gekapselt werden. Eine Instanz Methode besteht aus zwei Teilen, - Signatur und Implementation - und hat folgende Form: c[[public|private] op(c1,…, cn) [⇒cr]{R1;…; Rm}] , wobei c als Klasse in der Methode definiert ist. op(c1,…, cn) ⇒cr ist eine n-Stellige Signatur. Wenn cr leer ist, kann es weggelassen werden. Anstelle von cr, kann op(c1,…, cn) benutzt werden. Falls n=0, dann gilt: op( ) ⇒cr, um cr von den Attributen zu unterscheiden. age( ) ⇒integer(0..100) und ancestors( ) ⇒{person}sind zwei 0-ary Signaturen, während marry(person) eine unary Signatur ist. Auch hier lassen sich die Methoden c[M1],…,c[Mn] in c[M1,…,Mn] kombinieren. Wie bei objektorientierten Programmiersprachen, z.Bsp. bei c++ und Java, unterstützt ROL 2 Overloading. Mit dieser Methode können mehrere Methoden mit verschiedenen Signaturen in der gleichen Klasse benutzt werden.[Lui,99] 45 person[children( )⇒{person},{children( )→〈C〉:-C.parents→〈Self〉}, children(person)⇒{person},{children(P)→〈C〉 :-C.parents→{Self,P}, Self≠P}] Die beiden Methoden haben denselben Namen ’children’. Die erste Methode ist jedoch eine 0-ary Methode, während die Zweite eine unary Methode darstellt. In ROL 2 werden zwei Arten von Regeln unterschieden, eine Regelabfrage, welche Werte (values) ausgibt, und eine Update Abfrage, welche Updates der Datenbank übernimmt. Die Regel- und Update Abfragen werden jeweils auf unterschiedliche Weise ausgewertet. Die Auswertungsmethode bei der Regelabfrage entspricht der bottomup Methode, bei der Update Abfrage ist die Vorgehensweise top-down. ancestor( )→〈A〉 :-parents→〈A〉 ancestor( )→〈A〉 :-parents→〈A〉, P, ancestor( ) →〈A〉 marry(S): - not spouse→S1, not S.spouse→S2 insert spouse→S, insert S.spouse→Self Die erste und zweite Regel entsprechen Abfrageregeln: Wenn A ein Elternteil von Person ist, dann ist A auch ein Vorfahre von Person. Die dritte Regel ist eine Update Regel, die die Datenbank mit dem Befehl insert aktualisiert. Abfragen (Queries) in ROL 2 lassen sich in Schema Abfragen und Objekt Abfragen klassifizieren. Schema Abfragen werden benutzt, um Informationen über Klassen zurückzuholen, und können grob in Klassenabfragen, Attributdefinitionsabfragen, default value- und Methoden Abfragen klassifiziert werden. Objekt Abfragen können grob in Objektklassen-, Objektattribut-, und Methoden Abfragen unterteilt werden. Durch Objekt Abfragen werden Informationen über Objekte und Manipulationen von Objekten eingeholt, Objekt Abfragen lassen sich auch in Objektklassenabfragen, Objektattributabfragen und Methodenaufrufe klassifizieren. ROL 2 liefert zwei elementare Update Befehle: Insert und delete. Ein Update Befehl wird als eine Transaktion behandelt, die zu einem Erfolg oder Misserfolg führen kann. Bei einem Misserfolg hat die Transaktion keinen Effekt auf die Datenbank. Update Befehle werden zum Definieren und Manipulieren der Datenbanken benutzt. Update- Befehle können ebenfalls in Schema Updates und Objekt Updates klassifiziert werden. Der Benutzer kann durch ein Schema Update die Klassendefinition löschen, einführen oder modifizieren. Insert oder delete - Befehle werden zum Löschen oder Erzeugen von OID’s und Functor Objekten eingesetzt, bzw. wenn Objekten Attributswerte zugewiesen oder vorhandene Attributswerte gelöscht werden sollen. 46 Zur Modifikation von Attributswerten kann auch die Kombination von insert und delete benutzt werden. (OID’s hingegen können gelöscht bzw. neu erzeugt -, jedoch nicht modifiziert werden) Zur genauen Angabe eines komplexen Updates, wird die Kombination von Abfragen und Updates benutzt.[Lui,98] 47 4.3 C-Logic C- Logic basiert auf Maier´s O-Logic, die Begriffe wie Objektidentität, Labels, und Typen enthält. Diese Begriffe sind Grundlage für die Modellierung von komplexen Objekten. O-Logic ist eine Sprache, die die Semantik von komplexen Objekten beschreibt. Unterschiedliche Sprachen haben verschiedene Merkmale, und es ist nicht immer eindeutig, wozu die eine oder andere Semantik gebraucht wird, und wie durch sie komplexe Objekte unterstützt werden. Die Integration der Semantik von komplexen Objekten in verschiedene Sprachen ist nicht ganz einfach. C- Logic kann als eine Erweiterung von O- Logic angesehen werden. Zusätzlich zur Semantik von komplexen Objekten, hat beim Entwurf von CLogic auch Simplizität und Flexibilität eine wesentliche Rolle gespielt. C- Logic stellt keine neue Logik für komplexe Objekte dar, ihre Semantik ist auf einer Logik erster Stufe aufgebaut. Jede Formel in C- Logic kann in einer gleichwertigen Form in eine Logik erster Stufe transformiert werden. Diese Transformation unterstützt nur die fundamentalen Aspekte komplexer Objekte. Merkmale wie single-value Labels und static notation of types können in C- Logic hinzugefügt werden. (Mit Labels lassen sich Eigenschaften kennzeichnen und repräsentieren).[CW,98] C- Logic unterstützt zahlreiche gängige Merkmale von Mengen, und ermöglicht es dem Benutzer durch Beschreibung von komplexen Objekten eine Gruppe von Informationen zu liefern. In C- Logic werden Labels genutzt. Vorteilhaft ist dabei der Einsatz von multi-valued Labels. In der Logik erster Stufe gibt es drei Aspekte: 1. Mit der komplexen Beschreibung eines Objekts kann jeder Subteil der Beschreibung verfolgt werden. Beispiel: Von john[name⇒‘‘john smith’‘, age⇒28], kann john[name⇒‘‘john smith’‘] und john[age⇒28] verfolgt werden. 2. Verschiedene Teile der Beschreibug können zu einer Gesamtheit kombiniert werden. 3. Die Translation von Objektbeschreibungen in der Logik erster Stufe bringt Verständnis über komplexe Objekte. Objekte müssen eine Identität und Eigenschaften bzw. Label values besitzen. Unter Berücksichtigung der Eigenschaften können Objekte in verschiedene Klassen geteilt werden. Dabei hat eine Klasse zwei Aspekte, einen dynamischen - und einen statischen Aspekt. 48 Eine Klasse unter einem dynamischen Aspekt stellt eine Menge von Objekten oder OID’s in einer Klasse sowie deren Beziehungen dar. Der statische Aspekt repräsentiert die gemeinsamen Eigenschaften aller Objekte in dieser Klasse. Beschreibung der Syntax und Semantik von C-Logic sowie deren Transformation auf die Logik erster Stufe. Die Grundsyntax besteht aus (∧, ∨, ¬, ⊃, ∀, ∃) und der Menge von Objekten, bestehend aus: • • • • • einer (abzählbaren, unendlichen) Menge von Variablen; einer (abzählbaren) Menge von Funktionssymbolen; einer (abzählbaren) Menge von Prädikatsymbolen; einer Menge von Labels; einer partiell geordneten Menge von Typsymbolen; Falls L eine Objektsprache ist, dann wird die Semantik als ein Paar M=(M, I) definiert, wobei M ein nicht leerer Mengenbereich (Domain) -, und I eine Auswertungsfunktion darstellt, welche jedem Wert ein nicht -logisches Symbol zuweist: I(f) ∈ ρ[Mn à M] für jedes n-stellige Funktionssymbol f; I(ρ) ∈ ρ(Mn) für jedes Prädikatensymbol ρ I(l) ∈ ρ(M²) für jedes Label l; I(i) ∈ ρ(M) für jeden Typ i, wenn i1 ≤ i2, dann gilt I(i 1) ⊆ I(i2). Es wird angenommen, dass jede Menge eine Partialmenge von Symboltypen besitzt, die wiederum eine große Anzahl von Objekten haben. Für jede Formel in einer Objektsprache existiert eine gleichwertige Formel in der Logik erster Stufe. Diese Transformation in first order logic kann als Basisvorschrift zur Ausführung komplexer Objekte in der Logik erster Stufe genutzt werden.[CW,98] 49 4.3.1 Beschreibung und Berechnung komplexer Objekte Komplexe Objekte lassen sich durch Fakten und Regeln in Logik beschreiben. Die Argumentation bzw. Berechnung kann als logische Folgerung ausgeführt werden. Gegeben sei eine Objektsprache mit einer Untermenge von Formeln, die wie folgt definiert sind: Jedes Literal ist eine atomare Formel oder eine Negation von atomaren Formeln. Eine Klausel ist eine Disjunktion von Literalen: L1∨L2∨…∨Ln Eine definierte Klausel ist eine Klausel mit genau einem positiven Literal: A∨¬B1∨…∨¬Bm mit (m ≥ 0), wird auch geschrieben als: A:--B1,…, Bm. Eine negative Klausel ist eine Klausel, die kein positives Literal enthält: ¬B1∨…∨¬Bm , und wird geschrieben als: :--B1,…,Bm, Eine negative Klausel wird auch Query bzw. Goal genannt. Wenn i1 und i2 Typsymbole sind, dann ist i1 ≤ i2 eine Subtypdeklaration. Ein Programm ist eine endliche Menge von Subtypdeklarationen und Klassendefinitionen. Ein wichtiger Aspekt komplexer Objekte ist die Mengenmanipulation. C-Logic ist eine Logik erster Stufe und hat keine eigene Wertmenge. Andererseits lassen multi valued Labels die Benutzung von Mengen zu. Beispiel: person: john[childern⇒{bob,bill,joe}] :--person:john[childern⇒{X,Y}] sei ein Fakt und eine Query Nach der beschriebenen Semantik sind Labels im Wesentlichen binäre Prädikate. Fakt und Query können folgenderweise transformiert werden: person:john[children⇒bob, children⇒bill, children⇒joe]. :--person:john[children⇒X, children⇒Y]. X und Y können auf bob, bill und joe zeigen, um die Query (Abfrage) erfolgreich zu bewerten. Labels können auch als eine Funktionsmenge betrachtet werden, die jeder einzelnen Objektidentität wiederum eine Menge von Objekidentitäten zuordnet. Im obigen Beispiel ordnet children john eine Menge von Objekten zu, die aus {bob, bill, joe} besteht. Die Query kann als eine Frage nach einer Menge {X,Y} angesehen werden, welche in der Menge von children in Verbindung mit john enthalten ist.[CW,98] 50 4.4 F-Logic F-Logic ist eine Sprache, die deduktive und objektorientierte Konzepte, wie Objekte, Methoden Klassenhierarchien, Vererbung und Signaturen integriert. Ein Vorzug der F-Logic gegenüber anderen Ansätzen ist die Fähigkeit zur uniformen Behandlung von Daten und Methoden (z.B. Klassenhierarchie), die sie insbesondere als Grundlage zur Schemamanipulation und Integration heterogener Datenbestände interessant macht. F-Logic ist eine Sprache die zwei verschiedene Ansätze zur Erweiterung des relationalen Modells miteinander verbindet: Mit dem deduktiven Ansatz wird versucht, die Lücke zwischen Datenbanken und Anwendungen zu schließen oder zumindest zu verkleinern, indem die Mächtigkeit der Datenbankabfrage erweitert wird. Hierbei können Daten durch Regeln definiert sein, wodurch die Mächtigkeit rekursiver Abfragen gegeben ist. Insbesondere kann der deduktive Ansatz mit einer deklarativen, modelltheoretischen Semantik verbunden werden. Beim objektorientierten Ansatz steht die Erweiterung des Datenmodells im Vordergrund. Hierbei werden komplex strukturierte Objekte mit einer Objektidentität eingeführt, die hierarchisch angeordneten Klassen zugeordnet ist. Außerdem werden in F-Logic die Vorteile des Konzepts der High-level Methode (typisch für Frame basierte Sprachen) und well-defined Semantik kombiniert. [GR03] Frame-Logic beschäftigt sich - vereinfacht ausgedrückt - mit der Spezifikation von FStrukturen. F-Strukturen sind Universen (Klassen), die aus Objekten bestehen, und denen Attribute und Funktionen zugeordnet werden. Zusätzlich besteht zwischen diesen Objekten eine Klassenelementrelation. Mit Hilfe von Frame-Logic lassen sich genau diese Attribute, Funktionen und Relationen spezifizieren, so dass über eine solche F-Struktur Aussagen getroffen werden können. Um die Objektidentität einer F-Struktur aufzubauen, werden zunächst eine Menge von Objektkonstruktionen und Variablensymbolen benötigt. Ein Objektkonstruktor ist ein Funktionssymbol f mit einer zugehörigen Stelligkeit n. Mit Hilfe der Objektkonstruktoren und der Variablen lassen sich – genau wie in Algebren - Terme konstruieren: Jedes 0- Stellige Funktionssymbol und jedes Variablen- Symbol ist ein Term. Ist f ein n-stelliges Funktionssymbol und sind t1, …, tn Terme, so ist f (t1, …, tn ) ebenfalls ein Term. [Glausch] Im Folgenden werden diese Terme ID-Terme genannt, da sie zur Objektidentifikation benutzt werden. 51 Für eine F-Struktur muss nun als nächstes die Menge aller Objekte (Klassen) festgelegt werden. Weiter müssen alle Objektkonstruktoren durch konkrete Funktionen mit Wert- und Bildbereichen in U interpretiert werden, das heißt: zu jedem Funktionssymbol f wird eine Funktion zugeordnet, die die Semantik von f festlegt. Durch Ersatz aller Funktionssymbole in einem variablenfreien Term, lassen sich die ID- Terme, die keine Variablensymbole enthalten, mit den dazu gehörenden Funktionen ausrechnen. Als Ergebnis erhält man ein konkretes Objekt des Universums U. Aus diesem Grund werden variablenfreie ID-Terme auch logische Objekt ID’s genannt. Denn sie identifizieren genau ein Objekt des Universums. Objekte in F-Logic sind entweder komplexe Objekte oder Klassen von Objekten. Klassen in F-Logic werden wie in einem Frame basierten Formalismus betrachtet. Das heißt, dass eine Klasse als Instanz von einer Superklasse betrachtet wird. Dadurch ist die Vererbung in der Semantik von F-Logic aufgebaut. ID- Terme werden auch als Objekte oder als OID’s betrachtet. Methoden in F-Logic sind Funktionen. Sie liefern einen Wert oder eine Menge von Werten zurück. Klassen und Unterklassenvererbung werden durch Set value Funktionen modelliert. Deklarative Definitionen von Methoden sind auch möglich, (da ID-Terme auch Labels benutzen können). Im Folgenden wird anhand eines Beispiels gezeigt wie Klassenbeziehungen, Unterklassenbeziehungen und Methoden in F-Logic aufgebaut sind: ’Alice’ und ’Bob’ seien 0 stellige Funktionssymbole; ’Paar’ ein 2 stelliges Funktionssymbol und ’X’ ein Variablensymbol. Dann stellen ’Bob’‚ ’Paar (Alice, Bob)’ und ’Paar(Alice, X)’ ID Terme dar. Diese Terme besitzen jedoch noch keine Semantik. Dafür muss ein Universum von Objekten festgelegt werden. Dieses Universum enthalte die Personen Alice und Bob und Partnerschaft von Alice und Bob, geschrieben als AliceundBob. Den Funktionssymbolen wird folgende Semantik zu geordnet: Das Symbol Alice wird durch eine 0 stellige Funktion A interpretiert, die Alice zurück liefert. Das Symbol Bob wird analog durch eine Funktion B interpretiert, die Bob ergibt. Das Symbol Paar wird durch die zweistellige Funktion P, die das Tupel (Alice, Bob) auf das Objekt AliceundBob abbildet, interpretiert. Damit können nun die oben gebildeten Terme berechnet werden. Der Term ’Bob’ ergibt über die Funktion B das Objekt Bob. Der Term ’Paar(Alice, Bob)’ ergibt nach Einsetzen der Interpretation P(A(), B()) = P(Alice, Bob) = AliceundBob. Der Term ’Paar(Alice, X)’ lässt sich nicht auf diese Weise berechnen, sondern benötigt die Interpretation der Variablensymbole. Dies geschieht über eine Funktion V, die jedem Variablensymbol ein Objekt des Universums zuordnet. 52 V wird in diesem Fall als eine Belegung bezeichnet. V sei also eine Belegung, die X den Wert Bob zuordnet. Dann kann der Term ’Paar(Alice, X)’ wie oben ausgerechnet werden, und es ergibt sich das Objekt AliceundBob. In F-Logic existiert keine scharfe Trennung der Begriffe Objekt und Klasse. Ein Objekt, welches Element einer Klasse ist, kann selber wiederum Klasse einer anderen Menge von Objekten sein. Diese Element-Klasse-Beziehung wird in einer F-Struktur durch eine binäre Relation ∈ dargestellt. Diese Relation kann sogar zyklisch oder reflexiv sein, und sollte daher also nicht mit der ∈-Relation der Mengentheorie verwechselt werden. Syntaktisch wird die Element-Klasse-Beziehung durch die molekulare Formel ’O: K’ dargestellt, wobei ’O’ und ’K’ ID-Terme sind. O: K bedeutet, dass das Objekt, das durch den ID-Term O beschrieben wird, Element der Klasse ist, die durch den ID-Term K beschrieben wird. Im Folgenden wird der ID-Term O, also das Objekt, das durch den ID-Term O referenziert wird, abkürzend als ’Objekt O’ bezeichnet.[KL,97] Die im obigen Beispiel beschriebene F-Struktur wird um die Objektkonstruktoren Mensch und Spezies erweitert, die durch Mensch und Spezies interpretiert werden. Mit Mensch sei die Klasse aller Menschen gemeint. Dies sollte nicht mit der Menge aller Menschen verwechselt werden. Mensch ist ein Objekt, das die Menge aller Menschen bezeichnet, es ist nicht die Menge selbst. Spezies sei die Klasse aller Speziesklassen. Für die Element-Klasse-Beziehung wird festgelegt: Bob ∈ Mensch und Alice ∈ Mensch. Dies bedeutet, dass die Objekte Bob und Alice Objekte der Klasse aller Menschen sind. In beiden Beziehungen tritt Mensch als Klasse auf. Zusätzlich gelte, die Beziehung Mensch ∈ Spezies, in der Mensch die Rolle des Objektes der Klasse Spezies übernimmt. Syntaktisch können diese Zusammenhänge durch die molekularen Formeln: Alice: Mensch, Bob: Mensch und Mensch: Spezies dargestellt werden. Die zweite Art von Beziehung, die zwischen Objekten einer F-Struktur bestehen kann, ist die Unterklassenbeziehung. Semantisch wird diese durch eine irreflexive Halbordnung dargestellt. Syntaktisch wird die Unterklassenbeziehung durch die Formel: T:: K 53 abgebildet. Dies bedeutet, dass die Klasse (bzw. das Objekt) T eine Unterklasse der Klasse K ist. Diese F-Struktur wird nun um die Objektkonstruktoren Mann und Frau und ihren entsprechenden Interpretationen erweitert. Mit Mann sei die Klasse aller Männer -, mit Frau die Klasse aller Frauen gemeint. Für diese Objekte gelte die Beziehungen: Mann < Mensch und Frau < Mensch, das heißt, Mann und Frau sind Unterklassen der Klasse Mensch. Syntaktisch werden die Beziehungen durch die molekularen Formeln Mann :: Mensch und Frau :: Mensch spezifiziert. In der Objektorientierung sind Methoden Funktionen, die im Kontext eines Objektes aufgerufen werden, und dabei eventuell eine Zustandsveränderung vornehmen oder ein Resultat zurückliefern. Die Basis der Frame-Logic beschäftigt sich aber nicht mit dem dynamischen Verhalten objektorientierter Systeme. F-Logic kann also nur funktionale Methoden modellieren. In F-Logic werden Methoden semantisch durch partielle Funktionen dargestellt. Sie können auf eins bis n stellige Tupel von Objekten des Universums angewendet werden. Sofern sie an dieser Stelle definiert sind, liefern sie als Ergebnis ein Objekt des Universums zurück. Die erste Stelle des Argumenttupels stellt dabei das Objekt dar, das in diesem Kontext der Methode aufgerufen wird.[KL,97] In einer F-Struktur sind aus Gründen der Einfachheit alle Methoden Elemente des Universums. Das bedeutet, Methoden werden in F-Logic mit Hilfe von ID-Termen wie Objekte referenziert. Um Konflikte zu vermeiden wird deshalb gefordert, dass jedes Objekt auch als Methode - und umgekehrt - verwendet werden kann. Gegebenenfalls kann die Menge der verwendeten Methoden und die Menge der verwendeten Objekte im Universum einer F-Struktur auch disjunkt sein. Syntaktisch können in F-Logic Methoden durch sogenannte objektmolekulare Formeln spezifiziert werden. Allgemein haben objektmolekulare Formeln folgende Form: O[a1,…, an], wobei O ein ID-Term ist, der das zu beschreibende Objekt referenziert, und a1, …, an Methoden-Ausdrücke sind, die die Methoden im Kontext von O näher beschreiben. Es gibt eine Reihe verschiedener Formen von Methodenausdrücken. Im Folgenden werden zwei von ihnen näher beschrieben: Der skalare Methodenausdruck und der Signaturausdruck. Ein skalarer Methodenausdruck hat die Form M Θ A1, …, An → R, wobei M, A1, …, An und R ID-Terme sind. 54 Die molekulare Formel O [M Θ A1, …, An → R] bedeutet, dass die Methode, die durch den ID –Term M bestimmt wird, aufgerufen auf das Objekttupel (O, A1, …, An ) das Ergebnis - R- liefert. Auf diese Weise können einzelne Stellen von Methoden spezifiziert werden. [AL] Werden zusätzlich Variablen und Quantoren verwendet, lassen sich über unendliche Objektmengen auch Methoden vollständig spezifizieren. Dies entspricht der Spezifizierung von Funktionen in der Prädikatenlogik. Die bisher betrachtete F-Struktur wird nun um die Methode Partner erweitert. Partner bildet das einstellige Tupel (Alice) auf das Objekt Bob ab. Anders ausgedrückt bedeutet dies, dass ’Partner’, - aufgerufen im Kontext von Alice und ohne Argumente -, das Objekt Bob ergibt. Analog bildet Partner das Tupel (Bob) auf das Objekt Alice ab. Partner selbst ist Element des Universums, also auch ein Objekt. Aber es hier als Objekt zu verwenden, macht in diesem Beispiel wenig Sinn. Die Methode Partner sei des Weiteren über das Funktionssymbol Partner referenzierbar. Damit lassen sich über die molekularen Formeln Alice[Partner Θ → Bob] und Bob [Partner Θ → Alice] Partner für die Objekte Alice und Bob syntaktisch spezifizieren. Ein wesentliches Konzept der Objektorientierung ist die Typisierung: Bestimmte Methoden können nur mit Argumentobjekten bestimmter Klassen aufgerufen werden, und dürfen ihrerseits nur Objekte bestimmter Klassen als Ergebnis zurückliefern. Dieses Konzept wird in F-Logic durch Signaturausdrücke abgebildet. Ein Signaturausdruck hat die Form: MΘ A1, …, An ⇒ R. Die Molekulare Formel K[MΘA1,…, An ⇒ R] bedeutet, dass es erlaubt ist, im Kontext von Objekten der Klasse K die Methode M mit Argumentobjekten der Klasse A1 bis An aufzurufen. Der Ergebnistyp muss dabei Objekt der Klasse R sein. Dies entspricht in der Objektorientierung der Deklaration einer Methode M in der Klasse K mit den Argumenttyp A1 bis An und dem Rückgabetyp R. Semantisch werden Methodensignaturen in F-Strukturen durch partielle Funktionen dargestellt. Diese ordnen den Argumenklassentupeln die benötigten Rückgabeklassen zu. Der genaue Aufbau der Funktion ist über einige zusätzliche Eigenschaften festgelegt, die für ein erstes Verständnis der F-Logic irrelevant sind und aus diesem Grund hier nicht aufgeführt werden. [KL,97] Mit Hilfe der Signaturausdrücke kann also die Methode Partner näher charakterisiert werden. Über die Formel Mensch[PartnerΘ⇒Mensch] wird festgelegt, dass die Methode Partner im Kontext eines Objektes der Klasse Mensch ohne Argumente aufrufbar ist. Wird sie ohne Argument aufgerufen, muss sie ein Objekt der Klasse Mensch zurückliefern. Da Alice und Bob Objekte der Klasse Mensch sind, gilt diese Einschränkung also auch für Alice und Bob. Nach der obigen Definition von Partner wird diese Einschränkung aber auch erfüllt. 55 Der Zusammenhang zwischen den Methoden und den Signaturen ist nicht Bestandteil der F-Strukturendefinition. Das heißt, dass es in F-Strukturen Methoden geben kann, die gegen die Signaturen verstoßen. Falls die Methoden einer F-Struktur jedoch Signaturen respektieren, so spricht man von einer typisierten F-Struktur. Die F-Formeln werden aus den molekularen Formeln (alle Formeln der Form O:K, U::K, O[…]) mit Hilfe der logischen Operatoren und Quantoren aufgebaut: Jede molekulare Formel ist eine F-Formel. Sind φ, ψ F-Formeln, so sind:φ∨ψ, φ∧ψ und ¬φ F-Formeln. Ist X zusätzlich ein Variablensymbol, so sind auch ∀ x : φ und ∃ x : φ F-Formeln. Sind eine F-Struktur und eine Belegung gegeben, so kann der Wahrheitswert einer F-Formel bestimmt werden. Dazu müssen zunächst die Wahrheitswerte aller molekularen Teilformeln definiert werden. Mit Hilfe der Belegung lassen sich alle IDTerme in Objekte umrechnen. Schließlich muss noch überprüft werden, ob die molekulare Formel der entsprechenden Semantik der F-Struktur entspricht. Der Wahrheitswert einer gesamten F-Formel ergibt sich dann wie in der Prädikatenlogik: ∨ ∧ und ¬ werden als bekannte logische Verknüpfungen interpretiert. ∀ x: φ ist unter der Belegung ν erfüllt, wenn φ für alle Belegungen erfüllt ist, die ν bis auf die Variable x gleichen. Analog ist ∃ x φ wahr, wenn eine Belegung existiert, die ν bis auf die Variable x gleich und φ wahr macht. Nun können weitere Eigenschaften der Methode Partner logisch spezifiziert werden. Beispielsweise soll festgelegt werden, dass die Methode Partner im Kontext von Objekten der Klasse Mensch symmetrisch ist. Dies kann über folgende F- Formel angegeben werden: ∀ X : ∀ Y : (X : Mensch ∧ X [PartnerΘ → Y]) → Y[PartnerΘ → X]. Die Schreibweise φ → ψ ist dabei eine Kurzform für ¬φ ∨ ψ. Die F-Formel ist also folgendermaßen zu lesen: Für ein beliebiges Objekt X der Klasse Mensch muss gelten, dass die Methode Partner, die im Kontext des Ergebnisses der Methode Partner aufgerufen wurde, im Kontext von X selbst wiederum X ergeben wird. Wenn also der Mensch X einen Partner Y hat, dann muss Y den Partner X haben. Für die Frame- Logic existiert analog zur Prädikatenlogik eine vollständige und korrekte Beweistheorie, mit deren Hilfe sich aus einer Menge von F-Formeln alle daraus folgenden F-Formeln bestimmen lassen. 56 Ein F-Logic Programm ist eine Menge von Regeln. Fakten und Abfragen sind Spezialfälle von Regeln. Die Abfragen in FLORID werden getrennt vom übrigen Programm behandelt. Die Regeln basieren auf den Horn Klauseln. Fakten Abraham Sarah Isaac Ismael Jacob Esau :man :woman :man[fatheràabraham; :man[fatheràisaac; :man[fatheràisaac; :man[fatheràisaac motheràSarah]. motheràhagar:woman]. motheràrebekah:woman]. motheràrebekah]. Regeln x[son->>{Y}] x[son->>{Y}] x[daughter-->>{Y}] x[daughter-->>{Y}] :Y:man [fatheràx]. :Y:man[motheràx]. :Y:woman[fatheràx]. :Y:woman[motheràx]. Abfragen ? sys. eval.//This is a system command ?x:woman[son->>{Y[fatheràAbraham]}]. In F-Logic fangen Objektnamen immer mit einem Kleinbuchstaben an, wie sarah, mutter, man. Variablennamen werden mit einem Grossbuchstaben wie X und Y geschrieben. Allgemein haben Regeln folgende Form: Logische Formeln: Bindungsformeln(Bedingungsteil). Logische Formeln gelten nur dann, wenn Bedingungen gelten. (Horn Klausel) Die Objekte in F-Logic sind entweder komplexe Objekte oder Klassen von Objekten. Die Basisobjekte sind Konstanten von F-Logic. Objektkonstruktoren (Elemente aus f) sind logische Funktionssymbole, mit arity ≥ 1, und werden zur Konstruktion neuer Objekte genutzt.[AL] 57 4.5 Chimera Chimera ist ein neues Modell für eine Datenbank und eine Datenbanksprache, die als Schnittstelle der IDEA Methode entworfen wurde. Ziel dieser Methode ist die Integration von objektorientierten, aktiven und deduktiven Datenbanktechnologien in einem einzigen Modell. Also die Zusammensetzung aktiver und deduktiver sowie objektorientierter Datenmodelle und deren Manipulationstechniken innerhalb eines definierten Rahmens (mit Regeln und Operationen). Der Begriff ’Chimera’ entstammt der griechischen Mythology: Eine Kreatur mit dem Kopf eines Löwen, dem Körper einer Ziege und dem Schwanz einer Schlange. Übertragen auf die Datenbanksprache stellt jedes der Körperteile eine der drei Komponenten dieser zusammengesetzten Sprache dar. Das wichtigste Merkmal von Chimera ist die Entwicklung einer Regelsprache für aktive und deduktive Regeln. Diese Regelsprache wiederum ist in einem objektorientierten Kontext integriert. Das Chimera-Modell unterstützt zwar nicht die ’Relationship Idee’ von Objekt und Entity-Relationship Modellen, aber diese werden von den meisten Datenbankprodukten ebenfalls nicht unterstützt. Chimera als Designmodell zwingt daher die Entwickler ihre Beziehungseigenschaften in eine geeignete Struktur zu transformieren, um diese so einer finalen Implementation anzunähern. Chimera besteht aus einem konzeptuellen Modell (objektorientiertes Datenmodell) und einer konzeptuellen Sprache (Chimera Language), die die Datendefinition, die deklarative Abfrage, Datenmanipulationsregeln, passive und aktive Regeln, Restriktionen (Constraints) und Operationen unterstützt. Chimera ist der erste Versuch, die Konzeptentwicklung von aktiven, deduktiven und objektorientierten Datenbanken in eine systematische Methode zu kombinieren. Der Kern dieses Modells ist durch Typen, Klassen und einer einfachen Generalisationshierarchie gegeben. Jede Klassendefinition beinhaltet einen einzigen geeigneten Typen. Jeder Objekttyp umfasst eine Klassendefinition. Dieser Objekttyp wird nur in einer Klasse eingesetzt, so dass die Beziehung zwischen Objekttypen und Klassen one-to-one ist. Alle Objekte in Chimera müssen zu einer Objektklasse gehören. Typdefinitionen (Definitionen von Struktur und Verhalten) folgen direkt aus der Klassendefinition. Attributsklassen sind Funktionen, die ganze Klassen in einem einzigen Wert abbilden. Durch Operationsklassen wird die gesamte Klasse manipuliert und nicht nur einzelne Instanzen. Values werden durch Typen oder Klassen bestimmt, meist atomic values wie integer und string. Diese sind vordefiniert und können nicht durch den Anwender manipuliert werden. Konzepte wie integer und string werden aber auch nicht als Klasse, sondern als Typ betrachtet[CM,94] Eine Schemadefinition in CL (Chimera -Language) ist eine Kollektion von gerichteten (targeted) und ungerichteten (untargeted) Definitionen. Jeder definierte Typ und jede definierte Klasse ist ein Ziel (Target). 58 Merkmale, wie Attribute und Operationen, welche im Kontext von Targets definiert sind, haben einen Bereich (Domain), der die Grenze für diese Targets bildet. Targets ermöglichen ein passendes Design und einen bestimmten Informationsgrad. Dies ist typisch für die objektorientierte Entwicklung. Einige Informationen im Schema (Kontext eines Types oder einer Klasse) lassen sich jedoch nicht zusammenfassen. Abgeleitete Informationen oder Triggereffekte mehrerer Klassen, sowie eingeschränkt zusammenhängende Zustände von Objekten mehrerer Klassen werden untargeted genannt. In CL können zur Informationsherleitung passive Regeln angewendet werden. Vergleichbar zu deduktiven Datenbanken werden passive Regeln in folgenden Fällen verwendet: • • • Wenn abgeleitete Attribute Werte besitzen können, die durch Regeln, anstatt durch Update Operationen definiert sind. Im Kontext von Klassenhierarchien. Untargeted views werden immer durch passive Regeln definiert. Zusätzlich zur Basisstruktur und dem Verhaltenskonzept von Attributen und Operationen bietet Chimera zwei weitere Konzepte: Constraint und Trigger. Dabei können beide Konzepte gerichtet (targeted) oder ungerichtet (untargeted) sein. Constraints werden immer durch passive Regeln, und Trigger durch aktive Regeln ausgeführt. Die Implementation von Constraints erfolgt durch eine Menge von untargeted Regeln. Es gibt auch targeted Constraints, die jedoch nicht neu definiert werden können. Aufgrund der Einmaligkeitsbedingung muss ihre Bezeichnung mit Rücksicht auf alle targeted Constraints der Klasse gewählt werden. Jedes Constraint hat einen Outputparameter vom Typen der Klasse, in welchem es definiert ist. Vergleichbar zu den passiven Regeln in Chimera, welche als deklarative Mittel zur Ausführung bestimmter Konzepte dienen, gibt es in Chimera noch zwei weitere Kategorien zur Ausführung von imperativen Konstrukten: Trigger und Operationen. Chimera unterstützt Set– oriented Trigger. Diese werden während der Durchführung von Datenbankoperationen aktiviert, und sind während der gesamten Berechnungen reaktionsfähig. In Chimera folgen Trigger dem event- condition- action Muster von aktiven Datenbanken. Event entspricht einem Datenbankzugriff zur Wiederherstellung und Manipulation. Condition ist eine deklarative Formel, die den Zustand einer Aktivität bewertet, bevor eine Reaktion ausgelöst wird. Jede Reaktion ist eine Kette von einem oder mehreren Prozeduraufrufen, die bei jeder einzelnen Datenbankberechnung ausgeführt werden kann. Eine Query ist eine Operation, die ausgeführt wird, während ein Term im Kontext einer passiven Regel bewertet wird. Einfacher ausgedrückt, können aktive Regeln als eine Tripel betrachtet (Event– Condition– Action / ECA) werden. Event entspricht der Datenmanipulation in Chimera, Condition ist ein deklarativer -, und Action ein prozeduraler Ausdruck. 59 In einer aktiven Datenbank bestehen die ECA- Regeln aus Ereignissen, Bedingungen und Aktionen. Diese Regeln bewirken bei Eintritt eines Ereignisses, dass die Bedingungen überprüft werden, und falls diese erfüllt sind, die Aktion ausgeführt wird. Sobald eine Menge von Regeln definiert wird, überwacht das aktive Datenbankmanagementsystem (DBMS) alle relevanten Ereignisse. Das Eintreten jedes relevanten Ereignisses wird sofort entdeckt und die für die Regelausführung zuständigen Komponenten werden benachrichtigt. Dieser Vorgang wird Ereignissignalisierung genannt. Dabei werden die für dieses Ereignis definierten Regeln nacheinander ausgelöst und anschließend ausgeführt.[Schubert, 99] Chimera unterstützt ein breites Typensystem, das bedeutet, dass die Entwickler in Chimera die Attributstrukturen weitgehend frei bestimmen können. Ein Typensystem mit vergleichbaren Merkmalen kann durch herkömmliche, objektorientierte Datenbanken unterstützt werden. Objektidentifikatoren weisen auf Objekte und sind in die Menge der möglichen Typen eingeführt. Typen werden durch atomic Types und strukturierte Typen klassifiziert. • • Atomic Types werden entweder durch die Programmierungsumgebung oder durch die Implementationssprache festgelegt, wie oid, integer, real, boolean, string und enumeration (benutzerdefiniert). Strukturierte Typen (Set, List, Record) Die Semantik von Set Types ist mengenorientiert, das heißt, es gibt keine doppelten Elemente im Gegensatz zu List Types, wo doppelte Elemente vorkommen können. Es ist möglich, den Typen (atomic oder strukturiert) einen benutzerdefinierten Namen zu geben. Diese Eigenschaft ist für Anwendungen wie zum Beispiel Wiederholung auf komplexe Typen, sehr sinnvoll. Dadurch wird die Typdefinition ausgeklammert und kann somit einmal für alle benutzt. Benutzerdefinierte Typen, (Named Types), werden durch Typdefinition eingeführt und unterstützen nicht immer die gesamte Value Menge. Chimera ermöglicht die Vereinigung von Constraints mit Named Types. Typdefinition ::= ‘’defined’’ ‘’value’’ ‘’type’’ ‘’type-name’’:’’type’’ [‘’constraint’’ constraint-names] ’’end’’ Es gibt keine Beschränkungen bezüglich strukturierter Typen, denn sie lassen sich durch rekursive Verwendung von atomaren und abstrakten Typen (strukturiert) konstruieren. Eine Besonderheit ist der Typ OID, der nicht explizit benutzt werden kann. Wenn ein Attribut auf ein Objekt einer anderen Klasse verweisen soll, wird der entsprechende Klassenname verwendet, wobei dann intern dafür der OID Typ benutzt wird. Folgende vereinfachte BNF-Notation zeigt die Chimera Syntax für Werttypen: 60 type::= atomic-type | structured-type | type-name atomic-type::= ‘’boolean’‘ ‘‘integer’‘ |’‘real’‘ |’‘string’‘ | class-name | enumerationtype enumeration’‘{‘‘user-defined-symbols’‘}’‘ structured-type::= ‘‘list-of’‘ ‘‘(‘‘type’‘)’‘| ‘‘set-of’‘ ‘‘(‘‘type’‘)’‘ | ’‘record-of’‘ ‘‘(‘‘fields’‘)’‘ field::= label ‘‘:’‘ type Klassen bilden die Hauptkonstrukte für objektorientierte Ansätze. In der Terminologie von Chimera werden Klassen als Objektklassen und Instanzen von Klassen, (also Objekte), als Objekttypen bezeichnet. Die Schemadefinition ist auf Klassen aufgebaut, die Targets genannt werden. Die Definition der Klasse wird von der Definition ihrer Signatur und Implementation getrennt. Die Klassendefinition besteht aus zwei Teilen: Signatur und Implementation. Die Signatur beschreibt die Klassenstruktur, und insbesondere ihre gesamten Komponententypen. Die Implementation stellt die Semantik der Komponenten dar, und muss einen Wert haben. Die Objekte in einer objektorientierten Datenbank werden durch die Methoden manipuliert. Eine Manipulationsmethode hat dieselben Komponenten wie die Klassendefinition: Die Signatur und die Implementation. Im Folgenden sind Klassenkomponenten in Chimera aufgelistet:[CF,97] Object-class-definition ::= “define” “object” “class” class-name [ [“derived”] “superclass” class-name ] [“attributs” attribute-defs] [“constraints” constraints-defs] [“operations“ operations-defs] [“triggers” triggers-defs] [“key” key-defs] [“unique” key-defs] “end;” Superklassen (Oberklassen): Mit der Definition der Superklassen lassen sich Klassenhierarchien gemäß des objektorientierten Konzepts der Vererbung realisieren. Attribute: In den Attributen werden die eigentlichen Objektinformationen gespeichert. Die Summe aller Attributwerte definiert dabei den Zustand, in dem sich das Objekt gerade befindet. 61 Constraints: Bezeichnen sogenannte Integritätsbedingungen (IBs). Integritätsbedingungen beschreiben inkonsistente Datenbankzustände. Zur Definition dieser IBs werden deduktive Regeln verwendet, die im Gegensatz zu den anderen deduktiven Regeln eine besondere Interpretation haben. Diese Interpretation heißt „denial form“ und bedeutet, dass eine Inkonsistenz eintritt, sobald eine Wertbindung für den deklarativen Ausdruck im Regelkopf erfolgt. Eine Wertbindung hat hier zur Darstellung einer Einschränkung des Inhaltes einer Datenbank jedoch eine negative, “unerwünschte“ Bedeutung. Operation: Diese wird eingesetzt, um den Objektstatus zu ändern. Formal gesehen ist eine Operation eine Abbildung, die Objekte von einem Zustand in einen anderen überführt. In Chimera wird das Konzept der Polymorphie unterstützt, das heißt ein Objekt einer Unterklasse kann eine eigene Methode für die von der Superklasse vererbten Operationen implementieren. Triggers: Setzen das Konzept der aktiven Regeln um. In Chimera werden Trigger in Abhängigkeit von Datenbankereignissen (delete, modify, create, ..) und bestimmten Bedingungen ausgelöst, das heißt der prozedurale Aktionsteil der Regel wird ausgeführt. Aktive Regeln werden vom Datenbankmanagementsystem autonom verwaltet und automatisch ausgeführt, sobald die triggerspezifische Situation eintritt.[Schubert,99] Special Key: Definiert die klassischen Primärschlüssel- Attribute. Unique: Bietet die Möglichkeit, Sekundärschlüssel zu definieren. Attribute einer Klasse beschreiben die Instanzstruktur der Klasse. Sie werden durch eine Menge von Attributsspezifikationen deklariert, die die Namen und die Domain der Attribute bestimmen. Extensionale Attribute werden ausdrücklich durch Einführung neuer Objekte mit expliziten Attributswerten implementiert. Jedes abgeleitete Attribut wird durch eine Menge von deduktiven Regeln implementiert. In Chimera wird eine Objektklasse durch Klassensignatur, Klassenimplementation und Trigger definiert. Die Implementierung von Triggern erfolgt jedoch in einer getrennten Spezifikation (imperative Sprache). Der Name einer Objektklasse muss unter Berücksichtigung der Menge aller Klassen und Typnamen einmalig sein. Das heißt, es darf keine andere Objektklasse, Value Klasse oder Typklasse mit gleichem Namen existieren. Jede der oben genannten Komponenten kann fehlen. Zur Klarheit sollten jedoch die Namen der verschiedenen oben aufgeführten Komponenten bestimmt werden. Klassendefinition in Chimera. Beispiel: 62 define object class person attributes name: string nationality: string notnull, birthday: data, vatCode: string, age: integer derived, income: integer, profession: string, constraints toolowIncome operation changeIncome(in Amount: integer) triggers incomereport key (vatCode) unique (name,birthday) end. Klassen können in einer Generalisierungshierarchie organisiert werden. Jede Unterklasse wird durch einen Hinweis auf eine Superklasse definiert. Die Namen aller direkten Superklassen einer Klasse werden ebenfalls definiert. Um eine Subclass-relationship zu bestimmen, müssen folgende Punkte beachtet werden. • • • • • Alle Objekte einer Unterklasse existieren auch in der Superklasse. Es gibt für jedes Objekt in einer Unterklasse genau ein Objekt in der Superklasse mit gleichem OID Attribute, Operationen, Constraints und Trigger, die für die Superklasse definiert sind, gelten auch für die Unterklasse. Attribute, Operationen, Constraints und Trigger, die mit der Einführung der Unterklasse eingeführt werden, müssen mit der Superklasse identisch sein. Ein Objekt kann in mehreren Unterklassen existieren ohne eine direkte Unterklassenhierarchie. Mehrfachvererbung von C auf die Klassen c1,…,cn sind erlaubt. Es existiert eine Superklasse als gemeinsamer Vorfahre von c1,…,cn. Instanzen können in einer Unterklasse explizit eingeführt oder gelöscht werden. Zum Verständnis des Aufbaus der Generalisierungshierarchie ist es sinnvoll die Semantik der Manipulation informal und kurz zu beschreiben: 63 • • • • Create kann in jeder Klasse einer Generalisierungshierarchie angewendet werden. Durch die Anwendung dieser Regel werden neue Elemente in der konkreten Klasse sowie in allen Klassen der Hierarchie gebildet. Specialize wird an zwei Klassen in einer Generalisierungshierarchie angewendet, falls die erste eine Superklasse für die Letztere ist. Als Resultat werden die Objekte der 1. Klasse auch zu Objekten der letzteren Klasse, und damit auch zu Objekten aller dazwischen liegenden Klassen. Generalize wird an zwei Klassen in einer Generalisierungshierarchie angewendet, wenn die 1. Klasse eine direkte Unterklasse ist. Als Resultat werden alle Objekte der 1. Klasse, auf die die Generalisierung angewendet wird, von dieser Klasse und damit auch von allen dazwischen liegenden Klassen entfernt. Delete kann auf jede Klasse in einer Generalisierungshierarchie angewendet werden. Als Konsequenz der Generalization und Deletion werden einige OID’s ungültig. Das Konzept der Vererbung kann entweder neu definiert oder überschrieben werden. Die Redefinition erfordert jedoch die Einführung des Subtypen -Begriffs. In Chimera kann eine Klasse (Objektklasse) als Unterklasse von einer oder mehreren existierenden Objektklassen deklariert werden. Eine Unterklasse erbt Attribute, Operationen, Constraints und Trigger von der Superklasse. Wenn ein neues Objekt eingeführt wird, wird dadurch auch eine neue Subtypenbeziehung in Objekttypen eingeführt. Durch folgende Regeln werden Subtypen in Chimera definiert. wenn user -defined value type T : T1 gilt, dann ist T ein subtype von T1 wenn T ein subtype von T1 ist, dann ist set-of(T) ein subtype von set-of(T1) wenn T ein subtype von T1 ist, dann ist list-of(T) ein subtype von list-of(T1) wenn T = record-of (l1: T1,l2:T2,…,ln:Tn) ein record Type ist, dann ist jeder record Type record-of (l 1:D1, l2:D2,…, ln:Dn) ein subtype von T für jeden Komponententyp Di, das identisch ist mit den Komponenten Ti oder einem Subtype des entsprechenden Type Ti. Die Signatur eines Attributs oder einer Operation kann umgeschrieben werden durch Spezialisierung der Attributtypen bzw. einem oder mehreren Operationsparametern. Inputparameter der Operationen können auf zwei Wegen redefiniert werden: 1. 2. Durch das Ersetzen von Typen in der Superklasse mit einem geeigneten Supertype. Durch Das Ersetzen von Typen in der Superklasse mit einem geeigneten Subtype. 64 Auf eine neu definierte Signatur wird durch Einfügen einer geeigneten, redefinierten Komponente der Subklassendefinition hingewiesen. Es muss beachtet werden, dass auch extensional und intensional abgeleitete Attribute neu definiert werden können. Diese können jedoch nicht so definiert werden, dass ein intensional abgeleitetes Attribut zu einem extensionalen Attribut wird und umgekehrt. Die Implementation auf ein Attribut oder eine Operation kann umgeschrieben werden durch die Einführung einer anderen Implementation auf das jeweilige Konzept, welches in der Erbdefinition Vorrang hat. Eine Redefinition einer Implementation kann kombiniert werden mit- oder ohne eine Redefinition der Signatur. Die Umschreibung von Constraints und Triggers ist nicht erlaubt. Views werden benutzt, um abgeleitete Konzepte aus existierenden Konzepten der Datenbank zu bilden. Jede View hat eine Signatur und eine Implementation. Die Signatur ist durch Parameter -, die Implementation durch eine Menge von deduktiven Regeln gegeben. Der konzeptionelle Teil von Chimera kann in vier Komponenten zerlegt werden: Deklarative Ausdrücke werden zur Manipulation und zum Entfernen von Informationen benutzt. Neben der Unterstützung von Queries sind in Chimera die deklarativen Ausdrücke Komponenten von aktiven und deduktiven Regeln und Operationen. Zur Änderung von Objektzuständen ist ein minimaler und zusammenhängender Satz von Datenmanipulationsregeln erforderlich. Mit einfachen Ausdrucksverfahren wird die Anwendungskette durch obige Regeln definiert. Das ist die Basis der bekannten Sprachverfahren. Die Sprache unterstützt die Implementation von Schemakomponenten, (ausgedrückt durch deduktive Regeln, aktive Regeln und Operationen) In einer Datenbank bilden deduktive Regeln die Basis für detaillierte Angaben von deklarativen Ausdrücken. Chimera basiert auf einer logischen Sprache und unterstützt deklarative Queries sowie deklarative Regeln für deduktive Regeln. Ebenso werden deklarative Bedingungen zur Kontrolle von aktiven Regeln und Operationen unterstützt, deshalb sind die deklarativen Ausdrücke in dieser Sprache ubiquitär vorhanden. Deklarative Ausdrücke werden in Chimera über eine logische Sprache definiert. Jede klassische logische Sprache besteht syntaktisch aus Termen und Formeln.[CF,92] Terme sind entweder atomic oder komplex. Atomic Terme (Atomare Terme) bestehen aus Konstanten oder Variablen. Konstanten sind atomic values, das heißt integer, string, real, oid oder boolean. Variab- 65 len werden durch eine Kombination alphanumerischer Zeichen gebildet, wobei das erste Zeichen ein Großbuchstabe sein muss. Bezüglich deduktiver Regeln unterliegen Variablen einem Gültigkeitsbereich (scope), das heißt, sie gelten nur im Kontext der Regeln, in denen sie auftreten. Kommt ein Variablenname auch in anderen Regeln vor, so sind diese als unterschiedlich zu betrachten, da eine Variablenbindung nur innerhalb einer Regel erfolgt. Außerhalb der Regel existiert sie nicht mehr. Komplexe Terme bestehen aus funktionalen und auswertbaren Termen. Unter funktionalen Termen versteht man die strukturierten Werttypen von Chimera (Set, list und record). Auswertbare Terme (evaluable Terms) werden durch ein auswertbares Funktionssymbol und eine Liste von Termen als Parameter gebildet, aus denen ein Rückgabewert berechnet wird. In Chimera gibt es drei Arten von auswertbaren Funktionen: Attributs, Selectors, Operators.[Schubert,99] In Chimera ist jeder Term an einen Typ gebunden. Jedoch ist eine Bestimmung dieser Typbindung nicht immer möglich. Dies ist beispielsweise der Fall, wenn innerhalb eines Terms unverträgliche Typbindungen (Typkonflikte) auftreten. In diesem Fall kann kein gültiger Term ermittelt werden. Terme, die solche Typkonflikte enthalten, sind semantisch nicht korrekt. Um passive Regeln auswertbar zu bleiben, müssen Terme bereichbeschränkt sein. Ein Term ist genau dann bereichbeschränkt wenn er wiederum nur bereichbeschränkte Variablen enthält bzw. variablenfrei ist. Eine Variable ist genau dann bereichbeschränkt, wenn sie mit endlich vielen Werten ersetzt werden kann. Formeln können atomic oder komplex sein. Atomic Formeln bestehen aus Prädikatsymbolen. Diese werden aus einer Folge von alphanumerischen Zeichen gebildet, wobei das erste Zeichen ein kleiner Buchstabe sein muss oder ein spezielles Zeichen einer vordefinierten Relation. Atomare Formeln werden in Chimera weiter klassifiziert in: Klassen- und Typformeln Vergleichformeln Mitgliedschaftsformeln Auswahlformeln Integritätsformeln Ereignisformeln Komplexe Formeln werden durch Verknüpfung von atomaren Formeln mit Konjunktion und Negation gebildet: Formular ::= atomic-formular | komplex-formular komplex-formular ::= formular [ ^ | ¬ ] formular 66 Prozedurale Ausdrücke stellen eine Kette von Regeln für Datenbankzustände dar. Es gibt zwei verschiedene Ketten von Operatoren: 1. 2. Für die vorübergehende Variablenbesetzung, die den Komponentenzustand in den nächsten Zustand (neuer Zustand) versetzt, und Für eine vorübergehende individuelle Bindung. Deklarative Regeln können die Nutzung von Mengen sowie die willkürliche Nutzung von Disjunktionen und Negationen nicht explizit einbauen. Prozedurale Ausdrücke sehen keine Strukturkontrollen vor, ermöglichen aber eine Prozeduralkette von Aufrufen (calls), mit set-orientierten oder objektorientierten Aufrufmustern. Regeln und Operationen sind wichtige Komponenten der IDEA Methode, und besitzen die Fähigkeit, neue Informationen zu modellieren. Abgesehen von deren multiplen Anwendungs- und Syntaxdetails verfügen IDEA- Regeln und -Operationen über eine einfache Struktur. Die deduktiven Regeln (mit Kopf und Body) gelten als deklarative Ausdrücke. Operationen sind eine Kombination aus deklarativen und prozeduralen Ausdrücken.[CF,92] Head ? Body ist eine deduktive Regel mit einem atomic - Kopf und einem atomicBody als deklarativer Ausdruck. In Chimera kann der Objektzustand durch Query und Updateregeln definiert werden. (Chimera unterstützt die herkömmlichen Query- und Updateregeln.) Operationen bestimmen den vordefinierten Mechanismus für die Wiederherstellung und Manipulation eines Objektes. Operationen haben zwei Komponenten: Kondition: ist eine Formel in Chimera Operation Code: ist ein prozeduraler Ausdruck Active Regeln: Active Regeln werden in Chimera als Trigger bezeichnet. Die Definitionen von aktiven Regeln sind durch Triggers vorgeformt. 67 5 Analyse In Abschnitt 5.1 werden die Sprachen F-Logic, ROL und Chimera bezüglich bestehender Gemeinsamkeiten und Unterschiede analysiert. Die Ergebnisse werden in Form von Tabellen verdeutlicht. 68 5.1 Vergleich deduktiver objektorientierter Datenbanksprachen Deduktive objektorientierte Datenbanken bilden eine Kombination aus dem logischen Teil deduktiver Methoden und der objektorientierten Methodenmodellierung. Neben einer Reihe von weiteren Sprachen zählen auch F-Logic, ROL und Chimera zu den deduktiv objektorientierten Datenbanksprachen (DOOD). Die deduktiven und objektorientierten Datenbanken repräsentieren zwei wichtige Erweiterungen im Bereich der herkömmlichen Datenbanktechnologie. Die deduktive Datenbank ergänzt die Aussagekraft der traditionellen Datenbank mit Hilfe der Rekursion und der deklarativen Anfrage. Objektorientierte Datenbanken erweitern die Datenmodellierung durch die Objektidentität, Klassen, Klassenhierarchien und Schemata. Bei den deduktiven Datenbanken ist ein Datenmodellierungsmechanismus erforderlich, während die objektorientierten Datenbanken eine deklarative Abfragesprache benötigen. Die DOOD Sprachen können grob in zwei Arten klassifiziert werden: Lossely coupled und Tightly coupled. Bei der ersten Vorgehensweise werden als Abfragesprache für objektorientierte Datenbanken vornehmlich Datalog ähnliche Sprachen eingesetzt. Dies stellt jedoch nur eine unbefriedigende Methode dar, da die resultierende Sprache aus zwei unterschiedlichen Teilen mit einer nicht vereinheitlichten Semantik besteht. Typische Beispiele sind IQL und Rock and Roll. Die zweite Vorgehensweise ist eine elementare Methode, in der eine neue, einheitliche Logik vorgeschlagen wird, um die zugrunde liegende, objektorientierte Datenbanknotation zu formulieren. C-Logic, F- Logic und ROL gehören zu zweiten Methode. Zu den DOOD Sprachen wird natürlich auch Chimera gezählt, sie ist eine DOOD Sprache mit einer zusätzlichen Komponente. Frame basierte Modelle stützten sich im Wesentlichen auf Konzepte von Frames: Frames entsprechen im semantischen Datenbankmodell den Objekttypen. Diese besitzen wiederum Eigenschaften (Meta-Attribute für den gesamten Objekttyp) und Methoden. F-Logic ist eine Sprache, die zwei maßgebliche Ansätze zur Erweiterung des relationalen Modells miteinander verbindet: 69 1. Der objektorientierte Ansatz: Hierbei steht die Erweiterung des Datenmodells im Vordergrund, es werden komplexe, strukturierte Objekte mit einer Objektidentität eingeführt, um die Hierarchie von angeordneten Klassen zuzuordnen. 2. Der deduktive Ansatz: Durch diesen wird versucht, die Mächtigkeit der Datenbankabfragesprachen zu erweitern. Es können Daten durch Regeln definiert werden, wodurch die Möglichkeit zu rekursiven Anfragen gegeben ist. Hierbei ist bedeutend, dass der deduktive Ansatz mit einer deklarativen Semantik verbunden werden kann. Eine weitere Eigenschaft von F-Logic ist, dass Vorteile des High-levelMethodenkonzepts (typisch für Framebasierte Sprachen) mit einer well-defined Semantik kombiniert werden. Ziel ist es, eine logische Sprache mit objektorientierten Merkmalen zu schaffen. Als nächste Sprache wird ROL betrachtet: Sie ist eine regelbasierte deklarative Sprache für Definitionen und Manipulationen von Datenbanken und Datenbankabfragen. Sie besitzt die wesentlichen Merkmale von deduktiven und objektorientierten Datenbanken, und unterstützt die Objektidentität, die Objektkomplexität, Klassenhierarchien und die mehrfache Vererbung. Deduktive Datenbanken mit einer deklarativen Semantik besitzen eine logische Schnittstelle. Chimera repräsentiert die Integration von objektorientierten, aktiven und deduktiven Datenbanktechnologien in einem einzigen Modell. Konkret bildet Chimera die Zusammensetzung aktiver und deduktiver sowie objektorientierter Datenmodelle und deren Manipulationstechniken innerhalb eines definierten Rahmens (mit Regeln und Operationen) ab. Hier wird eine Regelsprache für aktive und deduktive Regeln entwickelt. Diese Sprache wird in einem objektorientierten Kontext integriert. Chimera unterstützt neben atomaren Typen auch strukturierte Typen. 70 Tabelle 1: Aufbau der Strukturen der Sprachen und Migrationskonzepte im Vergleich F-Logic AusgangsBasis Traditionelle (relationale ) Datenbank Erweiterung im Sinne Migrations- des objektorientierten Konzept und deduktiven Ansatzes mit deduktiven Regeln und einer deklarativen Sprache kombiniert mit der High-level Methode und well-defined Semantik Manipulationsmethode ROL Chimera Traditionelle (relatio- Objektorientierte Datennale) Datenbank bank, Deduktive Datenbank, Aktive Datenbank Erweiterung im Sinne des objektorientierten und deduktiven Ansatzes mit deduktiven Regeln und einer deklarativen Sprache kombiniert mit der High-level Methode und well-defined Semantik Integration der drei Methoden in einem Modell durch Kombination der deklarative Regelsprachen und , Objektorientierte Programmiersprache und Imperativen Regeln Deklarativ Deklarativ und Imperativ Deklarativ In objektorientierten Datenbanksystemen werden die in Zusammenhang mit der relationalen Datenbankmodellierung existierenden Probleme vermieden. Dies geschieht hauptsächlich durch Integration der Verhaltens- und Strukturbeschreibung in einer einheitlichen Objekttyp-Definition. Das anwendungsspezifische Verhaltensmuster, das heißt die Operationen, werden zum integralen Bestandteil der Objektbank. Dadurch werden die umständlichen und ineffizienten Transformationen zwischen Datenbank und Programmiersprache umgangen. Vielmehr sind die den Objekten zugeordneten Operationen direkt ausführbar,- ohne detaillierte Kenntnis der strukturellen Repräsentation der Objekte. Dies wird durch das sogenannte Geheimnisprinzip erreicht, wonach an der Schnittstelle eines Objekttyps eine Menge von Operationen angeboten werden, für deren Ausführung lediglich die Signatur (Aufrufstruktur) bekannt sein muss. Oft wird in diesem Zusammenhang auch von einer Objektkapselung gesprochen, da die interne Struktur eines Objekts, also die strukturelle Repräsentation, dem Benut- 71 zer verborgen bleibt. Der Benutzer bekommt nur die den Objekttypen zugeordneten Operationen zu sehen. Objekte sind Grundbausteine, aus welchen objektorientierte Anwendungssysteme aufgebaut werden. Jedes Objekt bildet eine eigenständige Einheit, die über Daten (Attributwerte des Objekts) verfügt. Jedes Objekt wird durch seine datenspezifischen Eigenschaften (Attribute) und durch sein funktionsspezifisches Verhalten (Methoden) charakterisiert. Ein Attribut oder Merkmal eines Objekts ordnet jeder Instanz einen bestimmten Datenwert aus einem definierten Wertbereich zu. Neben dem Attribut müssen die Methoden festgelegt werden, die sich aus dem Kontext des Problembereichs ergeben. Die Darstellung der Objekte in Programmen hängt des weiteren von den Möglichkeiten der Programmiersprache ab, insbesondere von der Definition der zugrunde liegenden Datentypen (integer, string, real,.. ). In F-Logic und Rol werden Standarddatentypen als Objekttypen verwendet. In Chimera werden zusätzlich zu diesen Datentypen strukturierte Typen wie set, list und record unterstützt. Die Semantik des Set - Typs ist mengenorientiert, das heißt es existieren im Gegensatz zu list, keine doppelten Elemente. Die strukturierten Datentypen lassen sich durch die rekursive Verwendung von atomaren und abstrakten Typen konstruieren. In Chimera enthalten die atomaren Typen zusätzlich OID’s. Beim Entwurf und beim Aufbau von Informationssystemen ist es üblich, nicht nur einzelne Objekte mit ihren Ausprägungen zu beschreiben, sondern die Menge der Objekte zu klassifizieren, und diejenigen Objekte mit denselben Beschreibungselementen (Attribute, Methoden) in Kassen zusammenzufassen. Durch die Abstraktion von einzelnen Objekten hin zu einer umfassenden Klasse, werden gemeinsame Definitionen für Attribute und Methoden einmal pro Klasse festgelegt. Eine Klasse beschreibt eine Menge von Objekten mit denselben Attributen und Methoden. Dies entspricht einem bekannten Prinzip bei der Modellierung von Datenbanken: Anstelle von einzelnen, konkreten Ausprägungen eines Objekts, werden Objekte mit ähnlichen Eigenschaften und gemeinsamen Verhalten zu Instanzmengen zusammengefasst. Die Abstraktion erlaubt es, von wenigen spezifischen Objektexemplaren auf eine Fülle von möglichen Objekten zu verallgemeinern. Objekte und Klassen werden in den vorgestellten Sprachen zwar auf die gleiche Art und Weise definiert, dennoch gibt es gewisse Unterschiede. Beispielsweise wird in F-Logic eine Klasse als ein Objekt betrachtet. Der Grund hierfür, ist die Notwendigkeit, nicht nur einzelnen Objekten Attribute zuzuordnen, sondern der gesamten Klassen. Dies geschieht auf zwei Arten: 1. Zusätzlich zu den herkömmlichen Attributen einer Klasse werden statische Attribute für die Gesamtklasse, die jeweils nur einen Wert annehmen kann, definiert. Bei allen erzeugten Objekten werden diese Werte als Konstanten be- 72 2. trachtet, die in den einzelnen Objekten nicht geändert werden können. Diese Lösung entspricht der Vorgehensweise in C++. Beim zweiten Ansatz werden Klassen als Objekte betrachtet. Diese Klassen (Objekte) gehören dann wiederum der Klasse einer höheren Ebene an. Diese Ebene ist die Metaebene, und Klassen dieser Ebene werden Metaklassen genannt. Jede Klasse kann hier eigene Attribute haben. Wie bereits erläutert, wird in F-Logic zwischen Klassen und Objekten nicht unterschieden. Folglich besitzen Klassen und Objekte denselben Definitionsbereich (Domain). Dadurch ist ihre Unterscheidung erschwert und nur über Ereignisse im Programm möglich. Ein Objekt, das Element einer Klasse ist, kann selbst wiederum Klasse einer anderen Menge von Objekten sein. In diesem Fall existieren mehrere Metaklassen. Diese können jeweils nur einige Klassen umfassen. Im Extremfall gibt es für jede Klasse verschiedene Metaklassen. Der Vorteil ist die gute Darstellbarkeit von Klassenattributen, die nur auf eine Klasse zutreffen. Der Nachteil ist die komplizierte Struktur der Metaebene selbst und die beschränkte Fähigkeit zur Darstellung von Metainformationen, die mehreren bzw. allen Klassen gemeinsam sind. Durch die Betrachtung “Klassen als Objekte“ entsteht eine Element - Klassenbeziehung. Diese wird in der F - Struktur von F-Logic als binäre Relation dargestellt. F - Strukturen bestehen aus einer Menge von Objektkonstruktoren und Variablensymbolen. Ein Objektkonstruktor ist ein Funktionssymbol f mit einer zugehörigen Stelligkeit n. Nur mit Hilfe von Objektkonstruktoren und Variablen lassen sich wie in Algebra Terme konstruieren. Jedes 0 stellige Funktionssymbol und jedes Variablensymbol bildet einen Term. Durch Terme und Formeln lassen sich Regeln und Anfragen definieren. Jedoch sind jene Terme, die wie in Algebra konstruiert sind, von ihrer Struktur her zu schwach für bestimmte, komplizierte Abfragetypen. Aus diesem Grund werden in F-Logic und in ROL logische Sprachen mit Higher order Methoden kombiniert. Rol bildet die Entitäten (Entities) der realen Welt als Objekte ab. Zusätzlich werden auch Values, Functor Objekte, OID’s, Set und Tupel als Objekte betrachtet. In ROL werden Klassen durch eine Menge von Objekten definiert, die gemeinsame Attribute teilen. Aufgrund der Behandlung von value, Set, Functor objekt und Tupel als Objekte können in ROL fünf Arten von Klassen unterschieden werden. Für jede Gesamtklasse wird jeweils ein Attribut definiert, diesem wird innerhalb der Gesamtklasse auch nur ein Wert zugeordnet. In ROL werden, genau wie in F-Logic, atomic Types unterstützt, jedoch wird hier im Gegensatz zu F-Logic zwischen Objekten und Klassen unterschieden. F-Logic enthält kein Set und hat daher eine komplizierte Semantik. In ROL hingegen wird Set unterstützt und entsprechend einfach ist auch ihre Semantik. 73 Chimera ist eine Typ basierte Sprache. Zusätzlich zu atomaren Typen (OID’s gehören in Chimera ebenfalls zu den atomaren Typen) werden hier strukturierte Typen unterstützt. Jeder strukturierte Typ besitzt eine Reihe von Standardoperationen, wie Zugriffsoperatoren auf Elemente bzw. Komponenten und Vergleichsoperatoren. Dadurch wird die Darstellung von komplexen Objekten möglich. Komplexe Typen legen die möglichen Instanzen fest. Im Datenbankbereich beschreibt ein komplexer Typ meistens eine Menge von Tupel. Zur Identifikation von Objekten kann dieser Typ auch eine abstrakte Komponente, also ein Surrogat- Attribut, beinhalten. Die eindeutige Identifikation von Objekten ist ein Grundpfeiler objektorientierter Softwareentwicklung, und wird mit Hilfe von Surrogaten realisiert. Surrogate sind Stellvertreter. Mit einem Surrogat wird die direkte Darstellung von Anwendungsobjekten im relationalen Modell bezeichnet. Dieser ist der eindeutige Identifikationsschüssel für ein Objekt und ist unveränderbar und unabhängig von den Objekteigenschaften. F-Logic beschäftigt sich mit F Strukturen, die aus dem Funktionssymbol f mit Stelligkeit n bestehen. Wenn jedes 0 stellige Funktionsymbol und jedes Variablensymbol ein Term ist, dann wird f( t1,..., tn) ebenfalls zu einem Term. In F-Logic werden diese Terme (genau wie Objektnamen und Variablennamen) IDTerme genannt. Diese komplexen ID-Terme werden durch Funktionssymbole und andere ID-Terme erzeugt, und zur Identifikation von Objekten und Klassen benutzt. In ROL werden auch die OID’s durch Terme und Functor Objekte abgebildet. Die Menge der OID’s wird hier als OID- Klasse bezeichnet, und repräsentiert die Entitäten der realen Welt. OID- Klassen müssen explizit durch Klassendefinition definiert werden. In Chimera stellt der OID Typ eine Besonderheit dar. Er kann nicht explizit benutzt werden, das heißt, wenn ein Attribut auf ein Objekt einer anderen Klasse verweisen soll, wird der entsprechende Klassename herangezogen, wobei aber intern dafür der OID Typ verwendet wird. 74 Tabelle 2 : Objekte, OID’s und komplexe Objekte in F-Logic, ROL und Chimera im Vergleich Sprachen F-Logic Objekt ROL Chimera Abstraktion der Entitäten der realen Entitäten der realen Entitäten der realen Welt Welt, Welt zusätzliche Betrachtung zusätzliche Betrachtung von von Value, OID, Functor Value, OID, Klassen, Attribute und Methoden Objekt, Set und Tupel als Objekte als Objekte OID Term / ID-Term Term /Functor Objekt Festlegung erfolgt bei Objektgenerierung Komplexe Objekte Kein Set Set Typ In objektorientierten Programmiersprachen gibt es zur Steuerung der Vererbung folgende Methoden: Is-a-Hierarchie, Spezialisierung, Typhierarchie, Klassenhierarchie und die Generalisierung. Dabei stellen Is-a-Hierarchie und Spezialisierung Integritätsbedingungen dar. Die Typhierarchie organisiert Klassen anhand ihrer zugeordneten Zustandstypen, und die Klassenhierarchie ist eine reine Implementierungshierarchie ohne eine weitere, streng formale Semantik. Klassenhierarchie: Eine Klasse K ist spezieller als eine Klasse K’, wenn die Objektmenge von K Teilmenge der Objektmenge von K’ ist. K wird dann Unterklasse von K’ genannt, K’ Superklasse von K, [Heuer, 93]. Diese Methode wird in F-Logic verwendet. Is-a-Hierarchie: Eine Klasse K ist spezieller als eine Klasse K’, wenn sie in der Klassenhierarchie in dieser Beziehung stehen und die zu K und K’ gehörenden Zustandstypen in der Typhierarchie ebenfalls in dieser Beziehung stehen, [Heuer, 93]. Die Generalisierung stellt eine weitere Art der Hierarchie dar. Generalisierungen ermitteln bei vorgegebenen Unterklassendomänen die Domäne der Superklasse. Die 75 Domäne der Superklasse ist bei der Generalisierung die Vereinigung der Objektmenge mit der Unterklasse. Die Sprachen F-Logic, ROL und Chimera unterstützen die Vererbungsmethoden auf verschiedene Weise: F-Logic benutzt das Konzept der Klassenhierarchie, während ROL die Is-a-Hierarchie anwendet und in Chimera die Generalisierung eingesetzt wird. Tabelle 3: Klasse und Klassenhierarchie der Sprachen im Vergleich Sprachen F-Logic Klasse Hierarchie ROL Chimera Metaklasse Metaklasse, Metaklasse, Betrachtung von Trennung von Klasse Komponenten der und Objekt Klasse: Superklasse, Objekten als Klasse Attribute, Operationen, Triggers, Key Klassenhierarchie Is-a-Hierarchie Generalisierung Bei der Objektorientierung stellen Methoden Funktionen dar, die im Kontext eines Objektes aufgerufen werden, und dabei eventuell eine Zustandsänderung vornehmen bzw. ein Resultat zurückliefern. In F- Logic werden nur die funktionalen Komponenten von Methoden modelliert. Die Methoden werden semantisch durch partielle Funktionen wieder gegeben, und als Elemente des Universums betrachtet. Das heißt, Methoden werden wie Objekte mit Hilfe von ID-Termen referenziert. Objekte, Klassen sowie die dazugehörenden Attribute können durch Methoden abgefragt und manipuliert werden. Diese Methoden werden als Instanz Methoden bezeichnet. In ROL sind die Methoden regelbasiert und müssen definiert, und in den Klassen gekapselt werden. In Chimera müssen alle Objekte einer Objektklasse angehören. Definitionen von Struktur und Verhalten (Typdefinitionen) folgen direkt aus der Klassendefinition. Methoden sind auch Funktionen (Attributklassen), die die gesamte Klasse in einem ein- 76 zigen Wert abbilden. Durch Operationsklassen kann die gesamte Klasse manipuliert werden. Der Begriff „Deklarative Sprache“ ist ein Oberbegriff für logisch basierte, relationale Sprachen. Die logische Zustandsbeschreibung ist kennzeichnend für deklarative Sprachen. Demgegenüber erfordern „Imperative Sprachen“ die Vorgabe einer Ablaufbeschreibung (durch Constraint und Trigger). Deklarative Regeln sind ein wesentliches Prinzip, um die Modellierung von Problemen, Programmierung, Ausführung und Wartung von Programmen zu unterstützen. F-Logic kombiniert die logische Sprache mit der Higher-order Methode. Die Highorder Syntax von F-Logic kann durch ein Prädikat der Logik erster Stufe gleichwertig dargestellt werden. In F-Logic können beispielsweise High-order Konzepte von Methoden und Klassen durch ID-Terme repräsentiert werden. Rol unterstützt Higher-order Regeln und Abfragen (Queries). Eine Higher-order Regel wird dynamisch in eine Regel erster Stufe umgeschrieben. In Chimera werden deklarative Ausdrücke über eine zweiwertige logische Sprache definiert. Jede klassische logische Sprache besteht syntaktisch aus Termen und Formeln. Terme haben dabei die Bedeutung von Subjekten, welche entweder durch konkrete Werte oder Objekte notiert werden. Formeln machen Aussagen über Subjekte, welche wahr oder falsch sein können. Die Superklasse vererbt Attributswerte und Methoden an die Unterklasse. Neben dieser Vererbung ist es auch möglich, diese Eigenschaften in einer Unterklasse neu zu definieren. In diesem Fall findet die in der Unterklasse definierte Eigenschaft Anwendung. Das Überschreiben (Overriding) wird von allen Sprachen (F-Logic, ROL und Chimera) unterstützt. Blockieren wird aber nur von ROL und Chimera ermöglicht. Kapselung wird von der Bezeichnung abstrakter Datentypen abgeleitet. In einer objektorientierten Datenbank kapseln Objekte Daten und Methoden ein. Durch Kapselung können Objektinformationen nur durch speziell für dieses Objekt definierte Methoden manipuliert werden. 77 Tabelle 4: Manipulations- - und Auswertungsvorschriften der Sprachen im Vergleich Sprachen F-Logic ROL Chimera unterstützt unterstützt unterstützt Überschreiben Ja Ja Ja Blockieren Nein Ja Ja Kapselung Nein Ja Ja Constraints stellen sogenannte Integritätsbedingungen (IBs) dar, die inkonsistente Datenbankzustände beschreiben. Zur Definition dieser IBs werden deduktive Regeln verwendet, die im Gegensatz zu anderen deduktiven Regeln eine besondere Interpretation haben. Diese Interpretation heißt “denial form“ und bedeutet, dass eine Inkonsistenz eintritt, sobald eine Wertbindung für den deklarativen Ausdruck im Regelkopf erfolgt. Im Normalfall ist es bei deduktiven Regeln erwünscht, dass Wertbindungen jedoch eine negative, unerwünschte Bedeutung. Trigger werden gebraucht, um innerhalb einer bestimmten Zeit eine bestimmte Reaktion auszulösen. Dafür wird das Datenmodell um Regeln zu Definition von DBMS Verhaltensmustern erweitert. Solche Regeln werden in diesem Kontext aktive Regeln genannt. Tabelle 5: Unterstützung von Manipulationsmethoden der Sprachen im Vergleich Sprachen F-Logic ROL Chimera Constraints Nein Ja* Ja Trigger Nein Nein Ja Konzepte 78 * wird hier als Integritätsbedingung realisiert Schema Browsing ist die Fähigkeit zur Abfrage von Metadaten im Datenbankschema ohne einen expliziten Hinweis an die Datenbank. Higher-order-Syntax bezeichnet Regeln, die syntaktisch nicht mit einer Logik erster Stufe ausgedrückt werden können. Collection as 1st Class: Verbindet Attribute, die gemeinsame Eigenschaften haben, zu einer Menge oder einer Klasse von Attributen. Tabelle 6: Deklarative- und objektorientierte Unterstützung in den Sprachen im Vergleich Spra- F-Logic ROL chen Chimera Schema Browsing Ja Ja No High-order-Syntax Ja Ja No Collection as 1st Class Ja** Ja** Ja** **objektorientierte Unterstützung 79 6. Ergebnisse Im Folgenden werden die in Kapitel 5 analysierten Gemeinsamkeiten und Unterschiede der drei Sprachen F-Logic, ROL und Chimera diskutiert und anschließend in Abschnitt 6.2 bewertet. 80 6.1 Diskussion ROL ist eine regelbasierte Sprache, die auf Strukturen von F-Logic aufbaut. Zuerst werden die Objektidentitäten festgelegt, wobei values, Functor Objekte, OID’s, Set und Tupel in ROL als Objekte betrachtet werden. Mit value sind string, integer, real, char und boolean gemeint. In ROL bilden OID’s die Entitäten der realen Welt ab. Mit Functor Objekt wird die Beziehung zwischen den Objekten dargelegt. Die jeweilige Betrachtungsart der einzelnen Objekte ist abhängig von der zugrunde liegenden Sichtweise der objektorientierten Datenbanken. Objekte mit gemeinsamen Attributen bilden Klassen, denen ein Attributswert zugeordnet wird. Dieser stellt das Klassenattribut dar und liefert einen Wert. Zwar werden, wie in ROL und Chimera, auch in F-Logic Klassen als Metaklassen bezeichnet, da hier aber Objekte und Klassen gleich betrachtet werden, ist das Schema von F-Logic viel komplizierter als das von ROL. Attribute werden in ROL als Funktionsterme (Functor Objekt) ausgedrückt. In F-Logic hingegen werden Attribute durch ID-Terme dargestellt. Aufgrund der Unterstützung von Set in ROL ist auch die Semantik von ROL einfacher als die Semantik von F-Logic. Functor Objekte werden benutzt, um Typen mit gleicher Klassendefinition zu bilden. Beispiel für die Anwendung in F-Logic: Person[name à string, Ageàinteger, Person=> person] employee:: Person stephan: employee alex:Person karin:Person 32:integer “Stephan” :string stephan[nameà”Stephan”, ageà32, parentsàà{alex, karin} wobei person, employee, integer und string in diesem Beispiel Klassen sind, und stephan, alex, karin, 32, und “Stephan“ Objektidentifikatoren darstellen. Der Zustand employee:: Person bedeutet, dass employee eine Unterklasse von Person ist, und stephan: employee bedeutet dass stephan eine Instanz von Person ist. 81 Dasselbe Beispiel für die Anwendung in ROL: Schema person[name=>string, age=>integer, parents=>{person}] employee isa person Fakt alex:person karin:person stephan:employee[nameà”Stephan”, ageà32, parentsà <alex, karin>] Person, employee, integer und string sind Klassen; stephan, karin und alex sind die Objektidentifikatoren und <alex, karin> sind partielle Set Terms. Beispiel für eine Anwendung in Chimera: Zur Darstellung der Klassendefinition in Chimera mit den zusätzlichen Komponenten Trigger und Constraint wird ein komplexeres Beispiel herangezogen. define object class employee superclass person attributes emplNr: integer, mgr: employee, salary:integer, dependents:set-of (employee) costraints exceedsMgrSalary operations hire(in Mgr:employee, in StartSalary:integer), fire( ) triggers adjustSalary end Die Klassenhierarchie in F-Logic ist durch Unterklassendefinition realisiert. In ROL dagegen wird die Klassenhierarchie durch das isa –Prinzip umgesetzt, während sie in Chimera durch Superklassendefinition erfüllt wird. 82 Wie bereits erwähnt ist die Syntax von F-Logic aufgrund der mehrfachen Metaklassendefinition komplizierter als in ROL. Die Definition von Klassen bezieht sich in ROL ebenfalls auf die Definition von Metaklassen, jedoch werden in ROL Klassen und Objekte getrennt betrachtet. Dadurch wird verhindert, dass eine Klasse als ein Objekt wiederum einer Klasse höherer Ebene angehört. In Chimera ist die Klassendefinition von ihrer Signatur und Implementation getrennt. Die Signatur beschreibt die Klassenstruktur, und insbesondere ihre gesamten Komponententypen. In Rol sind Objekte und Klassen unterschiedlich definiert und funktionieren auch auf zwei verschieden Ebenen. Diese Ebenen werden Schema und Instanz genannt. In der Schemaebene werden Klassen und deren Attribute sowie die Klassenhierarchie (subclass) definiert. In der zweiten Ebene werden durch Fakten und Regeln extensionale- und intensionale Informationen über Objekte erzeugt. Da F-Logic keine direkte Unterstützung für Relationship bietet, wie sonst für deduktive Sprachen üblich, kann man sagen, dass der Schwerpunkt von F-Logic eher auf den objektorientierten Spracheigenschaften liegt. F-Logic kann nur eine monotonic multiple Attributsvererbung unterstützen. Im Gegensatz zu ROL und Chimera wird das Überschreiben und Blockieren von Attributen auch nicht ermöglicht. Ein weiteres wichtiges Merkmal von ROL ist die Functor Klasse, diese wird eingesetzt, um die Generalisierung von Klassen und Relationen aufzubauen. Relationships können direkt durch Functor Objekte repräsentiert werden. Diese können Attribute besitzen und auch als Attributswerte benutzt werden. Zusätzlich können functor Objekte Sets beinhalten; Dadurch sind sie mächtiger als ID-Terme in F-Logic. Die Attributsvererbung in ROL, Chimera und F-Logic ist nicht identisch. ROL unterstützt die non-monotonic multiple Attributsvererbung, während in F-Logic und Chimera eine monotonic multiple Attributsvererbung möglich ist. Bei einer non-monotonic Vererbung, ist die Vererbung algorithmisch definiert und nicht in die Semantik eingebaut. Unterklassen in F-Logic, ROL und Chimera können Attributsdeklarationen von Superklasse erben und auch überschreiben. Blockieren wird nur in ROL und Chimera ebenfalls unterstützt. In ROL sind einige objektorientierte Merkmale, wie regelbasierte Methoden und Kapselung integriert, sodass ROL im Vergleich zu F-Logic eher als eine deduktive, objektorientierte Sprache betrachtet werden kann. ROL unterstützt OID’s, komplexe Objekte, die Klassenhierarchie sowie non-monotonic multiple Struktur- und Verhaltensvererbung mit den Funktionen ’Überschreiben und Blockieren’. Im Gegensatz zu F-Logic und ROL unterstützt Chimera ein breites Typsystem. Zusätzlich werden hier Typen als atomic und strukturiert klassifiziert. Ein weiterer wichtiger Punkt in Chimera ist die eins- zu- eins Beziehung zwischen Klassen und Objekttypen. Wie bereits erwähnt, werden in Chimera Typen und Klassen unterstützt. Mit dem Begriff Typ werden Objekte mit ähnlicher Struktur und Ver- 83 halten bezeichnet. Mit der Klasse wird die Mitgliedschaft dieser Objekte in einer gemeinsamen Instanzmenge gezeigt. Zusätzlich zur Basisstruktur und dem Verhaltenskonzept von Attributen und Operationen bietet Chimera - im Gegensatz zu F-Logic und ROL -, zwei weitere Komponenten an: Constraint und Trigger. Bei Betrachtung von F-Logic und ROL kann festgestellt werden, dass beide Sprachen über einen vergleichbaren Aufbau verfügen, dass heißt, die relationalen Datenbanken wurden um zwei wichtige Ansätze, und zwar dem objektorientierte Ansatz und dem deduktive Ansatz erweitert. Die wesentlichen Unterschiede zwischen den Sprachen liegen in erster Linie in der Definition des objektorientierten Ansatzes, insbesondere in der Klassendefinition. FLogic, ROL und Chimera basieren auf einer logischen Sprache, die durch Terme und Formeln konstruiert wird. Dabei gibt es jedoch auch einen Unterschied: In F-Logic und ROL wird die logische Sprache im Gegensatz zu Chimera mit der Higher-order Methode kombiniert. Chimera wiederum wurde durch Zusammensetzung aktiver und deduktiver sowie objektorientierter Datenmodelle und deren Manipulationstechniken innerhalb eines definierten Rahmens entwickelt. Größte Gemeinsamkeit zwischen diesen drei Sprachen ist, dass alle drei Sprachen die Objektorientierung als Basismodell haben und die deklarative Abfrage unterstützten. F-Logic ist im Gegensatz zu ROL und Chimera jedoch eine nicht typisierte Sprache mit einer komplizierten Syntax und Semantik. Ein weiterer Unterschied besteht in der Klassendefinition, die sich in F-Logic auf mehrfache Metaklassen bezieht, im Gegensatz zu ROL, wo nur statische Metaklassen existieren. Durch die Unterstützung von Set und Tupel ist ROL zudem mächtiger als F-Logic. 84 6.2 Zusammenfassung und Bewertung Die Sprachen F-Logic, ROL und Chimera sind deduktiv und objektorientiert. F-Logic und ROL wurden durch Erweiterung relationaler Datenbanken um das objektorientierte und deduktive Datenmodell konstruiert. Chimera wurde durch Integration von objektorientierten-, deduktiven- und aktiven Datenbanktechnologien entwickelt. Allen Sprachen liegt ein objektorientiertes Datenmodell als Basismodell zugrunde, und alle Sprachen setzten deduktive Regeln mit einer deklarativen Abfragesprache ein. Nach eingehender Analyse der drei untersuchten Sprachen, kann festgehalten werden, dass alle Modellierungseigenschaften mit Ausnahme von Blockieren und Kapselung unterstützt werden. Diese zwei Eigenschaften können nur in ROL und Chimera durchgeführt werden. Die Sprachen unterscheiden sich im Wesentlichen in ihrer Klassendefinition, die bei allen auf der Metaklassendefinition basiert. In allen Sprachen werden nicht nur den einzelnen Objekten Attribute zugeordnet, sondern der gesamten Klasse. Dies geschieht in allen drei Sprachen unterschiedlich: In F-Logic durch mehrfache Metaklasse, in ROL durch statische Attribute und in Chimera durch Definition von Klassen und Typen mit einer eins - zu - eins Beziehung. Dadurch hat F-Logic die komplizierteste Syntax von allen betrachteten Sprachen. Die Syntax von ROL wird durch Trennung von Objekten und Klassen vereinfacht. Aufgrund der Einführung von Typdefinitionen hat Chimera im Vergleich zu F-Logic und ROL die zweckmäßigste Syntax. Um Informationen zu manipulieren, werden deklarative Ausdrücke benutzt. In FLogic und ROL werden diese Ausdrücke mit einer logischen Sprache, die mit Higherorder Methode kombiniert ist, verwendet. In Chimera bilden die deklarativen Ausdrücke Komponenten von aktiven und deduktiven Regeln sowie Operationen. Daher bietet Chimera die Möglichkeit, Informationen leichter durch Regeln und Operationen zu beschreiben. In Chimera gibt es außerdem noch zwei zusätzliche Komponenten, Constraints und Triggers, die die Beschreibung von Ereignissen, die blockiert oder ausgelöst werden müssen, erleichtert. Fazit: Unter kritischer Beurteilung der beschriebenen Gemeinsamkeiten und Unterschiede sowie der Analyse der einzelnen Vor- und Nachteile können folgende Aussagen zusammengefasst werden: • F-Logic besitzt im Vergleich zu ROL und Chimera die komplizierteste Semantik, und stellt zudem auch keine mächtige Sprache dar. 85 • Die Datenmanipulationsmethode ist in Chimera leichter und einfacher zu beschreiben als bei ROL und F-Logic. • Chimera ist durch Integration einer zusätzlichen dritten Komponente, und zwar der aktiven Datenbanktechnologie noch fähiger und attraktiver für die Anwendung im Bereich deklarativer logischer Sprachen. 86 Literatur Verzeichnis [AK,89] [S. Abiteboul and P. C. Kanellakies. Object identity as a query Language primitive, In.Proc.ACM SIGMOND Intel.Conf. An Management of Data, pp 159-173,1989] [AL] [J. Angele, G. Lausen. Ontologies in F-Logic University of Freiburg] [ASL ] [A. M. Alashgur, S. Y. W. Su, H. Lam. A Query Language for Manipulation object-oriented Databases University of Florida] [Behrend, 99] [A. Behrend. Effiziente Materialisierung regeldefinierter Daten, 1999] [BFPWDA,95] [M. Baraja, A. Fernandes, N. Paton, A. Abdelmoty. Design and Implementation of Rock&Roll. A deductive object-oriented database system, 20(3): 185-211,1995] [BOS, 91] [P. Butterworth, A. Ofis, J. Stein. The Gemstoneobject Database Managemant System, ACM-34, pp 64-77] [CBS, 02] [T. Connoly, C. Begg, A. Strachen. Datenbanksysteme, Addison Wesley 2002] [CF, 92] [S. Ceri, P. Fraternali. Designing Database Applications with Objects and Rules: The IDEA Methodology, Addison Wesley 1992] [CM, 94] [S. Ceri, R. Manthey. Chimera: A Modell and Language for Active DOOD Systems, 1994, ESPRIT Project number 6333 (IDEA)] [CW, 98] [W. Chen, D. S. Warren. C-Logic of complex Objects, Departement of Computer Science, 1998] [CW,98] [W.Chen and D. S. Warren C-Logic for complex objects In Proc.ACM Symp. on Principels of Database Systeme, pp396-378, Philadelphia, Pennsylvania] [Däßler, 03] [R. Däßler. My SQL 4 bhv- Verlag, 2003] 87 [F, 03] [B. Freitag. Algebraische und logische Deduktionssysteme, Informationsmangement; Universität Passau, 2003]. [Glausch] [Glausch:Einführung in die Farme-Logik, Quelle: aus Internet] [GR, 03] [R. Gegusch, U. Rentsenhand. Wrapping und Mediation von Web- Quellen mit Florid, TU Berlin, 2003] [Heuer, 92] [A. Heuer. Objektorientierte Datenbanken Konzepte - ModelleSysteme Addison Wesely 1992] [KL, 97] [M. Kifer, G. Lausen. A Higher-order Language for Reasoning about Objects, Inheritance und Schema, University of Mannheim, 1997] [KG,90/94] [W. Kießling, U. Güntzer: Deduktive Datenbanken auf dem Weg zur Praxis, Informatik Forschung und Entwicklung, Heft 5, 1990, S. 177-187 Special Issue on Prototypes of Deductive Database Systems, The VLDB Journal, vol. 3(2), 1994.] [KLW, 95] [M.Kifer, G.Lausen and J. Wu. Logical fundation of objekt-oriented and frame based languages, Journal of ACM, 42(4): 741-843, Juli 1995] [LO, 91] [Y. Lou, M. Ozonoglu. LLO: A deductive Language with methods and method inheritance, In Proc. ACM SIGMOND Intel. Conf. on Managmement of Data, pp 198-207, Denver, Colorado,1991] [Lui 96] [M. Lui. Deductive Object Based Language Information System vol.21 pp 431-457 ] [Lui 96] [M. Lui. The ROL Deductive object Base Language Workshop 1996 IEEE-CS pp 122- 131] [Lui 96] [M. Lui. An Overview of ROL Language, World Scientific Publishing Co. pp 451- 456] [Lui, Ya 97] [M. Lui. Weidong Ya, Query Processing in the ROL System IDEA 97, Montreal, Canada, IEEE-CS pp 327-336] [Lui 98] [M. Lui. ROL2: A Real Deductive object-oriented Database Language, Spring Verlag, pp 302-315] [Lui, 99] [M. Lui. Toward the Real Deductive object-oriented Database Language, University of Regina, 1999] 88 [Lui 99] [M. Lui. Overview of the ROL2 Deductive object-oriented Database System, University of Regina, August 1999, IEEE-CS pp 63-72] [Lui 00] [[M. Lui. designed Implementation of the ROL System, Journal of Intelligent Information System Vol. 14 pp 1-21] [Lui 00] [M. Lui. journal of intelligent Information system vol.14 pp 1-21] [Lui 99] [M. Lui. Deductive Database Language, University of Regina, 1999] M, 86] [D. Maier. A. logic for objects Technical Report CS{E 86-012, Oregon Graduate Center, Beaverton, Oregon,1986] [MW 00] [A. Meier, T. Wirt. Objektorientierte und Objektrelationale Datenbanken, dpunkt Verlag 2000] [Raymans, 02] [Heine- Gerad Raymans, SQL Addison Wesely 2002] [S 99] [S. Schuber, Ein passive Rule Prototyping Tool für Chimera] [SP] [P. Sampaio, N. Paton. Deductive Queries in ODMG Databases: the DOQLc Approach, Department of Computer Science University of Manchester] [W, 99] [W. Wahlster: Expertensysteme und deduktive Datenbanksysteme; Universität des Saarlandes Fakultät - Informatik 1999] 89