Información general sobre las consultas de Spanner Graph

En este documento se ofrece una descripción general del uso del lenguaje de consultas de gráficos con Spanner Graph, incluida su sintaxis para la coincidencia de patrones de gráficos, y se muestra cómo ejecutar consultas en tu gráfico. Con Spanner Graph, puedes ejecutar consultas para encontrar patrones, recorrer relaciones y obtener información valiosa a partir de los datos de tu gráfico de propiedades.

En los ejemplos de este documento se usa el esquema de gráfico que se crea en Configurar y consultar Spanner Graph. Este esquema se ilustra en el siguiente diagrama:

Ejemplo de un esquema de Spanner Graph.
Imagen 1: Ejemplo de esquema de Spanner Graph.

Ejecutar una consulta de Spanner Graph

Puedes usar la Google Cloud consola, la CLI de Google Cloud, las bibliotecas de cliente, la API REST o la API RPC para ejecutar una consulta de gráfico de Spanner.

Google Cloud console

En los pasos siguientes se muestra cómo ejecutar una consulta en la consolaGoogle Cloud . En estos pasos se presupone que tienes una instancia llamada test-instance que contiene una base de datos llamada example-db. Para obtener información sobre cómo crear una instancia con una base de datos, consulta Configurar y consultar Spanner Graph.

  1. En la Google Cloud consola, ve a la página Instancias de Spanner.

    Ir a instancias de Spanner

  2. Haz clic en la instancia llamada test-instance.

  3. En Bases de datos, haz clic en la base de datos llamada example-db.

  4. Abre Spanner Studio y, a continuación, haz clic en Nueva pestaña o usa la pestaña del editor.

  5. Introduce una consulta en el editor de consultas.

  6. Haz clic en Ejecutar.

CLI de gcloud

Para enviar consultas con la herramienta de línea de comandos gcloud CLI, haz lo siguiente:

  1. Si aún no está instalado, instala gcloud CLI.

  2. En gcloud CLI, ejecuta el siguiente comando:

    gcloud spanner databases execute-sql

Para obtener más información, consulta la guía de inicio rápido de la CLI de Spanner.

API REST

Para enviar consultas mediante la API REST, utiliza uno de los siguientes comandos:

Para obtener más información, consulta Consultar datos con la API REST y Empezar a usar Spanner con REST.

API de RPC

Para enviar consultas mediante la API RPC, usa uno de los siguientes comandos:

Bibliotecas de cliente

Para obtener más información sobre cómo ejecutar una consulta con una biblioteca de cliente de Spanner, consulta lo siguiente:

Para obtener más información sobre las bibliotecas de cliente de Spanner, consulta la información general sobre las bibliotecas de cliente de Spanner.

Visualizar los resultados de las consultas de Spanner Graph

Puedes ver una representación visual de los resultados de tu consulta de Spanner Graph en Spanner Studio en la consola Google Cloud . Una visualización de consulta te permite ver cómo se conectan los elementos devueltos (nodos y aristas). De esta forma, se pueden identificar patrones, dependencias y anomalías que son difíciles de detectar cuando se ven los resultados en una tabla. Para ver una visualización de una consulta, esta debe devolver nodos completos en formato JSON. De lo contrario, solo podrá ver los resultados de la consulta en formato tabular. Para obtener más información, consulta Usar visualizaciones de consultas de Spanner Graph.

Estructura de las consultas de Spanner Graph

Una consulta de Spanner Graph consta de varios componentes, como el nombre del gráfico de propiedades, los patrones de nodos y aristas, y los cuantificadores. Estos componentes se usan para crear una consulta que encuentre patrones específicos en tu gráfico. Cada componente se describe en la sección Búsqueda de patrones en gráficos de este documento.

La consulta de la figura 2 muestra la estructura básica de una consulta de Spanner Graph. La consulta empieza especificando el gráfico de destino, FinGraph, mediante la cláusula GRAPH. La cláusula MATCH define el patrón que se va a buscar. En este caso, se trata de un nodo Person conectado a un nodo Account a través de una arista Owns. La cláusula RETURN especifica qué propiedades de los nodos coincidentes se deben devolver.

Ejemplo de estructura de consulta de Spanner Graph.
Imagen 2.: Ejemplo de la estructura de una consulta de Spanner Graph.

