SQL Graph-Architektur

Gilt für: SQL Server 2017 (14.x) und höher Azure SQL-DatenbankAzure SQL Managed Instance

Erfahren Sie mehr über die Architektur von SQL Graph. Die Kenntnisse der Grundlagen erleichtern das Verständnis anderer SQL Graph-Artikel.

SQL Graph-Datenbank

Benutzer können ein Diagramm pro Datenbank erstellen. Ein Graph ist eine Auflistung von Knoten- und Edgetabellen. Knoten- oder Edgetabellen können unter einem beliebigen Schema in der Datenbank erstellt werden, aber sie gehören alle zu einem logischen Diagramm. Eine Knotentabelle ist eine Auflistung ähnlicher Knotentypen. Beispielsweise enthält eine Person Knotentabelle alle Knoten, die Person zu einem Diagramm gehören. In ähnlicher Weise ist eine Edgetabelle eine Sammlung ähnlicher Kantentypen. Beispielsweise enthält eine Friends Edgetabelle alle Kanten, die eine mit einer Person anderen Personverbinden. Da Knoten und Kanten in Tabellen gespeichert werden, werden die meisten Vorgänge, die für reguläre Tabellen unterstützt werden, für Knoten- oder Edgetabellen unterstützt.

Das folgende Diagramm zeigt die SQL Graph-Datenbankarchitektur.

Diagramm der SQL Graph-Datenbankarchitektur

Knotentabelle

Eine Knotentabelle stellt eine Entität in einem Diagrammschema dar. Jedes Mal, wenn eine Knotentabelle zusammen mit den benutzerdefinierten Spalten erstellt wird, wird eine implizite $node_id Spalte erstellt, die einen bestimmten Knoten in der Datenbank eindeutig identifiziert. Die Werte in $node_id werden automatisch generiert und sind eine Kombination aus Objekt-ID für die Graphtabelle dieser Knotentabelle und einem intern generierten Bigint-Wert . Wenn die $node_id Spalte jedoch ausgewählt ist, wird ein berechneter Wert in Form einer JSON-Zeichenfolge angezeigt. Außerdem ist eine Pseudospalte, $node_id die einem internen Namen mit einem eindeutigen Suffix zugeordnet ist. Wenn Sie die $node_id Pseudospalte aus der Tabelle auswählen, wird der Spaltenname als $node_id_<unique suffix>angezeigt.

Hinweis

Die Verwendung der Pseudospalten in Abfragen ist die einzige unterstützte und empfohlene Methode zum Abfragen der internen $node_id Spalte. Sie sollten die $node_id_<hex_string> Spalten nicht direkt in Abfragen verwenden. Darüber hinaus ist die berechnete JSON-Darstellung, die in den Pseudospalten angezeigt wird, ein Implementierungsdetail. Sie sollten keine direkte Abhängigkeit vom Format dieser JSON-Darstellung nehmen. Wenn Sie sich mit dieser JSON-Darstellung befassen müssen, ziehen Sie die Verwendung des NODE_ID_FROM_PARTS() und anderer verwandter Systemfunktionen in Betracht. Es wird nicht empfohlen, die Graph-Pseudospalten ($node_id, $from_id, $to_id) in Prädikaten direkt zu verwenden. Beispielsweise sollte ein Prädikat wie n.$node_id = e.$from_id vermieden werden. Solche Vergleiche sind aufgrund der Konvertierung in die JSON-Darstellung in der Regel ineffizient. Verlassen Sie sich stattdessen so weit wie möglich auf die MATCH-Funktion.

Es wird empfohlen, dass Benutzer zum Zeitpunkt der Erstellung der Knotentabelle eine eindeutige Einschränkung oder einen eindeutigen Index für die $node_id Spalte erstellen. Wenn sie jedoch nicht erstellt wird, wird automatisch ein eindeutiger, nicht gruppierter Standardindex erstellt. Jeder Index für eine Graph-Pseudospalte wird jedoch für die zugrunde liegenden internen Spalten erstellt. Das heißt, ein index, der für die $node_id Spalte erstellt wurde, wird in der internen graph_id_<hex_string> Spalte angezeigt.

Edgetabelle

