Indirekte DB-Erzeugung

NLI – Natural language Interface, darüber will ich mit dir sprechen

Natürliche Sprachschnittstellen (NLI) sind Systeme, die es Benutzern ermöglichen, auf natürliche Weise mit einem Computer oder einem anderen Gerät zu interagieren, indem sie ihre Sprache verwenden. Eine NLI kann verschiedene Arten von Eingaben akzeptieren, z. B. gesprochene Sprache oder geschriebenen Text, und kann verschiedene Arten von Aufgaben ausführen, z. B. Informationen suchen, Antworten auf Fragen geben oder Aktionen ausführen. [hier habe ich die weitschweifige Antwort abgebrochen]

Meine Datenbank soll folgende Fragen beantworten können: Welche Mitarbeiter produzieren welche Produkte? Wie alt ist ein bestimmter Mitarbeiter? Wieviel Teile produziert ein Mitarbeiter? Kannst du mir eine solche Datenbank mit willkürlichen Beispielen aufbauen?

[Ich definiere die Datenbank nur indirekt, indem ich sage, welche Fragen beantwortet können sollen.]

Ja, ich kann Ihnen gerne ein Beispiel für eine Datenbank geben, die diese Art von Fragen beantworten kann.

Angenommen, wir haben eine Datenbank mit zwei Tabellen: „Mitarbeiter“ und „Produkte“. Die Tabelle „Mitarbeiter“ enthält die Spalten „Mitarbeiter-ID“, „Name“, „Geburtsdatum“ und „Produzierte Teile“. Die Tabelle „Produkte“ enthält die Spalten „Produkt-ID“, „Name“ und „Verantwortlicher Mitarbeiter-ID“.

Hier ist ein Beispiel für die Daten in den Tabellen:

Tabelle „Mitarbeiter“:

Mitarbeiter-IDNameGeburtsdatumProduzierte Teile
1Max Mustermann01.01.19801000
2Maria Meier01.05.1990500
3Hans Müller15.12.1975750

Tabelle „Produkte“:

Produkt-IDNameVerantwortlicher Mitarbeiter-ID
1Produkt 11
2Produkt 21
3Produkt 32
4Produkt 43

Mit dieser Datenbank können wir die folgenden Fragen beantworten:

  • Welche Mitarbeiter produzieren welche Produkte?
    • SELECT Mitarbeiter.Name, Produkte.Name FROM Mitarbeiter JOIN Produkte ON Mitarbeiter.Mitarbeiter-ID = Produkte.Verantwortlicher Mitarbeiter-ID;
  • Wie alt ist ein bestimmter Mitarbeiter?
    • SELECT DATEDIFF(CURDATE(), Mitarbeiter.Geburtsdatum) AS Alter FROM Mitarbeiter WHERE Mitarbeiter.Name = ‚Max Mustermann‘;
  • Wie viele Teile produziert ein Mitarbeiter?
    • SELECT Mitarbeiter.Name, Mitarbeiter.Produzierte Teile FROM Mitarbeiter WHERE Mitarbeiter.Name = ‚Maria Meier‘;

Natürlich können die Abfragen je nach Datenbankmanagementsystem und Schemastruktur variieren, aber das obige Beispiel sollte Ihnen eine Vorstellung davon geben, wie eine Datenbank aufgebaut sein könnte, um diese Arten von Fragen zu beantworten.

Welche Produkte produziert Hans Müller?

Basierend auf dem Beispiel-Datensatz, um herauszufinden, welche Produkte von Hans Müller produziert werden, können Sie die folgende Abfrage in SQL verwenden:

SELECT Produkte.Name FROM Produkte WHERE Produkte.Verantwortlicher_Mitarbeiter_ID = 3;

Diese Abfrage gibt eine Liste der Produkte zurück, die von dem Mitarbeiter mit der ID 3 (Hans Müller) produziert werden. Bitte beachten Sie, dass dies voraussetzt, dass die Daten in der Datenbank korrekt sind und jeder Mitarbeiter eine eindeutige Mitarbeiter-ID hat.