Coincidencia de patrones de grafos

La coincidencia de patrones de gráficos busca patrones específicos en tu gráfico. Los patrones más básicos son los patrones de elementos, como los patrones de nodos que coinciden con nodos y los patrones de aristas que coinciden con aristas.

Patrones de nodos

Un patrón de nodo coincide con los nodos de tu gráfico. Este patrón contiene paréntesis coincidentes, que pueden incluir de forma opcional una variable de patrón de gráfico, una expresión de etiqueta y filtros de propiedades.

Buscar todos los nodos

La siguiente consulta devuelve todos los nodos del gráfico. La variable n, una variable de patrón de gráfico, se vincula a los nodos coincidentes. En este caso, el patrón de nodo coincide con todos los nodos del gráfico.

GRAPH FinGraph
MATCH (n)
RETURN LABELS(n) AS label, n.id;

Esta consulta devuelve label y id:

etiqueta id
Cuenta 7
Cuenta 16
Cuenta 20
Persona 1
Persona 2
Persona 3

Buscar todos los nodos con una etiqueta específica

La siguiente consulta coincide con todos los nodos del gráfico que tienen la etiqueta Person . La consulta devuelve las propiedades label, id y name de los nodos coincidentes.

GRAPH FinGraph
MATCH (p:Person)
RETURN LABELS(p) AS label, p.id, p.name;

Esta consulta devuelve las siguientes propiedades de los nodos coincidentes:

etiqueta id name
Persona 1 Alex
Persona 2 Dana
Persona 3 Lee

Buscar todos los nodos que coincidan con una expresión de etiqueta

Puedes crear una expresión de etiqueta con uno o varios operadores lógicos. Por ejemplo, la siguiente consulta coincide con todos los nodos del gráfico que tienen la etiqueta Person o Account. La variable de patrón de gráfico n expone todas las propiedades de los nodos con la etiqueta Person o Account.

GRAPH FinGraph
MATCH (n:Person|Account)
RETURN LABELS(n) AS label, n.id, n.birthday, n.create_time;

En los siguientes resultados de esta consulta:

  • Todos los nodos tienen la propiedad id.
  • Los nodos que coinciden con la etiqueta Account tienen la propiedad create_time, pero no la propiedad birthday. La propiedad birthday es NULL para estos nodos.
  • Los nodos que coinciden con la etiqueta Person tienen la propiedad birthday, pero no la propiedad create_time. La propiedad create_time es NULL para estos nodos.
etiqueta id cumpleaños create_time
Cuenta 7 NULL 2020-01-10T14:22:20.222Z
Cuenta 16 NULL 2020-01-28T01:55:09.206Z
Cuenta 20 NULL 2020-02-18T13:44:20.655Z
Persona 1 1991-12-21T08:00:00Z NULL
Persona 2 1980-10-31T08:00:00Z NULL
Persona 3 1986-12-07T08:00:00Z NULL

Buscar todos los nodos que coincidan con la expresión de etiqueta y el filtro de propiedad

Esta consulta coincide con todos los nodos del gráfico que tienen la etiqueta Person y en los que la propiedad id es igual a 1.

GRAPH FinGraph
MATCH (p:Person {id: 1})
RETURN LABELS(p) AS label, p.id, p.name, p.birthday;

Estos son los resultados de la consulta:

etiqueta id name cumpleaños
Persona 1 Alex 1991-12-21T08:00:00Z

Puedes usar la cláusula WHERE para crear condiciones de filtrado más complejas en etiquetas y propiedades.

La siguiente consulta usa la cláusula WHERE para formar una condición de filtrado más compleja en las propiedades. Coincide con todos los nodos del gráfico que tienen la etiqueta Person y la propiedad birthday es anterior a 1990-01-10.

GRAPH FinGraph
MATCH (p:Person WHERE p.birthday < '1990-01-10')
RETURN LABELS(p) AS label, p.name, p.birthday;

Estos son los resultados de la consulta:

etiqueta name cumpleaños
Persona Dana 1980-10-31T08:00:00Z
Persona Lee 1986-12-07T08:00:00Z

Patrones de borde

Un patrón de arista coincide con las aristas o las relaciones entre nodos. Los patrones de borde se incluyen entre corchetes ([]) y contienen símbolos como -, -> o <- para indicar direcciones. Un patrón de arista puede incluir opcionalmente una variable de patrón de gráfico para vincularla a las aristas coincidentes.