Eine Edgetabelle stellt eine Beziehung in einem Graphen dar. Edges sind immer gerichtet und verbinden zwei Knoten. Eine Edgetabelle ermöglicht benutzern das Modellieren von n:n-Beziehungen im Graphen. Benutzerdefinierte Spalten ("Attribute") sind in einer Edgetabelle optional. Jedes Mal, wenn eine Edgetabelle zusammen mit den benutzerdefinierten Spalten erstellt wird, werden drei implizite Spalten in der Edgetabelle erstellt:

Spaltenname BESCHREIBUNG
$edge_id Identifiziert eindeutig einen bestimmten Edge in der Datenbank. Es handelt sich um eine generierte Spalte, und der Wert ist eine Kombination aus object_id der Edgetabelle und einem intern generierten Bigint-Wert . Wenn die $edge_id Spalte jedoch ausgewählt ist, wird ein berechneter Wert in Form einer JSON-Zeichenfolge angezeigt. $edge_id ist eine Pseudospalte, die einem internen Namen mit einem eindeutigen Suffix zugeordnet ist. Wenn Sie aus der Tabelle auswählen $edge_id , wird der Spaltenname als $edge_id_<unique suffix>angezeigt. Die Verwendung von Pseudospaltennamen in Abfragen ist die empfohlene Methode zum Abfragen der internen $edge_id Spalte, und die Verwendung des internen Namens mit einer Sechskantzeichenfolge sollte vermieden werden.
$from_id Speichert den $node_id des Knotens, von dem der Edge stammt.
$to_id Speichert den $node_id des Knotens, an dem der Edge endet.

Die Knoten, mit denen ein bestimmter Edge eine Verbindung herstellen kann, werden durch die in die Spalten und $to_id eingefügten $from_id Daten gesteuert. In der ersten Version ist es nicht möglich, Einschränkungen für die Edgetabelle zu definieren, um die Verbindung zwischen zwei Knotentypen zu beschränken. Das heißt, ein Edge kann unabhängig von ihren Typen beliebige zwei Knoten im Diagramm verbinden.

Ähnlich wie bei der $node_id Spalte wird empfohlen, dass Benutzer zum Zeitpunkt der Erstellung der Edgetabelle einen eindeutigen Index oder eine Einschränkung für die $edge_id Spalte erstellen. Wenn dieser jedoch nicht erstellt wird, wird automatisch ein eindeutiger, nicht gruppierter Standardindex für diese Spalte erstellt. Jeder Index für eine Graph-Pseudospalte wird jedoch für die zugrunde liegenden internen Spalten erstellt. Das heißt, ein index, der für die $edge_id Spalte erstellt wurde, wird in der internen graph_id_<unique suffix> Spalte angezeigt. Es wird auch empfohlen, für OLTP-Szenarien einen Index für ($from_id, $to_id) Spalten zu erstellen, um schneller in Richtung des Edges suchen zu können.

Das folgende Diagramm zeigt, wie Knoten- und Edgetabellen in der Datenbank gespeichert werden.

Diagramm, das die Darstellung der Knoten- und Edgetabelle zeigt.

Metadaten

Verwenden Sie diese Metadatenansichten, um Attribute eines Knotens oder einer Edgetabelle anzuzeigen.

sys.tables

Die folgenden bit Spalten in sys.tables können verwendet werden, um Graphtabellen zu identifizieren. Wenn is_node auf 1 festgelegt ist, handelt es sich bei der Tabelle um eine Knotentabelle, und wenn is_edge auf 1 festgelegt ist, handelt es sich bei der Tabelle um eine Randtabelle.

Spaltenname Datentyp BESCHREIBUNG
is_node bit Für Knotentabellen is_node ist auf 1 festgelegt.
is_edge bit Für Edgetabellen is_edge ist auf 1 festgelegt.

sys.columns

Die graph_type Spalten und graph_type_desc in der sys.columns Ansicht sind nützlich, um die verschiedenen Spaltentypen zu verstehen, die in Graphknoten- und Edgetabellen verwendet werden:

Spaltenname Datentyp BESCHREIBUNG
graph_type int Interne Spalte mit einer Gruppe von Werten. Die Werte liegen zwischen 1 und 8 für Diagrammspalten und lauten NULL für andere.
graph_type_desc nvarchar(60) Interne Spalte mit einer Gruppe von Werten.

In der folgenden Tabelle sind die gültigen Werte für graph_type die Spalte aufgeführt:

Spaltenwert BESCHREIBUNG
1 GRAPH_ID
2 GRAPH_ID_COMPUTED
3 GRAPH_FROM_ID
4 GRAPH_FROM_OBJ_ID
5 GRAPH_FROM_ID_COMPUTED
6 GRAPH_TO_ID
7 GRAPH_TO_OBJ_ID
8 GRAPH_TO_ID_COMPUTED

sys.columns speichert auch Informationen zu impliziten Spalten, die in Knoten- oder Edgetabellen erstellt werden. Die folgenden Informationen können aus sys.columns abgerufen werden. Benutzer können diese Spalten jedoch nicht aus einem Knoten oder einer Edgetabelle auswählen.

Die impliziten Spalten in einer Knotentabelle sind:

Spaltenname Datentyp is_hidden Kommentar
graph_id_\<hex_string> bigint 1 Interner Graph-ID-Wert.
$node_id_\<hex_string> NVARCHAR 0 Externe Zeichendarstellung der Knoten-ID.

Die impliziten Spalten in einer Edgetabelle sind:

Spaltenname Datentyp is_hidden Kommentar
graph_id_\<hex_string> bigint 1 Interner Graph-ID-Wert.
$edge_id_\<hex_string> NVARCHAR 0 Zeichendarstellung der Edge-ID.
from_obj_id_\<hex_string> INT 1 Interner object_id Wert für den "vom Knoten".
from_id_\<hex_string> bigint 1 Interner Graph-ID-Wert für den "from node".
$from_id_\<hex_string> NVARCHAR 0 Zeichendarstellung des "vom Knoten".
to_obj_id_\<hex_string> INT 1 Intern object_id für den "knoten".
to_id_\<hex_string> bigint 1 Interner Graph-ID-Wert für den Knoten "to".
$to_id_\<hex_string> NVARCHAR 0 Externe Zeichendarstellung des "zum Knoten".

Systemfunktionen

Sie können die folgenden integrierten Funktionen verwenden, um mit den Pseudospalten in Graphtabellen zu interagieren. Ausführliche Verweise für jede dieser Funktionen werden in den jeweiligen T-SQL-Funktionsreferenzen bereitgestellt.

Integriert BESCHREIBUNG
OBJECT_ID_FROM_NODE_ID Extrahieren Sie die Objekt-ID für die Diagrammtabelle aus einem node_id.
GRAPH_ID_FROM_NODE_ID Extrahieren Sie den Graph-ID-Wert aus einem node_id.
NODE_ID_FROM_PARTS Erstellen Sie eine node_id aus einer Objekt-ID für die Graphtabelle und einem Graph-ID-Wert.
OBJECT_ID_FROM_EDGE_ID Extrahieren Sie die Objekt-ID für die Diagrammtabelle aus edge_id.
GRAPH_ID_FROM_EDGE_ID Extrahieren Sie den Graph-ID-Wert für einen angegebenen edge_id.
EDGE_ID_FROM_PARTS Erstellen Sie edge_id aus der Objekt-ID für die Graphtabelle und den Graph-ID-Wert.

Transact-SQL-Referenz

Erfahren Sie mehr über die Transact-SQL-Erweiterungen, die in SQL Server und Azure SQL-Datenbank eingeführt wurden, die das Erstellen und Abfragen von Graphobjekten ermöglichen. Die Abfragesprachenerweiterungen helfen beim Abfragen und Durchlaufen des Graphen mithilfe der ASCII-Art-Syntax.

Anweisungen der Data Definition Language (DDL)

