En este documento, se describe el esquema de Spanner Graph y se proporcionan ejemplos para ilustrar los conceptos clave. Para obtener más información sobre Spanner Graph, consulta la descripción general de Spanner Graph.
Modelo de datos del gráfico de propiedades
Un gráfico de propiedades te permite modelar datos conectados. Representa la información como una red de nodos y aristas. Los nodos simbolizan entidades en tu panorama de datos, como clientes, productos o ubicaciones. Las aristas muestran las conexiones entre esos nodos, capturando relaciones como comprado, sigue o ubicado en.
Tanto los nodos como los bordes pueden incluir la siguiente información:
- Etiquetas, que clasifican los nodos y los bordes en conjuntos, por ejemplo, Ciudad.
- Propiedades, que son pares clave-valor, por ejemplo, población.
En el ejemplo de la Figura 1, se muestra cómo podrías diseñar un gráfico para modelar actividades financieras. Este gráfico incluye los siguientes tipos de entidades modeladas como nodos:
- Persona: Representa a una persona involucrada en transacciones financieras.
- Cuenta: Representa una cuenta bancaria que se usa para realizar transacciones.
Estas entidades están conectadas por diferentes tipos de relaciones, que se representan con los siguientes bordes dirigidos:
- Es propietario: Una persona es propietaria de una o más cuentas.
- Transferencias: Se transfiere dinero de una cuenta a otra.
Cada arista dirigida indica una relación unidireccional que fluye de un nodo fuente a un nodo de destino. Por ejemplo, un borde Transfers
conecta un Account
de origen a un Account
de destino, lo que indica el flujo de dinero.
Figura 1. Ejemplo de grafo con varios nodos y aristas dirigidas.
Los nodos y las aristas pueden contener información adicional en las propiedades. Cada propiedad tiene un nombre y un valor.
- Los nodos Person tienen las siguientes propiedades:
name
(STRING
)id
(INT64
)
- Los bordes Transferencias tienen la siguiente propiedad:
amount
(FLOAT64)
Bordes dirigidos y no dirigidos
El gráfico de ejemplo usa aristas dirigidas, que indican una dirección específica en la relación entre entidades. Sin embargo, algunas relaciones, como la relación de amigo en una red social, no están dirigidas y representan una conexión recíproca sin un origen o un extremo definidos. En este caso, puedes simular aristas no dirigidas como dos aristas dirigidas, una en cada dirección.
Diseño de esquemas de Spanner Graph
El gráfico de Spanner te permite crear un gráfico a partir de tablas con la instrucción CREATE PROPERTY GRAPH. Las tablas que se usan para crear gráficos se denominan tablas de entrada. Este enfoque se basa en SQL/PGQ (consultas de grafo de propiedades), que forma parte de los estándares SQL:2023.
Cómo definir un nodo en un grafo de propiedades
Para definir un nodo, agrega una definición de nodo en la cláusula NODE TABLES. La forma más simple de definición de nodos solo contiene un nombre de tabla de entrada. Las filas de la tabla de entrada se asignan a los nodos del grafo.
En el siguiente ejemplo, se usa la cláusula NODE TABLES para definir el nodo Account
en el gráfico de propiedades FinGraph
. La definición del nodo contiene
la tabla de entrada 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
);
Etiqueta y propiedades predeterminadas
De forma predeterminada, todos los nodos usan el nombre de la tabla de entrada como etiqueta, y todas las columnas de la tabla de entrada se exponen como propiedades de nodo.
En el ejemplo anterior,
- Cada nodo de cuenta tiene la etiqueta
Account
. - Cada nodo de cuenta tiene propiedades
[id, create_time]
creadas a partir de las columnas de la tablaAccount
.
Clave del elemento
Una definición de nodo también define la clave de elemento, que identifica de forma única un nodo del gráfico.
- De forma predeterminada, la clave del elemento es la clave primaria de la tabla de entrada.
- Las claves de elementos se pueden definir de forma explícita con la cláusula
KEY
. - Las columnas con restricciones de unicidad
UNIQUE INDEX
se pueden usar como claves de elementos.
En el siguiente ejemplo, se definen los nodos Account
y Person
.
- El nodo
Account
usa la clave primaria de la tablaAccount
como su clave de elemento de forma predeterminada. - El nodo
Person
, por otro lado, especifica de manera explícitaid
como la clave del elemento con la cláusulaKEY
.
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
);
Asignación de una fila de la tabla de entrada a un nodo del grafo
- Cada fila con una clave de elemento no nula se asigna a un nodo único en el graph, identificado por la clave de elemento.
- Se ignoran las filas con una clave de elemento nula.
Cómo definir un borde en un grafo de propiedades
Para definir un borde, agrega una definición de borde a la cláusula EDGE TABLES. La forma más simple de definición de borde solo contiene un nombre de tabla de entrada. Las filas de la tabla de entrada se asignan a los bordes del grafo.
La etiqueta y las propiedades predeterminadas de los bordes se definen de la misma manera que los nodos.
La clave de elemento de cada borde se define de la misma manera que los nodos.
Referencia de nodos de origen y destino
En el siguiente ejemplo, se crea un gráfico de propiedades FinGraph
con lo siguiente:
- Nodos
Person
yAccount
- Borde de
PersonOwnAccount
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)
);
Una definición de borde debe definir la referencia del nodo de origen y destino con las cláusulas SOURCE KEY
, DESTINATION KEY
y REFERENCES
. En el siguiente ejemplo, se usa la definición de borde de PersonOwnAccount
para ilustrar este concepto:
EDGE TABLES (
PersonOwnAccount
SOURCE KEY (id) REFERENCES Person (id)
DESTINATION KEY (account_id) REFERENCES Account (id)
)
Cada borde PersonOwnAccount
conecta un Person
(fuente) a un nodo Account
(destino).
- El nodo de origen de un borde es un nodo
Person
cuyoid
es el mismo que elid
del borde. - El nodo de destino de un borde es un nodo
Account
cuyoid
es el mismo que el bordeaccount_id
.
Además, se cumple lo siguiente para el borde PersonOwnAccount
:
- La clave de elemento es la clave primaria de la tabla
PersonOwnAccount
, es decir,(id, account_id)
. - Cada arista tiene el mismo conjunto de propiedades que las columnas de la tabla
PersonOwnAccount
. - Cada borde tiene la etiqueta
PersonOwnAccount
predeterminada.
Cómo asignar una fila de una tabla de entrada de aristas a aristas en el grafo
- Por lo general, cada fila de la tabla de entrada de aristas, cuya clave de elemento no es nula, se asigna a una arista única en tu grafo.
- Una fila puede corresponder a cero o más aristas en el gráfico, por ejemplo, cuando la referencia del nodo de origen coincide con cero o más nodos en la tabla de nodos de origen.
- La misma tabla de entrada se puede usar en diferentes definiciones de nodos o aristas para crear diferentes conjuntos de nodos o aristas. Para obtener más información, consulta Cómo combinar tablas de entrada de nodos y bordes.
Personaliza las etiquetas y las propiedades
Puedes usar las cláusulas LABEL y PROPERTIES para personalizar etiquetas y propiedades.
En el siguiente ejemplo, se definen dos nodos, Person
y
Account
.
- Los nodos
Person
exponen la propiedadaddress
a través de la etiquetaCustomer
. La propiedadaddress
se define con la expresiónCONCAT(city, ", ", country),
, que hace referencia a las columnascity
ycountry
de la tabla de entradaPerson
. - Para
Account
, el nodoAccount
expone las propiedadesid
ycreate_time
a través de la etiquetaAccount
. Person
yAccount
tienen la etiquetaEntity
con propiedades [id, name
].- En el caso de
Person
, las propiedadesid
yname
provienen de las columnas de la tabla de entrada. - Para
Account
, la propiedadname
hace referencia a la columnanick_name
de la tabla de entrada.
- En el caso de
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)
);
Coherencia de etiquetas y propiedades
En un gráfico, las etiquetas y las propiedades se identifican de forma única por sus nombres. Las etiquetas y las propiedades con el mismo nombre pueden aparecer en varias definiciones de nodos o bordes. Sin embargo, las etiquetas y las propiedades con el mismo nombre deben cumplir con las siguientes reglas:
- Las propiedades con el mismo nombre deben tener el mismo tipo de valor.
- Las etiquetas con el mismo nombre deben exponer la misma lista de propiedades.
En el ejemplo anterior, la etiqueta Entity
se define en los nodos Person
y Account
. En ambas definiciones, tienen el mismo conjunto de nombres de propiedades [id
, name
] con los mismos tipos de valores.
Dependencias entre gráficos y otros objetos de esquema
El grafo creado por CREATE PROPERTY GRAPH
tiene una dependencia de otros objetos de esquema, como las tablas de entrada de las definiciones de nodos y vínculos, y las columnas de tablas a las que hacen referencia las propiedades. Si un cambio de esquema rompe una de estas dependencias, el cambio no se permite.
La siguiente sentencia crea una dependencia de FinGraph
a la tabla Account
y a las columnas id
y create_time
.
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Account PROPERTIES (id, create_time)
);
Los siguientes son ejemplos de cambios de esquema que no puedes realizar:
- Suelta la tabla
Account
, a menos que primero quites la definición del nodoAccount
. Para obtener más información, consulta Cómo quitar nodos existentes o definiciones de aristas. - Quita las columnas
create_time
de la tablaAccount
, a menos que primero quites la propiedadcreate_time
de la definición del nodoAccount
. Para obtener más información, consulta Cómo actualizar definiciones de nodos o bordes existentes.
Sin embargo, puedes realizar los siguientes cambios en el esquema:
- Modifica la tabla
Account
y el esquema de las columnasid
ycreate_time
, siempre que otros requisitos del esquema lo permitan. Para obtener más información, consulta Cómo realizar actualizaciones de esquemas.