Buscar todos los bordes con etiquetas coincidentes

Esta consulta devuelve todas las aristas del gráfico con la etiqueta Transfers. La consulta vincula la variable de patrón de gráfico e a las aristas coincidentes.

GRAPH FinGraph
MATCH -[e:Transfers]->
RETURN e.Id as src_account, e.order_number

Estos son los resultados de la consulta:

src_account order_number
7 304330008004315
7 304120005529714
16 103650009791820
20 304120005529714
20 302290001255747

Busca todos los bordes que coincidan con la expresión de la etiqueta y el filtro de propiedades.

El patrón de arista de esta consulta usa una expresión de etiqueta y un filtro de propiedad para encontrar todas las aristas etiquetadas con Transfers que coincidan con un order_number especificado.

GRAPH FinGraph
MATCH -[e:Transfers {order_number: "304120005529714"}]->
RETURN e.Id AS src_account, e.order_number

Estos son los resultados de la consulta:

src_account order_number
7 304120005529714
20 304120005529714

Buscar todos los bordes con cualquier patrón de borde de dirección

Puedes usar el patrón de borde any direction (-[]-) en una consulta para buscar bordes en cualquier dirección. La siguiente consulta busca todas las transferencias con una cuenta bloqueada.

GRAPH FinGraph
MATCH (account:Account)-[transfer:Transfers]-(:Account {is_blocked:true})
RETURN transfer.order_number, transfer.amount;

Estos son los resultados de la consulta:

order_number amount
304330008004315 300
304120005529714 100
103650009791820 300
302290001255747 200

Patrones de ruta

Un patrón de ruta se crea a partir de patrones de nodos y aristas alternos.

Buscar todas las rutas desde un nodo específico mediante un patrón de ruta

La siguiente consulta busca todas las transferencias a una cuenta iniciadas desde una cuenta propiedad de Person con id igual a 2.

Cada resultado coincidente representa una ruta de Person {id: 2} a través de un Account conectado mediante la arista Owns a otro Account mediante la arista Transfers.

GRAPH FinGraph
MATCH
  (p:Person {id: 2})-[:Owns]->(account:Account)-[t:Transfers]->
  (to_account:Account)
RETURN
  p.id AS sender_id, account.id AS from_id, to_account.id AS to_id;

Estos son los resultados de la consulta:

sender_id from_id to_id
2 20 7
2 20 16

Patrones de ruta cuantificados

Un patrón cuantificado repite un patrón dentro de un intervalo especificado.

Coincidir con un patrón de arista cuantificado

Para encontrar rutas de longitud variable, puedes aplicar un cuantificador a un patrón de arista. En la siguiente consulta se muestra cómo encontrar cuentas de destino que estén a entre una y tres transferencias de un Account de origen con un id de 7.

La consulta aplica el cuantificador {1, 3} al patrón de arista -[e:Transfers]->. De esta forma, la consulta buscará rutas que repitan el patrón de arista Transfers una, dos o tres veces. La cláusula WHERE se usa para excluir la cuenta de origen de los resultados. La función ARRAY_LENGTH se usa para acceder a la group variable e. Para obtener más información, consulta Variable de grupo de acceso.

GRAPH FinGraph
MATCH (src:Account {id: 7})-[e:Transfers]->{1, 3}(dst:Account)
WHERE src != dst
RETURN src.id AS src_account_id, ARRAY_LENGTH(e) AS path_length, dst.id AS dst_account_id;

Estos son los resultados de la consulta:

src_account_id path_length dst_account_id
7 1 16
7 1 16
7 1 16
7 3 16
7 3 16
7 2 20
7 2 20

Algunas filas de los resultados se repiten. Esto se debe a que pueden existir varias rutas que coincidan con el patrón entre los mismos nodos de origen y destino, y la consulta devuelve todas ellas.

Coincidencia con un patrón de ruta cuantificado

La siguiente consulta busca rutas entre nodos Account con entre uno y dos bordes Transfers a través de cuentas intermedias bloqueadas.

El patrón de ruta entre paréntesis se cuantifica y su cláusula WHERE especifica las condiciones del patrón repetido.