In diesem Programm kann ich nicht ersehen, wie du darauf kommst, dass Hans Müller die ID 3 hat, das muss doch erst bestimmt werden.

Entschuldigung, das war ein Versehen meinerseits. Tatsächlich war in meinem vorherigen Beispiel die ID des Mitarbeiters Hans Müller nicht explizit angegeben.

Um die ID von Hans Müller zu bestimmen, könnten Sie die folgende SQL-Abfrage verwenden:

SELECT Mitarbeiter.Mitarbeiter-ID FROM Mitarbeiter WHERE Mitarbeiter.Name = ‚Hans Müller‘;

Diese Abfrage würde die Mitarbeiter-ID von Hans Müller zurückgeben, die dann in der Abfrage zur Bestimmung der von ihm produzierten Produkte verwendet werden kann.

Die Abfrage zur Bestimmung der Produkte, die von Hans Müller produziert werden, würde dann wie folgt aussehen:

SELECT Produkte.Name FROM Produkte WHERE Produkte.Verantwortlicher_Mitarbeiter_ID = [ID von Hans Müller];

Bitte entschuldigen Sie nochmals die Verwirrung und lassen Sie mich wissen, wenn Sie weitere Fragen haben.

Das könnte doch in einem Programm integriert sein?

Ja, das ist richtig. Eine solche Datenbank und Abfragen könnten in einem Programm integriert werden, um dem Benutzer eine Benutzeroberfläche bereitzustellen, über die er die gewünschten Informationen abrufen kann.

Sie könnten beispielsweise eine grafische Benutzeroberfläche erstellen, in der der Benutzer auswählen kann, welche Art von Informationen er abrufen möchte (z. B. Informationen zu einem bestimmten Mitarbeiter oder Produkt), und dann eine Abfrage an die Datenbank senden, um die gewünschten Informationen zu erhalten. Das Ergebnis der Abfrage könnte dann in der Benutzeroberfläche angezeigt werden.

Alternativ könnte das Programm auch eine natürliche Sprachschnittstelle verwenden, die es dem Benutzer ermöglicht, in natürlicher Sprache zu kommunizieren, um die gewünschten Informationen abzurufen. Zum Beispiel könnte der Benutzer einfach fragen: „Welche Produkte produziert Hans Müller?“, und das Programm würde die entsprechende Abfrage an die Datenbank senden und das Ergebnis zurückgeben.

In jedem Fall könnte eine solche Anwendung den Benutzern helfen, schnell und einfach auf die gewünschten Informationen zuzugreifen, ohne dass sie SQL-Kenntnisse oder Datenbank-Management-Fähigkeiten benötigen.

[Nun das ist ein ziemliche Blabla. Ich ignoriere es]

Bitte schreibe das doch als einheitliches SQL-Programm

Hier ist ein Beispiel für ein SQL-Programm, das die oben genannten Tabellen und Abfragen implementiert:

sqlCopy code
-- Erstellen der Tabelle "Mitarbeiter"
CREATE TABLE Mitarbeiter (
  Mitarbeiter_ID INT PRIMARY KEY,
  Name VARCHAR(50) NOT NULL,
  Geburtsdatum DATE NOT NULL,
  Produzierte_Teile INT NOT NULL
);

-- Einfügen von Daten in die Tabelle "Mitarbeiter"
INSERT INTO Mitarbeiter (Mitarbeiter_ID, Name, Geburtsdatum, Produzierte_Teile)
VALUES (1, 'Max Mustermann', '1980-01-01', 1000),
       (2, 'Maria Meier', '1990-05-01', 500),
       (3, 'Hans Müller', '1975-12-15', 750);

-- Erstellen der Tabelle "Produkte"
CREATE TABLE Produkte (
  Produkt_ID INT PRIMARY KEY,
  Name VARCHAR(50) NOT NULL,
  Verantwortlicher_Mitarbeiter_ID INT NOT NULL,
  FOREIGN KEY (Verantwortlicher_Mitarbeiter_ID) REFERENCES Mitarbeiter(Mitarbeiter_ID)
);