Aufgabe Verwandter Artikel Notizen
CREATE TABLE CREATE TABLE (Transact-SQL) CREATE TABLE wird jetzt erweitert, um das Erstellen einer Tabelle AS NODE oder AS EDGE zu unterstützen. Eine Edgetabelle kann benutzerdefinierte Attribute aufweisen oder nicht.
ALTER TABLE ALTER TABLE (Transact-SQL) Knoten- und Edgetabellen können mit ALTER TABLEdem geändert werden, wie eine relationale Tabelle ist. Benutzer können benutzerdefinierte Spalten, Indizes oder Einschränkungen hinzufügen oder ändern. Das Ändern interner Diagrammspalten wie $node_id oder führt $edge_idjedoch zu einem Fehler.
CREATE INDEX CREATE INDEX (Transact-SQL) Benutzer können Indizes für Pseudospalten und benutzerdefinierte Spalten in Knoten- und Edgetabellen erstellen. Alle Indextypen werden unterstützt, einschließlich gruppierter und nicht gruppierter Columnstore-Indizes.
ERSTELLEN VON EDGEEINSCHRÄNKUNGEN EDGE CONSTRAINTS (Transact-SQL) Benutzer können jetzt Edgeeinschränkungen für Edgetabellen erstellen, um bestimmte Semantiken zu erzwingen und die Datenintegrität aufrechtzuerhalten.
DROP TABLE DROP TABLE (Transact-SQL) Knoten- und Edgetabellen können mit dem gelöscht werden, DROP TABLEwie eine relationale Tabelle ist. Derzeit gibt es keine Mechanismen, um das Löschen von Knoten zu verhindern, auf die durch Kanten verwiesen wird. Es gibt keine Unterstützung für das kaskadierte Löschen von Kanten beim Löschen eines Knotens (oder löschen der gesamten Knotentabelle). In all diesen Fällen müssen alle Kanten, die mit den gelöschten Knoten verbunden sind, manuell gelöscht werden, um die Konsistenz des Diagramms zu erhalten.

Anweisungen der Data Manipulation Language (DML)

Aufgabe Verwandter Artikel Notizen
INSERT INSERT (Transact-SQL) Das Einfügen in eine Knotentabelle unterscheidet sich nicht vom Einfügen in eine relationale Tabelle. Die Werte für $node_id die Spalte werden automatisch generiert. Der Versuch, einen Wert in $node_id oder $edge_id spalte einzufügen, führt zu einem Fehler. Benutzer müssen Werte für $from_id und $to_id Spalten angeben, während sie in eine Edgetabelle einfügen. $from_id und $to_id sind die $node_id Werte der Knoten, die ein bestimmter Edge verbindet.
Delete DELETE (Transact-SQL) Daten aus Knoten- oder Edgetabellen können genauso wie aus relationalen Tabellen gelöscht werden. In dieser Version gibt es jedoch keine Einschränkungen, um sicherzustellen, dass keine Kanten auf einen gelöschten Knoten verweisen und das kaskadierte Löschen von Kanten beim Löschen eines Knotens nicht unterstützt wird. Es wird empfohlen, dass beim Löschen eines Knotens auch alle Verbindungskanten mit diesem Knoten gelöscht werden.
UPDATE UPDATE (Transact-SQL) Werte in benutzerdefinierten Spalten können mithilfe der UPDATE-Anweisung aktualisiert werden. Sie können die internen Diagrammspalten, $node_id, $edge_idund $from_id$to_idnicht aktualisieren.
MERGE MERGE (Transact-SQL) MERGE -Anweisung wird für einen Knoten oder eine Edgetabelle unterstützt.

Abfrageanweisungen

Aufgabe Verwandter Artikel Notizen
SELECT SELECT (Transact-SQL) Da Knoten und Kanten als Tabellen gespeichert werden, werden die meisten Tabellenvorgänge auch für Knoten- und Edgetabellen unterstützt.
MATCH MATCH (Transact-SQL) Die integrierte MATCH-Funktion wird eingeführt, um den Musterabgleich und die Durchquerung des Diagramms zu unterstützen.

Einschränkungen

Es gibt bestimmte Einschränkungen für Knoten- und Edgetabellen:

  • Lokale oder globale temporäre Tabellen können keine Knoten- oder Edgetabellen sein.
  • Tabellentypen und Tabellenvariablen können nicht als Knoten oder Edgetabelle deklariert werden.
  • Knoten- und Edgetabellen können nicht als temporale Tabellen mit Systemversion erstellt werden.
  • Knoten- und Edgetabellen können keine speicheroptimierten Tabellen sein.
  • Benutzer können die $from_id Spalten und $to_id eines Edges nicht mithilfe der UPDATE-Anweisung aktualisieren. Um Knoten zu aktualisieren, auf die ein Edge verweist, müssen Benutzer einen neuen Edge einfügen, der auf neue Knoten zeigt, und den vorherigen knoten löschen.
  • Datenbankübergreifende Abfragen für Graphobjekte werden nicht unterstützt.

Siehe auch

Nächste Schritte