GRAPH FinGraph
MATCH
  (src:Account)
  ((a:Account)-[:Transfers]->(b:Account {is_blocked:true}) WHERE a != b){1,2}
    -[:Transfers]->(dst:Account)
RETURN src.id AS src_account_id, dst.id AS dst_account_id;

Estos son los resultados de la consulta:

src_account_id dst_account_id
7 20
7 20
20 20

Variables de grupo

Una variable de patrón de gráfico declarada en un patrón cuantificado se convierte en una variable de grupo cuando se accede a ella fuera de ese patrón. A continuación, se vincula a una matriz de elementos de gráfico coincidentes.

Puedes acceder a una variable de grupo como una matriz. Sus elementos de gráfico se conservan en el orden en que aparecen en las rutas coincidentes. Puedes agregar una variable de grupo mediante la agregación horizontal.

Variable de grupo de acceso

En el ejemplo siguiente, se accede a la variable e de la siguiente manera:

  • Una variable de patrón de gráfico enlazada a un solo borde en la cláusula WHERE e.amount > 100 cuando está dentro del patrón cuantificado.
  • Una variable de grupo vinculada a una matriz de elementos de borde en ARRAY_LENGTH(e) en la instrucción RETURN cuando está fuera del patrón cuantificado.
  • Variable de grupo vinculada a una matriz de elementos de borde, que se agrega mediante SUM(e.amount) fuera del patrón cuantificado. Este es un ejemplo de agregación horizontal.
GRAPH FinGraph
MATCH
  (src:Account {id: 7})-[e:Transfers WHERE e.amount > 100]->{0,2}
  (dst:Account)
WHERE src.id != dst.id
LET total_amount = SUM(e.amount)
RETURN
  src.id AS src_account_id, ARRAY_LENGTH(e) AS path_length,
  total_amount, dst.id AS dst_account_id;

Estos son los resultados de la consulta:

src_account_id path_length total_amount dst_account_id
7 1 300 16
7 2 600 20

Prefijos de búsqueda de rutas

Para limitar las rutas coincidentes en grupos que comparten nodos de origen y de destino, puedes usar el prefijo de búsqueda de rutas ANY o ANY SHORTEST. Solo puedes aplicar estos prefijos antes de un patrón de ruta completo y no puedes aplicarlos dentro de paréntesis.

Buscar coincidencias con ANY

La siguiente consulta busca todas las cuentas únicas a las que se puede acceder que estén a uno o dos Transfers de un nodo Account determinado.

El prefijo de búsqueda de ruta ANY asegura que la consulta devuelva solo una ruta entre un par único de nodos src y dst Account. En el siguiente ejemplo, aunque puedes acceder al nodo Account con {id: 16} a través de dos rutas diferentes desde el nodo de origen Account, la consulta solo devuelve una ruta.

GRAPH FinGraph
MATCH ANY (src:Account {id: 7})-[e:Transfers]->{1,2}(dst:Account)
LET ids_in_path = ARRAY_CONCAT(ARRAY_AGG(e.Id), [dst.Id])
RETURN src.id AS src_account_id, dst.id AS dst_account_id, ids_in_path;

Estos son los resultados de la consulta:

src_account_id dst_account_id ids_in_path
7 16 7,16
7 20 7, 16 y 20

Patrones de gráficos

Un patrón de grafo consta de uno o varios patrones de ruta separados por una coma (,). Los patrones de grafo pueden contener una cláusula WHERE, que te permite acceder a todas las variables de patrón de grafo de los patrones de ruta para formar condiciones de filtrado. Cada patrón de ruta genera una colección de rutas.

Buscar coincidencias con un patrón de gráfico

La siguiente consulta identifica las cuentas intermediarias y sus propietarios implicados en transacciones con importes superiores a 200, a través de las cuales se transfieren fondos de una cuenta de origen a una cuenta bloqueada.

Los siguientes patrones de ruta forman el patrón de gráfico:

  • El primer patrón busca rutas en las que la transferencia se produce de una cuenta a una cuenta bloqueada mediante una cuenta intermedia.
  • El segundo patrón busca rutas desde una cuenta hasta su propietario.

La variable interm actúa como un enlace común entre los dos patrones de ruta, por lo que interm debe hacer referencia al mismo nodo de elemento en ambos patrones de ruta. De esta forma, se crea una operación de combinación equitativa basada en la variable interm.

