In diesem Dokument wird das Spanner-Graphschema beschrieben und es werden Beispiele zur Veranschaulichung der wichtigsten Konzepte aufgeführt. Weitere Informationen zu Spanner Graph finden Sie unter Spanner Graph – Übersicht.
Attributgrafik-Datenmodell
Mit einem Property-Graph können Sie verbundene Daten modellieren. Dabei werden Informationen als Netzwerk aus Knoten und Kanten dargestellt. Knoten symbolisieren Entitäten in Ihrer Datenlandschaft, z. B. Kunden, Produkte oder Standorte. Kanten zeigen die Verbindungen zwischen diesen Knoten und erfassen Beziehungen wie „gekauft“, „folgt“ oder „befindet sich in“.
Sowohl Knoten als auch Kanten können die folgenden Informationen enthalten:
- Labels, mit denen Knoten und Kanten in Gruppen klassifiziert werden, z. B. Ort.
- Eigenschaften, d. h. Schlüssel/Wert-Paare, z. B. population.
Das Beispiel in Abbildung 1 zeigt, wie Sie ein Diagramm zum Modellieren von Finanzaktivitäten entwerfen können. Dieses Diagramm enthält die folgenden Arten von Entitäten, die als Knoten modelliert sind:
- Person: Stellt eine natürliche Person dar, die an Finanztransaktionen beteiligt ist.
- Konto:Stellt ein Bankkonto dar, das für Transaktionen verwendet wird.
Diese Entitäten sind durch verschiedene Arten von Beziehungen verbunden, die durch die folgenden gerichteten Kanten dargestellt werden:
- Inhaber: Eine Person ist Inhaber eines oder mehrerer Konten.
- Überweisungen:Geld wird von einem Konto auf ein anderes überwiesen.
Jede gerichtete Kante gibt eine Einwegbeziehung an, die von einem Quellknoten zu einem Zielknoten verläuft. Eine Transfers
-Kante verbindet beispielsweise eine Quelle Account
mit einem Ziel Account
und gibt den Geldfluss an.
Abbildung 1. Beispiel für einen Graphen mit mehreren Knoten und gerichteten Kanten.
Knoten und Kanten können zusätzliche Informationen in Properties enthalten. Jedes Attribut hat einen Namen und einen Wert.
- Person-Knoten haben die folgenden Eigenschaften:
name
(STRING
)id
(INT64
)
- Kanten vom Typ Übertragungen haben die folgende Eigenschaft:
amount
(FLOAT64)
Gerichtete und ungerichtete Kanten
Im Beispielgraphen werden gerichtete Kanten verwendet, die eine bestimmte Richtung in der Beziehung zwischen Entitäten angeben. Einige Beziehungen, z. B. die Freundschaft in einem sozialen Netzwerk, sind jedoch nicht gerichtet und stellen eine beidseitige Verbindung ohne eindeutigen Ursprung oder Endpunkt dar. In diesem Fall können Sie ungerichtete Kanten als zwei gerichtete Kanten modellieren, eine in jede Richtung.
Spanner Graph-Schemadesign
Mit Spanner Graph können Sie mit der Anweisung CREATE PROPERTY GRAPH ein Diagramm aus Tabellen erstellen. Die Tabellen, die zum Erstellen von Diagrammen verwendet werden, werden als Eingabetabellen bezeichnet. Dieser Ansatz basiert auf SQL/PGQ (Property Graph Queries), das Teil der SQL:2023-Standards ist.
Knoten in einer Property-Graphik definieren
Um einen Knoten zu definieren, fügen Sie in der NODE TABLES-Klausel eine Knotendefinition hinzu. Die einfachste Form der Knotendefinition enthält nur den Namen einer Eingabetabelle. Zeilen aus der Eingabetabelle werden Graphknoten zugeordnet.
Im folgenden Beispiel wird mit der Klausel NODE TABLES der Knoten Account
in der Property-Graph FinGraph
definiert. Die Knotendefinition enthält die Eingabetabelle Account
.
-- First, create an Account table.
CREATE TABLE Account (
id INT64 NOT NULL,
create_time TIMESTAMP,
) PRIMARY KEY (id);
-- Next, use the Account table as input table of Account node definition.
CREATE PROPERTY GRAPH FinGraph
NODE TABLES (
Account
);
Standardlabel und -attribute
Standardmäßig wird für alle Knoten der Name der Eingabetabelle als Label verwendet und alle Spalten aus der Eingabetabelle werden als Knoteneigenschaften angezeigt.
Im vorherigen Beispiel:
- Jeder Kontoknoten hat das Label
Account
. - Jeder Kontoknoten hat Properties vom Typ
[id, create_time]
, die aus den Tabellenspalten vom TypAccount
erstellt wurden.
Elementschlüssel
Eine Knotendefinition definiert auch den Elementschlüssel, mit dem ein Graphknoten eindeutig identifiziert wird.
- Standardmäßig ist der Elementschlüssel der Primärschlüssel der Eingabetabelle.
- Elementschlüssel können mit der
KEY
-Klausel explizit definiert werden. - Spalten mit Eindeutigkeitsbeschränkungen
UNIQUE INDEX
können als Elementschlüssel verwendet werden.
Im folgenden Beispiel werden die Knoten Account
und Person
definiert.
- Für den
Account
-Knoten wird standardmäßig der Primärschlüssel der TabelleAccount
als Elementschlüssel verwendet. - Im
Person
-Knoten wird dagegen dieid
mit derKEY
-Klausel explizit als Elementschlüssel angegeben.
CREATE TABLE Person (
id INT64 NOT NULL,
name STRING(MAX),
) PRIMARY KEY (id);
CREATE TABLE Account (
id INT64 NOT NULL,
create_time TIMESTAMP,
) PRIMARY KEY (id);
CREATE PROPERTY GRAPH FinGraph
NODE TABLES (
Person KEY (id),
Account
);
Zuordnung einer Zeile in der Eingabetabelle zu einem Knoten im Graphen
- Jede Zeile mit einem nicht nullwertigen Elementschlüssel wird einem eindeutigen Knoten im Graphen zugeordnet, der durch den Elementschlüssel identifiziert wird.
- Zeilen mit einem Nullelementschlüssel werden ignoriert.
Kanten in einer Property-Graph-Datei definieren
Um eine Kante zu definieren, fügen Sie der Klausel EDGE TABLES eine Kantendefinition hinzu. Die einfachste Form einer Kantendefinition enthält nur den Namen einer Eingabetabelle. Zeilen aus der Eingabetabelle werden den Kanten des Graphen zugeordnet.
Das Standardlabel und die Eigenschaften der Kanten werden auf die gleiche Weise wie Knoten definiert.
Der Elementschlüssel der einzelnen Kanten wird auf dieselbe Weise wie bei Knoten definiert.
Quell- und Zielknotenreferenz
Im folgenden Beispiel erstellen Sie eine Attributgrafik FinGraph
mit den folgenden Elementen:
Person
- undAccount
-KnotenPersonOwnAccount
Edge
CREATE TABLE Person (
id INT64 NOT NULL,
name STRING(MAX),
) PRIMARY KEY (id);
CREATE TABLE Account (
id INT64 NOT NULL,
create_time TIMESTAMP,
) PRIMARY KEY (id);
CREATE TABLE PersonOwnAccount (
id INT64 NOT NULL,
account_id INT64 NOT NULL,
create_time TIMESTAMP,
FOREIGN KEY (account_id) REFERENCES Account (id)
) PRIMARY KEY (id, account_id),
INTERLEAVE IN PARENT Person;
CREATE PROPERTY GRAPH FinGraph
NODE TABLES (
Person,
Account
)
EDGE TABLES (
PersonOwnAccount
SOURCE KEY (id) REFERENCES Person (id)
DESTINATION KEY (account_id) REFERENCES Account (id)
);
In einer Kantendefinition müssen die Quell- und Zielknotenreferenzen mit den Klauseln SOURCE KEY
, DESTINATION KEY
und REFERENCES
definiert werden. Im folgenden Beispiel wird die Kantendefinition von PersonOwnAccount
verwendet, um dieses Konzept zu veranschaulichen:
EDGE TABLES (
PersonOwnAccount
SOURCE KEY (id) REFERENCES Person (id)
DESTINATION KEY (account_id) REFERENCES Account (id)
)
Jede PersonOwnAccount
-Kante verbindet einen Person
-Knoten (Quellknoten) mit einem Account
-Knoten (Zielknoten).
- Der Quellknoten einer Kante ist ein
Person
-Knoten, dessenid
mit derid
der Kante identisch ist. - Der Zielknoten einer Kante ist ein
Account
-Knoten, dessenid
mit der Kanteaccount_id
identisch ist.
Außerdem gilt für die PersonOwnAccount
-Kante Folgendes:
- Der Elementschlüssel ist der Primärschlüssel der Tabelle
PersonOwnAccount
, also(id, account_id)
. - Jede Kante hat dieselben Eigenschaften wie die Spalten der Tabelle
PersonOwnAccount
. - Jede Kante hat das Standardlabel
PersonOwnAccount
.
Zeilen in einer Kanteneingabetabelle Kanten im Graphen zuordnen
- Jede Zeile in der Eingabetabelle für Kanten, deren Elementschlüssel nicht null ist, wird normalerweise einer eindeutigen Kante im Graphen zugeordnet.
- Eine Zeile kann null oder mehr als einer Kante im Graphen entsprechen, z. B. wenn die Referenz des Quellknotens mit null oder mehr Knoten in der Tabelle mit Quellknoten übereinstimmt.
- Die gleiche Eingabetabelle kann in verschiedenen Knoten- oder Kantendefinitionen verwendet werden, um verschiedene Knoten oder Kanten zu erstellen. Weitere Informationen finden Sie unter Knoten- und Kanteneingabetabellen zusammenführen.
Labels und Eigenschaften anpassen
Mit den Klauseln LABEL und PROPERTIES können Sie Labels und Properties anpassen.
Im folgenden Beispiel sind zwei Knoten definiert: Person
und Account
.
- Die
Person
-Knoten stellen dieaddress
-Eigenschaft über das LabelCustomer
bereit. Die Propertyaddress
wird durch den AusdruckCONCAT(city, ", ", country),
definiert, der sich auf die Spaltencity
undcountry
aus der EingabetabellePerson
bezieht. - Für
Account
stellt der KnotenAccount
die Eigenschaftenid
undcreate_time
über das LabelAccount
bereit. Person
undAccount
haben das LabelEntity
mit den Eigenschaften [id, name
].- Bei
Person
stammen die Eigenschaftenid
undname
aus den Spalten der Eingabetabelle. - Bei
Account
bezieht sich die Eigenschaftname
auf die Spaltenick_name
der Eingabetabelle.
- Bei
CREATE TABLE Person (
id INT64 NOT NULL,
name STRING(MAX),
birthday TIMESTAMP,
country STRING(MAX),
city STRING(MAX),
) PRIMARY KEY (id);
CREATE TABLE Account (
id INT64 NOT NULL,
create_time TIMESTAMP,
is_blocked BOOL,
nick_name STRING(MAX),
) PRIMARY KEY (id);
CREATE PROPERTY GRAPH FinGraph
NODE TABLES (
Person KEY (id)
LABEL Customer
PROPERTIES (CONCAT(city, ", ", country) AS address)
LABEL Entity PROPERTIES (id, name),
Account KEY (id)
LABEL Account PROPERTIES (id, create_time)
LABEL Entity PROPERTIES (id, nick_name AS name)
);
Konsistenz von Label und Property
In einem Diagramm werden Labels und Eigenschaften eindeutig durch ihre Namen identifiziert. Labels und Eigenschaften mit demselben Namen können in mehreren Knoten- oder Kantendefinitionen vorkommen. Labels und Properties mit demselben Namen müssen jedoch den folgenden Regeln entsprechen:
- Properties mit demselben Namen müssen denselben Werttyp haben.
- Labels mit demselben Namen müssen dieselbe Liste von Properties enthalten.
Im vorherigen Beispiel ist das Label Entity
sowohl in Person
- als auch in Account
-Knoten definiert. In beiden Definitionen haben sie dieselben Attributnamen [id
, name
] mit denselben Werttypen.
Abhängigkeiten zwischen Diagrammen und anderen Schemaobjekten
Der von CREATE PROPERTY GRAPH
erstellte Graph ist von anderen Schemaobjekten abhängig, z. B. von den Eingabetabellen der Knoten- und Kantendefinitionen und den Tabellenspalten, auf die die Properties verweisen. Wenn eine Schemaänderung eine dieser Abhängigkeiten verletzt, ist die Änderung nicht zulässig.
Mit der folgenden Anweisung wird eine Abhängigkeit von FinGraph
zur Tabelle Account
und zu den Spalten id
und create_time
erstellt.
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Account PROPERTIES (id, create_time)
);
Im Folgenden finden Sie Beispiele für Schemaänderungen, die nicht zulässig sind:
- Löschen Sie die Tabelle
Account
, es sei denn, Sie entfernen zuerst die KnotendefinitionAccount
. Weitere Informationen finden Sie unter Vorhandene Knoten- oder Kantendefinitionen entfernen. - Entfernen Sie die
create_time
-Spalten aus derAccount
-Tabelle, es sei denn, Sie entfernen zuerst dascreate_time
-Attribut aus derAccount
-Knotendefinition. Weitere Informationen finden Sie unter Bestehende Knoten- oder Kantendefinitionen aktualisieren.
Sie können jedoch die folgenden Schemaänderungen vornehmen:
- Ändern Sie das Schema der Tabelle
Account
und der Spaltenid
undcreate_time
, sofern dies durch andere Schemaanforderungen zulässig ist. Weitere Informationen finden Sie unter Schemas aktualisieren.