En este documento, se proporciona una descripción general del lenguaje de consultas de grafos con Spanner Graph, incluida su sintaxis para la correlación de patrones de grafos, y se muestra cómo ejecutar consultas en tu grafo. Con Spanner Graph, puedes ejecutar consultas para encontrar patrones, analizar relaciones y obtener estadísticas a partir de los datos de tu grafo de propiedades.
En los ejemplos de este documento, se usa el esquema de gráfico que creaste en Configurar y consultar Spanner Graph. Este esquema se ilustra en el siguiente diagrama:
Ejecuta una consulta de Spanner Graph
Puedes usar la consola Google Cloud , Google Cloud CLI, las bibliotecas cliente, la API de REST o la API de RPC para ejecutar una consulta de Spanner Graph.
Consola de Google Cloud
En los siguientes pasos, se muestra cómo ejecutar una consulta en la consola deGoogle Cloud . En estos pasos, se supone que tienes una instancia llamada test-instance que contiene una base de datos llamada example-db. Si quieres obtener información para crear una instancia con una base de datos, consulta Configura y consulta Spanner Graph.
En la consola de Google Cloud , 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, luego, haz clic en New tab o usa la pestaña del editor.
Ingresa una consulta en el editor de consultas.
Haz clic en Ejecutar.
gcloud CLI
Para enviar consultas con la herramienta de línea de comandos de la CLI de gcloud, haz lo siguiente:
Si aún no está instalada, instala la CLI de gcloud.
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 de REST
Para enviar consultas con la API de REST, usa uno de los siguientes comandos:
Para obtener más información, consulta Cómo consultar datos con la API de REST y Cómo comenzar a usar Spanner con REST.
API de RPC
Para enviar consultas con la API de RPC, usa uno de los siguientes comandos:
Bibliotecas cliente
Para obtener más información sobre cómo ejecutar una consulta con una biblioteca cliente de Spanner, consulta lo siguiente:
- Realiza consultas con la biblioteca cliente de C++ de Spanner
- Cómo realizar consultas con la biblioteca cliente de Spanner para C#
- Realiza consultas con la biblioteca cliente de Spanner Go
- Cómo realizar consultas con la biblioteca cliente de Java para Spanner
- Realiza consultas con la biblioteca cliente de Spanner Node.js
- Cómo realizar consultas con la biblioteca cliente de Spanner para PHP
- Cómo realizar consultas con la biblioteca cliente de Python de Spanner
- Realiza consultas con la biblioteca cliente de Spanner para Ruby
Para obtener más información sobre las bibliotecas cliente de Spanner, consulta la descripción general de las bibliotecas cliente de Spanner.
Visualiza 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 de Google Cloud . Una visualización de la consulta te permite ver cómo se conectan los elementos devueltos (nodos y aristas). Esto puede revelar patrones, dependencias y anomalías que son difíciles de ver cuando observas 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ás ver los resultados de la consulta en formato tabular. Para obtener más información, consulta Usa visualizaciones de consultas de Spanner Graph.
Estructura de la consulta 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 bordes, y los cuantificadores. Usas estos componentes para crear una consulta que encuentre patrones específicos en tu gráfico. Cada componente se describe en la sección Coincidencia de patrones de gráficos de este documento.
La consulta de la Figura 2 muestra la estructura básica de una consulta de Spanner Graph. La consulta comienza especificando el gráfico objetivo, FinGraph, con la cláusula GRAPH. Luego, la cláusula MATCH define el patrón que se buscará. En este caso, es 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 correlación de patrones de grafos encuentra patrones específicos dentro de tu grafo. Los patrones más básicos son los patrones de elementos, como los patrones de nodos que coinciden con nodos y los patrones de bordes que coinciden con bordes.
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 propiedad.
Cómo encontrar todos los nodos
La siguiente consulta devuelve todos los nodos del gráfico. La variable n, una variable de patrón de grafo, 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 |
Cómo encontrar todos los nodos con una etiqueta específica
La siguiente consulta coincide con todos los nodos del grafo que tienen la etiqueta Person.
La consulta devuelve las propiedades label y id, 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 | nombre |
|---|---|---|
| Persona | 1 | Alex |
| Persona | 2 | Dana |
| Persona | 3 | Lee |
Cómo encontrar todos los nodos que coinciden con una expresión de etiqueta
Puedes crear una expresión de etiqueta con uno o más operadores lógicos. Por ejemplo, la siguiente consulta coincide con todos los nodos del grafo 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 búsqueda:
- 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 | birthday | 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 |
Encuentra 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:
| etiqueta | id | nombre | birthday |
|---|---|---|---|
| Persona | 1 | Alex | 1991-12-21T08:00:00Z |
Puedes usar la cláusula WHERE para formar 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:
| etiqueta | nombre | birthday |
|---|---|---|
| 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 los nodos. Los patrones de borde se incluyen entre corchetes ([]) y contienen símbolos como -, -> o <- para indicar direcciones. Un patrón de borde puede incluir, de manera opcional, una variable de patrón de grafo para vincularla a los bordes coincidentes.
Encuentra todas las aristas con etiquetas coincidentes
Esta consulta devuelve todas las aristas del grafo con la etiqueta Transfers. La consulta vincula la variable del patrón de grafo e a las aristas coincidentes.
GRAPH FinGraph
MATCH -[e:Transfers]->
RETURN e.Id as src_account, e.order_number
Estos son los resultados:
| src_account | order_number |
|---|---|
| 7 | 304330008004315 |
| 7 | 304120005529714 |
| 16 | 103650009791820 |
| 20 | 304120005529714 |
| 20 | 302290001255747 |
Encuentra todas las aristas que coinciden con la expresión de etiqueta y el filtro de propiedad.
El patrón de borde de esta consulta usa una expresión de etiqueta y un filtro de propiedad para encontrar todos los bordes etiquetados 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:
| src_account | order_number |
|---|---|
| 7 | 304120005529714 |
| 20 | 304120005529714 |
Encuentra 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 hacer coincidir bordes en cualquier dirección. La siguiente consulta encuentra 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:
| order_number | cantidad |
|---|---|
| 304330008004315 | 300 |
| 304120005529714 | 100 |
| 103650009791820 | 300 |
| 302290001255747 | 200 |
Patrones de ruta de acceso
Un patrón de ruta de acceso se compila a partir de patrones de nodos y aristas alternados.
Cómo encontrar todas las rutas desde un nodo específico con un patrón de ruta
La siguiente consulta encuentra todas las transferencias a una cuenta iniciadas desde una cuenta propiedad de Person con id igual a 2.
Cada resultado coincidente representa una ruta desde Person {id: 2} a través de un Account conectado con la arista Owns, hacia otro Account con 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:
| sender_id | from_id | to_id |
|---|---|---|
| 2 | 20 | 7 |
| 2 | 20 | 16 |
Patrones de ruta de acceso cuantificados
Un patrón cuantificado repite un patrón dentro de un rango especificado.
Coincide con un patrón de borde cuantificado
Para encontrar rutas de longitud variable, puedes aplicar un cuantificador a un patrón de borde. La siguiente consulta muestra esto buscando cuentas de destino que estén a una o tres transferencias de una fuente Account con un id de 7.
La consulta aplica el cuantificador {1, 3} al patrón de borde -[e:Transfers]->. Esto indica a la consulta que debe coincidir con las rutas que repiten el patrón de borde 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 e de group variable. 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:
| 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.
Cómo hacer coincidir un patrón de ruta de acceso cuantificado
La siguiente consulta encuentra rutas entre nodos Account con una o dos aristas Transfers a través de cuentas intermedias que están bloqueadas.
El patrón de ruta de acceso entre paréntesis se cuantifica, y su cláusula WHERE especifica condiciones para el 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:
| src_account_id | dst_account_id |
|---|---|
| 7 | 20 |
| 7 | 20 |
| 20 | 20 |
Variables de agrupación
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. Luego, se vincula a un array de elementos del gráfico coincidentes.
Puedes acceder a una variable de grupo como un array. Sus elementos de gráfico se conservan en el orden en que aparecen a lo largo de las rutas coincidentes. Puedes agregar una variable de grupo con la agregación horizontal.
Variable del grupo de acceso
En el siguiente ejemplo, se accede a la variable e de la siguiente manera:
- Variable de patrón de gráfico vinculada a un solo borde en la cláusula
WHEREe.amount > 100cuando se encuentra dentro del patrón cuantificado. - Es una variable de grupo vinculada a un array de elementos de borde en
ARRAY_LENGTH(e)en la instrucciónRETURNcuando está fuera del patrón cuantificado. - Es una variable de grupo vinculada a un array de elementos de borde, que se agrega con
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:
| src_account_id | path_length | total_amount | dst_account_id |
|---|---|---|---|
| 7 | 1 | 300 | 16 |
| 7 | 2 | 600 | 20 |
Prefijos de búsqueda de rutas de acceso
Para limitar las rutas coincidentes dentro de los grupos que comparten nodos de origen y destino, puedes usar el prefijo de búsqueda de ruta 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.
Coincidencia con ANY
La siguiente consulta encuentra todas las cuentas únicas a las que se puede acceder que están a uno o dos nodos Transfers de distancia de un nodo Account determinado.
El prefijo de búsqueda de ruta ANY garantiza que la consulta solo devuelva una ruta entre un par único de nodos src y dst Account. En el siguiente ejemplo, aunque puedes llegar al nodo Account con {id: 16} en dos rutas de acceso diferentes desde el nodo fuente Account, la consulta solo devuelve una ruta de acceso.
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:
| src_account_id | dst_account_id | ids_in_path |
|---|---|---|
| 7 | 16 | 7,16 |
| 7 | 20 | 7,16,20 |
Patrones de gráficos
Un patrón de gráfico consta de uno o más patrones de ruta de acceso, separados por una coma (,). Los patrones de gráfico pueden contener una cláusula WHERE, que te permite acceder a todas las variables del patrón de gráfico en los patrones de ruta de acceso para formar condiciones de filtrado. Cada patrón de ruta genera una colección de rutas.
Coincidencia con un patrón de gráfico
La siguiente consulta identifica las cuentas intermediarias y sus propietarios involucrados en transacciones con importes superiores a USD 200, a través de las cuales se transfieren fondos de una cuenta de origen a una cuenta bloqueada.
Los siguientes patrones de ruta de acceso forman el patrón de gráfico:
- El primer patrón encuentra rutas en las que la transferencia se produce de una cuenta a una cuenta bloqueada a través de una cuenta intermedia.
- El segundo patrón encuentra rutas de acceso desde una cuenta a su propietario.
La variable interm actúa como un vínculo común entre los dos patrones de ruta de acceso, lo que requiere que interm haga referencia al mismo nodo de elemento en ambos patrones de ruta de acceso. Esto crea una operación de unió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:
| src_account_id | dst_account_id | interm_account_id | owner_id |
|---|---|---|---|
| 20 | 16 | 7 | 1 |
Sentencias 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 que aparecen en la consulta.
Cada instrucción toma la salida de la instrucción anterior como entrada. La entrada está vacía para la primera instrucción.
El resultado 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 mayor transferencia saliente 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 pasan entre cada instrucción. Para mayor brevedad, solo se muestran algunas propiedades.
| Afirmación | 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:
| account_id | owner_name |
|---|---|
7 |
Alex |
Sentencia return
La sentencia RETURN especifica qué se debe devolver de los patrones coincidentes. Puede acceder a variables de patrones de grafos y puede 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.
Devuelve elementos del 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:
| 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"}} |
Cómo redactar consultas más grandes con la palabra clave NEXT
Puedes encadenar varias instrucciones de consulta lineal de gráficos con la palabra clave NEXT.
La primera instrucción recibe una entrada vacía, y la salida de cada instrucción subsiguiente 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 del gráfico. Puedes 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:
| account_id | owner_name | num_incoming_transfers |
|---|---|---|
16 |
Lee |
3 |
Funciones y expresiones
Puedes usar todas las funciones (tanto agregadas como escalares), los operadores y las expresiones condicionales de GoogleSQL en las consultas de Spanner Graph. Spanner Graph también admite funciones y operadores específicos del grafo.
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:
| is_blocked_property_exists | name_property_exists | etiquetas | cuentas | ubicación | person |
|---|---|---|---|---|---|
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. En la siguiente lista, se indican las reglas de las subconsultas de Spanner Graph:
- Una subconsulta se incluye entre un par de llaves
{}. - Una subconsulta puede comenzar con la cláusula
GRAPHinicial para especificar el gráfico en alcance. No es necesario que el gráfico especificado sea 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 en alcance se infiere del contexto de la consulta externa más cercana.
- La subconsulta debe comenzar con una instrucción de coincidencia de patrones de grafos con
MATCH.
- Una variable de patrón de gráfico declarada fuera del alcance 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.
Usa una subconsulta para encontrar la cantidad total de transferencias de cada cuenta
La siguiente consulta ilustra el uso de la subconsulta VALUE. La subconsulta se incluye entre llaves {} con el prefijo de la palabra clave VALUE. La consulta devuelve la cantidad 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:
| nombre | account_id | num_transfers |
|---|---|---|
Alex |
7 |
2 |
Dana |
20 |
2 |
Lee |
16 |
1 |
Para obtener una lista de las expresiones de subconsulta admitidas, consulta Subconsultas de Spanner Graph.
Usa una subconsulta para encontrar las cuentas que posee cada persona
En la siguiente consulta, se usa la instrucción CALL con una subconsulta intercalada. 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 para cada fila de esta tabla de trabajo. La subconsulta busca las cuentas que posee cada persona coincidente p. Las múltiples cuentas de la misma persona se ordenan por ID de cuenta.
En el ejemplo, se declara la variable de nodo con alcance externo p a partir de la cláusula MATCH
(p:Person). La sentencia 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. Esto garantiza que las variables de nodo p internas y externas se vinculen al mismo nodo Person en el 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 alcance externo, y la subconsulta no la declara de forma múltiple porque devuelve resultados diferentes. Para obtener más información, consulta la declaración CALL.
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 |
Parámetros de consulta
Puedes consultar Spanner Graph con parámetros. Para obtener más información, consulta la sintaxis y aprende a consultar datos con parámetros en las bibliotecas cliente de Spanner.
La siguiente consulta ilustra el uso de los parámetros de búsqueda.
GRAPH FinGraph
MATCH (person:Person {id: @id})
RETURN person.name;
Cómo consultar gráficos y tablas juntos
Puedes usar consultas de Graph 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 formato tabular, que se puede integrar en una consulta en SQL. Esta interoperabilidad te permite enriquecer los resultados de las consultas de gráficos con contenido que no es 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, puedes identificar personas específicas a través de la correlación de patrones de grafos en GRAPH_TABLE y unir los resultados de la consulta de grafos con la tabla CreditReports para recuperar 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:
| person_id | latest_credit_score |
|---|---|
1 |
700 |
2 |
800 |
¿Qué sigue?
Conoce las prácticas recomendadas para ajustar las búsquedas.