GRAPH FinGraph
MATCH
  (src:Account)-[t1:Transfers]->(interm:Account)-[t2:Transfers]->(dst:Account),
  (interm)<-[:Owns]-(p:Person)
WHERE dst.is_blocked = TRUE AND t1.amount > 200 AND t2.amount > 200
RETURN
  src.id AS src_account_id, dst.id AS dst_account_id,
  interm.id AS interm_account_id, p.id AS owner_id;

Estos son los resultados de la consulta:

src_account_id dst_account_id interm_account_id owner_id
20 16 7 1

Declaraciones de consulta lineales

Puedes encadenar varias instrucciones de gráfico para formar una instrucción de consulta lineal. Las instrucciones se ejecutan en el mismo orden en el que aparecen en la consulta.

  • Cada instrucción toma la salida de la instrucción anterior como entrada. La entrada está vacía en la primera instrucción.

  • La salida de la última instrucción es el resultado final.

Por ejemplo, puedes usar instrucciones de consulta lineales para encontrar la transferencia máxima a una cuenta bloqueada. La siguiente consulta busca la cuenta y su propietario con la transferencia saliente más grande a una cuenta bloqueada.

GRAPH FinGraph
MATCH (src_account:Account)-[transfer:Transfers]->(dst_account:Account {is_blocked:true})
ORDER BY transfer.amount DESC
LIMIT 1
MATCH (src_account:Account)<-[owns:Owns]-(owner:Person)
RETURN src_account.id AS account_id, owner.name AS owner_name;

En la siguiente tabla se ilustra este proceso mostrando los resultados intermedios que se transfieren entre cada instrucción. Para que sea más breve, solo se muestran algunas propiedades.

Declaraciones Resultado intermedio (abreviado)
MATCH
  (src_account:Account)
    -[transfer:Transfers]->
  (dst_account:Account {is_blocked:true})
src_account transfer dst_account
{id: 7} {amount: 300.0} {id: 16, is_blocked: true}
{id: 7} {amount: 100.0} {id: 16, is_blocked: true}
{id: 20} {amount: 200.0} {id: 16, is_blocked: true}

ORDER BY transfer.amount DESC
src_account transfer dst_account
{id: 7} {amount: 300.0} {id: 16, is_blocked: true}
{id: 20} {amount: 200.0} {id: 16, is_blocked: true}
{id: 7} {amount: 100.0} {id: 16, is_blocked: true}

LIMIT 1
src_account transfer dst_account
{id: 7} {amount: 300.0} {id: 16, is_blocked: true}

MATCH
  (src_account:Account)
    <-[owns:Owns]-
  (owner:Person)
src_account transfer dst_account es propietario de propietario
{id: 7} {amount: 300.0} {id: 16, is_blocked: true} {person_id: 1, account_id: 7} {id: 1, name: Alex}
RETURN
  src_account.id AS account_id,
  owner.name AS owner_name
        
account_id owner_name
7 Alex

Estos son los resultados de la consulta:

account_id owner_name
7 Alex

Instrucción de retorno

La instrucción RETURN especifica qué se debe devolver de los patrones coincidentes. Puede acceder a variables de patrones de gráficos e incluir expresiones y otras cláusulas, como ORDER BY y GROUP BY.

Spanner Graph no admite la devolución de elementos de gráficos como resultados de consultas. Para devolver todo el elemento del gráfico, usa la función TO_JSON o la función SAFE_TO_JSON. De estas dos funciones, te recomendamos que uses SAFE_TO_JSON.

Devolver elementos de gráfico como JSON

GRAPH FinGraph
MATCH (n:Account {id: 7})
-- Returning a graph element in the final results is NOT allowed. Instead, use
-- the TO_JSON function or explicitly return the graph element's properties.
RETURN TO_JSON(n) AS n;
GRAPH FinGraph
MATCH (n:Account {id: 7})
-- Certain fields in the graph elements, such as TOKENLIST, can't be returned
-- in the TO_JSON function. In those cases, use the SAFE_TO_JSON function instead.
RETURN SAFE_TO_JSON(n) AS n;

Estos son los resultados de la consulta:

n
{"identifier":"mUZpbkdyYXBoLkFjY291bnQAeJEO","kind":"node","labels":["Account"],"properties":{"create_time":"2020-01-10T14:22:20.222Z","id":7,"is_blocked":false,"nick_name":"Vacation Fund"}}

