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:
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.
En la Google Cloud consola, ve a la página Instancias de Spanner.
Haz clic en la instancia llamada
test-instance.En Bases de datos, haz clic en la base de datos llamada
example-db.Abre Spanner Studio y, a continuación, haz clic en Nueva pestaña o usa la pestaña del editor.
Introduce una consulta en el editor de consultas.
Haz clic en Ejecutar.
CLI de gcloud
Para enviar consultas con la herramienta de línea de comandos gcloud CLI, haz lo siguiente:
Si aún no está instalado, instala gcloud CLI.
En gcloud CLI, ejecuta el siguiente comando:
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:
- Consultar con la biblioteca de cliente de C++ de Spanner
- Consultar con la biblioteca de cliente de C# de Spanner
- Consultar con la biblioteca de cliente de Go de Spanner
- Consultar con la biblioteca de cliente de Java de Spanner
- Consultar con la biblioteca de cliente de Node.js de Spanner
- Consultar con la biblioteca de cliente de PHP de Spanner
- Consultar con la biblioteca de cliente de Python de Spanner
- Consultar con la biblioteca de cliente de Ruby de Spanner
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.
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
Accounttienen la propiedadcreate_time, pero no la propiedadbirthday. La propiedadbirthdayesNULLpara estos nodos. - Los nodos que coinciden con la etiqueta
Persontienen la propiedadbirthday, pero no la propiedadcreate_time. La propiedadcreate_timeesNULLpara 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
WHEREe.amount > 100cuando 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ónRETURNcuando 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})
|
|
||||||||||||
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
|
|
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 sintiene la propiedadbirthday.LABELS(n): devuelve las etiquetas dental como se definen en el esquema del gráfico.PROPERTY_NAMES(n): devuelve los nombres de las propiedades den.TO_JSON(n): devuelvenen formato JSON. Para obtener más información, consulta la funciónTO_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
GRAPHinicial 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
GRAPHen 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.