Was ist QL?
QL ist eine deklarative, objektorientierte Abfragesprache, die für die effiziente Analyse von hierarchischen Datenstrukturen optimiert ist, insbesondere von Datenbanken, die Softwareartefakte darstellen.
Eine Datenbank ist eine organisierten Sammlung von Daten. Das am häufigsten verwendete Datenbankmodell ist ein relationales Modell, das Daten in Tabellen speichert. SQL (Structured Query Language) ist die am häufigsten verwendete Abfragesprache für relationale Datenbanken.
Der Zweck einer Abfragesprache besteht im Bereitstellen einer Programmierplattform, auf der Sie Fragen zu in einer Datenbank gespeicherten Informationen stellen können. Ein Datenbankverwaltungssystem verwaltet die Speicherung und Administration von Daten und stellt den Abfragemechanismus zur Verfügung. Eine Abfrage bezieht sich in der Regel auf die relevanten Datenbankentitäten und gibt verschiedene Bedingungen (als „Prädikate“ bezeichnet) an, die von den Ergebnissen erfüllt werden müssen. Die Abfrageauswertung umfasst das Überprüfen dieser Prädikate und das Generieren der Ergebnisse. Zu den wünschenswerten Eigenschaften einer guten Abfragesprache und ihrer Implementierung gehören die folgenden Merkmale:
- Deklarative Spezifikationen: Eine deklarative Spezifikation beschreibt Eigenschaften, die das Ergebnis erfüllen muss, anstatt die Prozedur zum Berechnen des Ergebnisses bereitzustellen. Im Kontext von Datenbankabfragesprachen abstrahieren deklarative Spezifikationen die Details des zugrunde liegenden Datenbankverwaltungssystems und der Abfrageverarbeitungstechniken. Dies vereinfacht das Schreiben von Abfragen erheblich.
- Ausdruckskraft: Mit einer leistungsstarken Abfragesprache können Sie komplexe Abfragen schreiben. Dadurch wird die Sprache umfassend einsetzbar.
- Effiziente Ausführung: Abfragen können komplex sein und Datenbanken können sehr groß sein, daher ist es für eine Abfragesprachenimplementierung entscheidend, Abfragen effizient zu verarbeiten und auszuführen.
In dieser Lerneinheit erfahren Sie mehr über die grundlegenden Funktionen der QL-Programmiersprache, damit Sie eigene benutzerdefinierte Abfragen schreiben oder die bereits vorhandenen verfügbaren Open-Source-Abfragen besser verstehen können.
Die QL-Syntax
Die Syntax von QL ähnelt SQL. Die Semantik von QL basiert jedoch auf Datalog, einer deklarativen Logikprogrammiersprache, die häufig als Abfragesprache verwendet wird. Dies macht QL in erster Linie zu einer Logiksprache, und alle Vorgänge in QL sind logische Vorgänge. Darüber hinaus erbt QL rekursive Prädikate von Datalog und fügt Unterstützung für Aggregate hinzu, wodurch auch komplexe Abfragen präzise und einfach werden. Stellen Sie sich beispielsweise eine Datenbank vor, die über- und untergeordnete Beziehungen für Personen enthält. Wenn Sie die Anzahl der Nachfolger einer Person finden möchten, würden Sie in der Regel:
- Suchen nach einem Nachfolger der angegebenen Person, d. h. einem untergeordneten Element oder einem Nachfolger eines untergeordneten Elements.
- Zählen der Anzahl von Nachfolgern, die im vorherigen Schritt gefunden wurden.
Wenn Sie diesen Prozess in QL schreiben, ähnelt es genau dieser beschriebenen Struktur. Beachten Sie, dass im Beispiel Rekursion verwendet wurde, um alle Nachfolger der angegebenen Person zu finden, und ein Aggregat, um die Anzahl der Nachfolger zu zählen. Die Übersetzung dieser Schritte in die endgültige Abfrage ohne Hinzufügen von Prozedurdetails ist aufgrund der deklarativen Natur der Sprache möglich. Der QL-Code sähe in etwa so aus:
Person getADescendant(Person p) {
result = p.getAChild() or
result = getADescendant(p.getAChild())
}
int getNumberOfDescendants(Person p) {
result = count(getADescendant(p))
}
Objektorientierung
Objektausrichtung ist ein wichtiges Feature von QL. Die Vorteile der Objektausrichtung sind bekannt. Sie erhöht die Modularität, ermöglicht das Ausblenden von Informationen und ermöglicht die Wiederverwendung von Code. QL bietet all diese Vorteile, ohne die logische Grundlage zu gefährden. Dies wird erreicht, indem ein einfaches Objektmodell definiert wird, bei dem Klassen als Prädikate und Vererbung als Implikation modelliert werden. Die Bibliotheken, die für alle unterstützten Sprachen zur Verfügung gestellt werden, machen umfassenden Gebrauch von Klassen und Vererbung.
QL und allgemeine Programmiersprachen
Dies sind einige wichtige konzeptionelle und funktionale Unterschiede zwischen allgemeinen Programmiersprachen und QL:
- QL verfügt nicht über imperative Features wie Zuweisungen zu Variablen oder Dateisystemvorgängen.
- QL arbeitet mit Tupelgruppen, und eine Abfrage kann als komplexe Abfolge von Satzvorgängen angesehen werden, die das Ergebnis der Abfrage definieren.
- Die setbasierte Semantik von QL macht es sehr natürlich, Sammlungen von Werten zu verarbeiten, ohne sich sorgen zu müssen, sie effizient zu speichern, zu indizieren und zu durchlaufen.
In objektorientierten Programmiersprachen umfasst das Instanziieren einer Klasse das Erstellen eines Objekts, indem physischer Speicher zum Speichern des Zustands dieser Instanz der Klasse zugewiesen wird. In QL sind Klassen nur logische Eigenschaften, die Sätze bereits vorhandener Werte beschreiben.