Graph-IT

Knotenknoten

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.

Verknüpfungen

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.

Verknüpfen, Entknüpfen und Navigieren

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.

Unterschiede zu anderen Kanten-Konzepten

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 als Aspekte

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.

Verknüpfungen eines Knoten mit sich selbst

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: Vorgesetzte und Mitarbeiter

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: vorgesetzt und untergeben

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.

Typisieren von 1-zu-n-Verknüpfungen

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.

Faktorisieren von n-zu-n-Verknüpfungen

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.