-- Einfügen von Daten in die Tabelle "Produkte"
INSERT INTO Produkte (Produkt_ID, Name, Verantwortlicher_Mitarbeiter_ID)
VALUES (1, 'Produkt 1', 1),
       (2, 'Produkt 2', 1),
       (3, 'Produkt 3', 2),
       (4, 'Produkt 4', 3);

-- Abfrage, um die Produkte zu erhalten, die von einem bestimmten Mitarbeiter produziert werden
SELECT Produkte.Name 
FROM Produkte 
WHERE Produkte.Verantwortlicher_Mitarbeiter_ID = (SELECT Mitarbeiter.Mitarbeiter_ID 
                                                  FROM Mitarbeiter 
                                                  WHERE Mitarbeiter.Name = 'Hans Müller');

-- Abfrage, um das Alter eines bestimmten Mitarbeiters zu erhalten
SELECT DATEDIFF(CURDATE(), Mitarbeiter.Geburtsdatum) AS Alter 
FROM Mitarbeiter 
WHERE Mitarbeiter.Name = 'Max Mustermann';

-- Abfrage, um die Anzahl der von einem bestimmten Mitarbeiter produzierten Teile zu erhalten
SELECT Mitarbeiter.Name, Mitarbeiter.Produzierte_Teile 
FROM Mitarbeiter 
WHERE Mitarbeiter.Name = 'Maria Meier';

Diese Abfragen sollten die gleichen Ergebnisse liefern wie die in meiner vorherigen Antwort genannten Abfragen. Bitte beachten Sie jedoch, dass je nach verwendeter Datenbank und Datenbanksystem diese Abfragen möglicherweise angepasst werden müssen.

[Nun wurde der Zusammenhang zu oben etwas verloren]

Die Tabellen hatte wir doch vorher schon erzeugt. Konntest du nicht darauf zurückgreifen.

Oh, das tut mir leid für das Missverständnis. Ja, wenn die Tabellen bereits erstellt wurden, müssen sie nicht erneut erstellt werden.

Hier ist ein Beispiel für das SQL-Programm, das die Abfragen ausführen würde, um die Fragen zu beantworten, die Sie gestellt haben, vorausgesetzt, dass die Tabellen „Mitarbeiter“ und „Produkte“ bereits erstellt und mit Daten gefüllt wurden:

sqlCopy code-- Abfrage, um die Produkte zu erhalten, die von einem bestimmten Mitarbeiter produziert werden
SELECT Produkte.Name 
FROM Produkte 
WHERE Produkte.Verantwortlicher_Mitarbeiter_ID = (SELECT Mitarbeiter.Mitarbeiter_ID 
                                                  FROM Mitarbeiter 
                                                  WHERE Mitarbeiter.Name = 'Hans Müller');


-- Abfrage, um das Alter eines bestimmten Mitarbeiters zu erhalten
SELECT DATEDIFF(CURDATE(), Mitarbeiter.Geburtsdatum) AS Alter 
FROM Mitarbeiter 
WHERE Mitarbeiter.Name = 'Max Mustermann';

-- Abfrage, um die Anzahl der von einem bestimmten Mitarbeiter produzierten Teile zu erhalten
SELECT Mitarbeiter.Name, Mitarbeiter.Produzierte_Teile 
FROM Mitarbeiter 
WHERE Mitarbeiter.Name = 'Maria Meier';
[nach den letzten beiden Dinge hatte ich nicht gefragt. Hier drückt sich wohl wieder der Hang zur Weitschweifigkeit aus]

Diese Abfragen sollten die gleichen Ergebnisse liefern wie in meinen vorherigen Antworten. Bitte beachten Sie, dass die Abfragen je nach Datenbanksystem und Schemastruktur variieren können, aber die oben genannten Abfragen sollten in den meisten Fällen funktionieren.