Escribir consultas más largas con la palabra clave NEXT

Puedes encadenar varias instrucciones de consulta lineal de gráficos mediante la palabra clave NEXT. La primera instrucción recibe una entrada vacía y la salida de cada instrucción posterior se convierte en la entrada de la siguiente.

En el siguiente ejemplo se busca el propietario de la cuenta con más transferencias entrantes encadenando varias instrucciones lineales de gráficos. Puede usar la misma variable, por ejemplo, account, para hacer referencia al mismo elemento del gráfico en varias instrucciones lineales.

GRAPH FinGraph
MATCH (:Account)-[:Transfers]->(account:Account)
RETURN account, COUNT(*) AS num_incoming_transfers
GROUP BY account
ORDER BY num_incoming_transfers DESC
LIMIT 1

NEXT

MATCH (account:Account)<-[:Owns]-(owner:Person)
RETURN account.id AS account_id, owner.name AS owner_name, num_incoming_transfers;

Estos son los resultados de la consulta:

account_id owner_name num_incoming_transfers
16 Lee 3

Funciones y expresiones

Puedes usar todas las funciones de GoogleSQL (tanto las agregadas como las escalares), los operadores y las expresiones condicionales en las consultas de gráficos de Spanner. Spanner Graph también admite funciones y operadores específicos de gráficos.

Funciones y operadores integrados

En GQL se usan las siguientes funciones y operadores:

  • PROPERTY_EXISTS(n, birthday): devuelve si n tiene la propiedad birthday.
  • LABELS(n): devuelve las etiquetas de n tal como se definen en el esquema del gráfico.
  • PROPERTY_NAMES(n): devuelve los nombres de las propiedades de n.
  • TO_JSON(n): devuelve n en formato JSON. Para obtener más información, consulta la función TO_JSON.

el predicado PROPERTY_EXISTS, la función LABELS y la función TO_JSON, así como otras funciones integradas como ARRAY_AGG y CONCAT.

GRAPH FinGraph
MATCH (person:Person)-[:Owns]->(account:Account)
RETURN person, ARRAY_AGG(account.nick_name) AS accounts
GROUP BY person

NEXT

RETURN
  LABELS(person) AS labels,
  TO_JSON(person) AS person,
  accounts,
  CONCAT(person.city, ", ", person.country) AS location,
  PROPERTY_EXISTS(person, is_blocked) AS is_blocked_property_exists,
  PROPERTY_EXISTS(person, name) AS name_property_exists
LIMIT 1;

Estos son los resultados de la consulta:

is_blocked_property_exists name_property_exists etiquetas cuentas ubicación persona
false true Person ["Vacation Fund"] Adelaide, Australia {"identifier":"mUZpbkdyYXBoLlBlcnNvbgB4kQI=","kind":"node","labels":["Person"],"properties":{"birthday":"1991-12-21T08:00:00Z","city":"Adelaide","country":"Australia","id":1,"name":"Alex"}}

Subconsultas

Una subconsulta es una consulta anidada en otra consulta. A continuación, se enumeran las reglas de las subconsultas de Spanner Graph:

  • Una subconsulta se incluye entre un par de llaves {}.
  • Una subconsulta puede empezar con la cláusula GRAPH inicial para especificar el gráfico en el ámbito. El gráfico especificado no tiene por qué ser el mismo que el que se usa en la consulta externa.
  • Cuando se omite la cláusula GRAPH en la subconsulta, ocurre lo siguiente:
    • El gráfico del ámbito se deduce del contexto de consulta externo más cercano.
    • La subconsulta debe empezar por una instrucción de coincidencia de patrón de grafo con MATCH.
  • Una variable de patrón de gráfico declarada fuera del ámbito de la subconsulta no se puede volver a declarar dentro de la subconsulta, pero se puede hacer referencia a ella en expresiones o funciones dentro de la subconsulta.

Usar una subconsulta para obtener el número total de transferencias de cada cuenta

La siguiente consulta muestra el uso de la subconsulta VALUE. La subconsulta se incluye entre llaves {} precedidas por la palabra clave VALUE. La consulta devuelve el número total de transferencias iniciadas desde una cuenta.

