Knotenknoten legen fest, welche Verknüpfungen zwischen Knoten-Instanzen
möglich sind.
Der name
bzw. typ
eines Knotenknoten hat die Form <knoten>_<knoten>
.
Er besteht also aus den Typen der beiden Knoten, deren Instanzen verknüpft
werden.
Diese werden lexikalisch sortiert, um einen eindeutigen Namen zu bekommen.
Außerdem hat ein Knotenknoten einen verknuepfungstyp
, der 11
, 1n
,
n1
oder nn
sein kann.
Dieser gibt an, ob von dem jeweiligen Knoten aus höchstens ein oder
beliebig viele Instanzen des anderen Knoten verknüpft werden können.
Zum Beispiel hätte ein Knotenknoten kunde_rechnung
sinnvollerweise den
Verknüpfungstyp n1
.
Jedem Kunden können beliebig viele Rechnungen gestellt werden.
Jede Rechnung hat aber höchstens einen Kunden, dem sie gestellt wird.
Für jede knotenknoten
-Instanz werden durch den Graphen automatisch zwei
verknuepfung
-Instanzen abgeleitet.
Diese stellen die beiden Richtungen der Verknüpfung dar.
Für den Knotenknoten kunde_rechnung
mit Verknüpfungstyp n1
existieren
die Verknüpfungen kunde_rechnung
mit Verknüpfungstyp n
und
rechnung_kunde
mit Verknüpfungstyp 1
.
Mit den API-Funktionen
verknuepfe(string $node_guid1, string $node_guid2): ?boolean
und
entknuepfe(string $node_guid1, string $node_guid2): ?boolean
können
Knoten-Instanzen ver- und entknüpft werden.
Die Reihenfolge, in der die Instanz-GUIDs angegeben werden, ist dabei egal.
Wenn zwischen den entsprechenden Knoten ein Knotenknoten existiert, kann
dieser eindeutig hergeleitet werden.
Im Fall von zu-1-Verknüpfungen entknüpft ein erneuter verknuepfe()
-Aufruf
automatisch eine eventuell schon vorher bestehende Verknüpfung.
Wenn sich durch ein Ver- oder Entknüpfen der Wert einer Datenfunktion an einer der beteiligten Instanzen eventuell ändert, wird durch das Ver- oder Entknüpfen eine Neuberechnung der Datenfunktion an dieser Instanz ausgelöst.
Mit der API-Funktion
knoten(string $node_guid, string $knoten_typ): ?string
kann in Richtung
einer zu-1-Verknüpfung navigiert werden.
Wenn mit der durch eine GUID gegebenen Instanz eine Instanz des gegebenen
Knoten-Typs verknüpft ist, wird deren GUID zurück gegeben.
Mit der API-Funktion
liste(string $node_guid, string $knoten_typ): ?list<string>
kann
entsprechend in Richtung einer zu-n-Verknüpfung navigiert werden.
Die Rückgabe kann wie in der API-Dokumentation
beschrieben durch Reihenfolgen und Eingrenzungen genauer bestimmt werden.
Außerdem stehen die API-Funktionen listeattribute()
und listezahl()
zur
Verfügung.
listeattribute()
erlaubt das gleichzeitige Abfragen von Attribut-Werten
an den Ziel-Instanzen.
listezahl()
kann verwendet werden, wenn nur die Anzahl der verknüpften
Instanzen, aber keine nähere Information benötigt wird.
Es gibt viele verschiedene Definitionen von Graphen mit unterschiedlichen Arten von Kanten zwischen Knoten. Kanten können eine Richtung, Namen oder sogar weitere Attribute haben. Kanten von einem Knoten zu sich selbst können erlaubt oder verboten sein.
Für das hier verwendete Konzept Knotenknoten wurde jeweils die einfachste Möglichkeit gewählt.
Knotenknoten haben keine Richtung. Die Reihenfolge der verknüpften Knoten im Namen des Knotenknoten ist immer lexikalisch. Die Verknüpfungen zwischen Instanzen können immer in beide Richtungen navigiert werden.
Knotenknoten haben keine Namen. Zwischen zwei Knoten gibt es entweder einen Knotenknoten oder es gibt keinen. Es kann nicht unterschiedliche Arten von Verknüpfungen zwischen den gleichen Knoten geben. Knotenknoten haben auch keine weiteren Attribute. Zwei Knoten-Instanzen sind entweder verknüpft oder nicht.
Knotenknoten werden immer zwischen verschiedenen Knoten definiert. Knotenknoten eines Knoten mit sich selbst sind nicht möglich. Direkte Verknüpfungen zwischen Instanzen des gleichen Knoten existieren nicht.
All diese komplexeren Strukturen können aber mit dem hier verwendeten einfachen Konzept mit weiteren Hilfsknoten realisiert werden. Einige Muster hierfür werden im Folgenden vorgestellt.
1-zu-1-Verknüpfungen stellen oft Aspekte des gleichen Konzepts dar bzw. können als solche gesehen werden. Dies kann sinnvoll sein, um Attribute und Verknüpfungen sinnvoll zu gruppieren und damit übersichtlicher zu machen. Die Existenz dieses Aspekts – also einer verknüpften Instanz – kann dabei je nach Anwendungsfall obligatorisch oder optional sein.
Beispielsweise könnte ein Knoten artikel
1-zu-1 mit Knoten
lagerartikel
, rechnungsartikel
und sortimentsartikel
verknüpft sein,
wobei dann das Gewicht nur im Aspekt lagerartikel
, der Preis aber nur im
Aspekt rechnungsartikel
relevant ist.
Außerdem werden solche 1-zu-1-Verknüpfungen verwendet, um über Graphmodul-Grenzen hinweg Beziehungen herzustellen. Der verknüpfte Knoten stellt dann den für das jeweilige Graphmodul relevanten Aspekt dar.
Als Beispiel für eine zu modellierende Beziehung eines Knoten mit sich selbst nehmen wir eine Vorgesetzten-Beziehung zwischen Personen.
Wir können dies dadurch modellieren, dass wir vorgesetzter
und
mitarbeiter
im Sinn des vorigen Abschnitts als Aspekte des Knotens
person
sehen.
Es gibt dann also einen 1-zu-1-Knotenknoten person_vorgesetzter
und einen
1-zu-1-Knotenknoten mitarbeiter_person
.
Der wesentliche Inhalt der Beziehung befindet sich dann im
n-zu-n-Knotenknoten mitarbeiter_vorgesetzter
.
Ein Beispiel hierzu ist in der folgenden Skizze zu sehen:
Ein Geschäftsführer GF
ist zwei Abteilungsleitern AL1
und AL2
vorgesetzt.
AL1
hat zwei Sachbearbeiter SB1
und SB2
, AL2
zwei Sachbearbeiter
SB2
und SB3
.
Da SB2
zwei Abteilungen zugeordnet ist, zwei Vorgesetzte hat, modellieren
wir die Beziehung als n-zu-n.
Eine Alternative Modellierung benutzt Knoten vorgesetzt
und untergeben
mit 1-zu-n-Knotenknoten person_vorgesetzt
und person_untergeben
wie in
der folgenden Skizze zu sehen:
Die Instanzen von vorgesetzt
und untergeben
sind dann die Paare, die in
Beziehung stehen.
Sie sind 1-zu-1 miteinander verknüpft, stellen also wieder Aspekte des
gleichen Sachverhalts dar.
Der Vorteil dieser Modellierung ist, dass von Person aus direkt Instanzen für alle Mitarbeiter, denen eine Person vorgesetzt ist, bzw. Vorgesetzte, denen eine Person untergeben ist, verknüpft sind. Es muss also nicht erst über eine nicht aussagekräftige 1-zu-1-Verknüpfung navigiert werden.
Weitere alternative Modellierungen für Beziehungen eines Knoten mit sich
selbst, sind durch knotenknoten
und verknuepfung
selbst als Beziehungen
zwischen knoten
-Instanzen gegeben.
Der Knoten knotenknoten
hat einen 1-zu-n-Knotenknoten zu knoten
, wobei
dieser so eingeschränkt wird, dass immer genau zwei knoten
-Instanzen
verknüpft sein müssen.
Die modelliert eine ungerichtete Beziehung zwischen Knoten.
Die Navigation über eine solche Struktur ist aber etwas kompliziert, da
immer verglichen werden muss, wenn zu dem anderen der beiden verknüpften
Knoten navigiert werden soll.
Der Knoten verknuepfung
hat eine zu-1-Verknüpfung zum Quellknoten,
während der Zielknoten nicht direkt verknüpft, sondern sein typ
nur als
Attribut-Wert vorhanden ist.
Auf diese Weise lässt sich eine gerichtete Beziehung mit weniger
Struktur-Elementen modellieren, als dies bei den weiter oben vorgestellten
Möglichkeiten notwendig war.
Es kann mehrere unterschiedliche Arten von Beziehungen zwischen den gleichen Knoten geben. Da der Graph keine Namen für Knotenknoten kennt, müssen in diesem Fall Zwischenknoten zur Typisierung verwendet werden.
Beispielsweise hat eine email
verschiedene Arten – from
, to
, cc
–
von Beziehungen zu emailadresse
.
Es kann auch einen 1-zu-n-Knotenknoten email_emailadresse
geben, dieser
enthält aber nicht genug Information, um die verschiedenen Rollen zu
unterscheiden.
Wie schon im vorigen Abschnitt gibt es zwei mögliche Modellierungen:
Knoten emailfrom
, emailto
und emailcc
können als Aspekte von email
mit 1-zu-1-Knotenknoten verknüpft werden.
Von diesen aus kann dann 1-zu-1 von emailfrom
und 1-zu-n von emailto
und emailcc
zu `emailadresse verknüpft werden.
Diese Modellierung hat den Vorteil, dass das Zusammensetzen zu einem der
E-Mail-Header bereits an diesen Aspekt-Knoten vollzogen werden kann.
Die andere Möglichkeit ist, dass Knoten emailadressefrom
,
emailadresseto
und emailadressecc
1-zu-1 mit emailadresse
verknüpft
werden, also als Aspekte/Verwendungsarten von Adressen.
Der Knoten email
wird dann 1-zu-1 mit emailadressefrom
und 1-zu-n mit
emailadresseto
und emailadressecc
verknüpft.
Hier ist wieder der Vorteil, dass die verschiedenen verknüpften Adressen
und ihre Anzahl direkt an den Instanzen von email
sichtbar und
navigierbar sind.
n-zu-n-Beziehungen lassen sich immer in eine n-zu-1- und eine 1-zu-n-Verknüpfung zerlegen.
Ein Beispiel hierfür aus dem Graph-Kern ist die Beziehung zwischen Attributen und Knoten. Ein Attribut kann an beliebig vielen Knoten verwendet werden und ein Knoten kann beliebig viele Attribute haben.
Diese n-zu-n-Beziehung wird durch Attributknoten in den n1
-Knotenknoten
attribut_attributknoten
und den 1n
-Knotenknoten attributknoten_knoten
faktorisiert.