GOV Entwicklung Relationen-Index
- Kante
Eine Kante ist eine Relationen zwischen zwei GOV-Objekten. Sie ist gerichtet und hat einen Anfangs- und einen End-Knoten. Im Beispiel sind Kanten mit dem Buchstaben 'K' beschriftet.
- Pfade
Ein Pfad ist eine Menge von adjazenten Kanten. Er ist gerichtet und hat einen Anfangs- und einen End-Knoten. Zwischen zwei GOV-Objekten kann es zwei oder mehr verschiedene Pfade geben. Im Beispiel sind Pfade rot eingezeichnet und mit dem Buchstaben 'P' beschriftet.
Einfügen einer neuen Kante
Sei kn neue Kante mit Anfangsknoten ka und Endknoten ke (genauer ist kn die Nummer der Kante, ka und ke die Nummern der Knoten).
Die Zwischentabelle n erzeugen:
CREATE TEMPORARY TABLE n ( nummer int, v int, n int);
Die neue Kante in die Tabelle der neuen Pfade eintragen:
INSERT INTO n (v,n) VALUES (0,0);
alle Vorgänger-Pfade in die Tabelle der neuen Pfade eintragen:
INSERT INTO n (v,n) SELECT nummer,0 FROM p WHERE p.ende = ka;
alle Nachfolger-Pfade in die Tabelle der neuen Pfade eintragen:
INSERT INTO n (v,n) SELECT 0,nummer FROM p WHERE p.anfang = ke;
alle Pfade, die über die neue Kante laufen: INSERT INTO n (v,n) SELECT p1.nummer, p2.nummer FROM p p1, p p2 WHERE p1.ende=ka AND p2.anfang=ke;
aus N neue Einträge in P erstellen:
die eine neue Kante:
INSERT INTO p SELECT n.nummer,ka,ke,1 FROM n WHERE n.v=0 AND n.n=0;
alle Pfade, die die neue Kante als letzte Kante haben:
INSERT INTO p SELECT n.nummer,p.anfang, ke, p.laenge+1 FROM n,p WHERE n.v = p.nummer AND n.n=0;
alle Pfade, die die neue Kante als erste Kante haben:
INSERT INTO p SELECT n.nummer, ka ,p.ende,p.laenge+1 FROM n,p WHERE n.n = p.nummer AND n.v=0;
alle Pfade, die die neue Kante in der Mitte enthalten:
INSERT INTO p SELECT n.nummer, p1.anfang , p2.ende,p1.laenge+p2.laenge+1 FROM n, p p1, p p2 WHERE p1.nummer = n.v AND p2.nummer = n.n AND n.v!=0 AND n.n!=0;
in PK eintragen:
die eine neue Kante:
INSERT INTO pk SELECT n.nummer,kn FROM n WHERE n.v=0 AND n.n=0;
den Rest (die letzte Bedingung schließen den Pfad, der nur aus der neuen Kante besteht, aus)
INSERT INTO pk SELECT n.nummer, pk.kante FROM pk, n WHERE pk.pfad =n.v OR pk.pfad = n.n OR pk.kante=8 AND (n.n > 0 OR n.v > 0 );
Löschen einer Kante
INSERT INTO d SELECT pfad FROM pk WHERE kante = kn; DELETE FROM p WHERE p.nummer IN ( SELECT * FROM d ); DELETE FROM pk WHERE pfad IN ( SELECT * FROM d );
alte SQL-Befehle
INSERT INTO relation_index SELECT r1.parent, r0.child, 2 FROM Relation r0, Relation r1 WHERE r0.parent=r1.child; INSERT INTO relation_index SELECT r2.parent, r0.child, 3 FROM Relation r0, Relation r1, Relation r2 WHERE r0.parent=r1.child AND r1.parent=r2.child; INSERT INTO relation_index SELECT r3.parent, r0.child, 4 FROM Relation r0, Relation r1, Relation r2, Relation r3 WHERE r0.parent=r1.child AND r1.parent=r2.child AND r2.parent=r3.child; INSERT INTO relation_index SELECT r4.parent, r0.child, 5 FROM Relation r0, Relation r1, Relation r2, Relation r3, Relation r4 WHERE r0.parent=r1.child AND r1.parent=r2.child AND r2.parent=r3.child AND r3.parent=r4.child;