GRAPH FinGraph
MATCH (p:Person)-[:Owns]->(account:Account)
RETURN p.name, account.id AS account_id, VALUE {
  MATCH (a:Account)-[transfer:Transfers]->(:Account)
  WHERE a = account
  RETURN COUNT(transfer) AS num_transfers
} AS num_transfers;

Estos son los resultados de la consulta:

name account_id num_transfers
Alex 7 2
Dana 20 2
Lee 16 1

Para ver una lista de las expresiones de subconsulta admitidas, consulta Subconsultas de gráficos de Spanner.

Usar una subconsulta para buscar las cuentas de cada persona

En la siguiente consulta se usa la instrucción CALL con una subconsulta insertada. La instrucción MATCH (p:Person) crea una tabla con una sola columna llamada p. Cada fila de esta tabla contiene un nodo Person. La instrucción CALL (p) ejecuta la subconsulta incluida en cada fila de esta tabla de trabajo. La subconsulta busca las cuentas propiedad de cada persona que coincida p. Las cuentas de la misma persona se ordenan por ID de cuenta.

En el ejemplo se declara la variable de nodo p del ámbito externo de la cláusula MATCH (p:Person). La instrucción CALL (p) hace referencia a esta variable. Esta declaración te permite volver a declarar o declarar varias veces la variable de nodo en un patrón de ruta de la subconsulta. De esta forma, las variables de nodo p interior y exterior se vinculan al mismo nodo Person del gráfico. Si la instrucción CALL no declara la variable de nodo p, la subconsulta trata la variable p redeclarada como una variable nueva. Esta nueva variable es independiente de la variable de ámbito externo y la subconsulta no la declara varias veces porque devuelve resultados diferentes. Para obtener más información, consulta la CALL declaración.

GRAPH FinGraph
MATCH (p:Person)
CALL (p) {
  MATCH (p)-[:Owns]->(a:Account)
  RETURN a.Id AS account_Id
  ORDER BY account_Id
}
RETURN p.name AS person_name, account_Id
ORDER BY person_name, account_Id;

Resultado

person_name account_Id
Alex 7
Dana 20
Lee 16

Los parámetros de consulta

Puedes consultar Spanner Graph con parámetros. Para obtener más información, consulta la sintaxis y descubre cómo consultar datos con parámetros en las bibliotecas de cliente de Spanner.

La siguiente consulta muestra el uso de los parámetros de consulta.

GRAPH FinGraph
MATCH (person:Person {id: @id})
RETURN person.name;

Consultar gráficos y tablas a la vez

Puedes usar consultas de gráficos junto con SQL para acceder a la información de tus gráficos y tablas en una sola instrucción.

El operador GRAPH_TABLE toma una consulta de gráfico lineal y devuelve su resultado en forma de tabla, que se puede integrar en una consulta de SQL. Esta interoperabilidad te permite enriquecer los resultados de las consultas de gráficos con contenido que no sea de gráficos y viceversa.

Por ejemplo, puedes crear una tabla CreditReports e insertar algunos informes de crédito, como se muestra en el siguiente ejemplo:

CREATE TABLE CreditReports (
  person_id     INT64 NOT NULL,
  create_time   TIMESTAMP NOT NULL,
  score         INT64 NOT NULL,
) PRIMARY KEY (person_id, create_time);
INSERT INTO CreditReports (person_id, create_time, score)
VALUES
  (1,"2020-01-10 06:22:20.222", 700),
  (2,"2020-02-10 06:22:20.222", 800),
  (3,"2020-03-10 06:22:20.222", 750);

A continuación, puede identificar a personas concretas mediante la coincidencia de patrones de gráficos en GRAPH_TABLE y combinar los resultados de la consulta de gráficos con la tabla CreditReports para obtener las puntuaciones de crédito.

SELECT
  gt.person.id,
  credit.score AS latest_credit_score
FROM GRAPH_TABLE(
  FinGraph
  MATCH (person:Person)-[:Owns]->(:Account)-[:Transfers]->(account:Account {is_blocked:true})
  RETURN DISTINCT person
) AS gt
JOIN CreditReports AS credit
  ON gt.person.id = credit.person_id
ORDER BY credit.create_time;

Estos son los resultados de la consulta:

person_id latest_credit_score
1 700
2 800

Siguientes pasos

Consulta las prácticas recomendadas para optimizar las consultas.