Referencia de Spanner Graph para usuarios de openCypher

En este documento, se comparan openCypher y Spanner Graph de las siguientes maneras:

  • Terminología
  • Modelo de datos
  • Esquema
  • Consulta
  • Mutación

En este documento, se supone que estás familiarizado con openCypher v9.

Antes de comenzar

Configura y consulta Spanner Graph con la consola de Google Cloud .

Terminología

openCypher Spanner Graph
nodos nodos
relaciones bordes
etiquetas de nodos etiquetas de nodos
tipos de relaciones etiquetas de borde
cláusulas Spanner Graph usa el término statement para una unidad completa de ejecución y clause para un modificador de instrucciones.

Por ejemplo, MATCH es una sentencia, mientras que WHERE es una cláusula.
unicidad de la relación

openCypher no muestra resultados con bordes repetidos en una sola coincidencia.
Ruta de TRAIL

Cuando se desee la unicidad en Spanner Graph, usa el modo TRAIL para mostrar aristas únicas en una sola coincidencia.

Cumplimiento de los estándares

Spanner Graph adopta los estándares ISO Graph Query Language (GQL) y SQL/Property Graph Queries (SQL/PGQ).

Modelo de datos

Tanto Spanner Graph como openCypher adoptan el modelo de datos de grafo de propiedades con algunas diferencias.

openCypher Spanner Graph
Cada relación tiene exactamente un tipo de relación.
Tanto los nodos como las aristas tienen una o más etiquetas.

Esquema

openCypher Spanner Graph
Un gráfico no tiene un esquema predefinido. Un esquema de gráfico se debe definir de forma explícita con la declaración CREATE PROPERTY GRAPH.
Las etiquetas se definen de forma estática en el esquema. Para actualizar las etiquetas, debes actualizar el esquema.
Para obtener más información, consulta Cómo crear, actualizar o descartar un esquema de gráfico de Spanner.

Consulta

Las capacidades de consulta de Spanner Graph son similares a las de openCypher. En esta sección, se describen las diferencias entre Spanner Graph y openCypher.

Especifica el gráfico

En openCypher, hay un grafo predeterminado, y las consultas operan en él. En Spanner Graph, puedes definir más de un gráfico, y una consulta debe comenzar con la cláusula GRAPH para especificar el gráfico que se consultará. Por ejemplo:

   GRAPH FinGraph
   MATCH (p:Person)
   RETURN p.name
   ORDER BY p.name
   LIMIT 1;

Para obtener más información, consulta la sintaxis de la consulta de gráficos.

Coincidencia de patrones de grafos

Spanner Graph admite funciones de coincidencia de patrones de gráficos similares a las de openCypher. Las diferencias se explican en las siguientes secciones.

Unicidad de la relación y modo TRAIL

openCypher no muestra resultados con aristas repetidas en una sola coincidencia. Esto se denomina unicidad de la relación en openCypher. En Spanner Graph, los bordes repetidos se devuelven de forma predeterminada. Cuando se desee la unicidad, usa el modo TRAIL para asegurarte de que no haya aristas repetidas en la coincidencia única. Para obtener una semántica detallada de TRAIL y otros modos de ruta diferentes, consulta Modo de ruta.

En el siguiente ejemplo, se muestra cómo cambian los resultados de una consulta con el modo TRAIL:

  • Las consultas del modo TRAIL de openCypher y Spanner Graph muestran resultados vacíos porque la única ruta posible es repetir t1 dos veces.
  • De forma predeterminada, la consulta de Spanner Graph muestra una ruta de acceso válida.

Gráfico de ejemplo

openCypher Spanner Graph (modo TRAIL) Spanner Graph (modo predeterminado)
MATCH
  (src:Account)-[t1:Transfers]->
  (dst:Account)-[t2:Transfers]->
  (src)-[t1]->(dst)
WHERE src.id = 16
RETURN src.id AS src_id, dst.id AS dst_id;
      
GRAPH FinGraph
MATCH TRAIL
  (src:Account)-[t1:Transfers]->
  (dst:Account)-[t2:Transfers]->
  (src)-[t1]->(dst)
WHERE src.id = 16
RETURN src.id AS src_id, dst.id AS dst_id;
      
GRAPH FinGraph
MATCH
  (src:Account)-[t1:Transfers]->
  (dst:Account)-[t2:Transfers]->
  (src)-[t1]-> (dst)
WHERE src.id = 16
RETURN src.id AS src_id, dst.id AS dst_id;
      
Resultado vacío. Resultado vacío. Resultado:
src_id dst_id
16 20

Muestra elementos de gráfico como resultados de la consulta

openCypher Spanner Graph
MATCH (account:Account)
WHERE account.id = 16;
RETURN account;
GRAPH FinGraph
MATCH (account:Account)
WHERE account.id = 16;
RETURN TO_JSON(account) AS account;

En Spanner Graph, los resultados de las consultas no muestran elementos de gráfico. Usa la función TO_JSON para mostrar elementos de gráfico como JSON.

Concordancia de patrones de longitud variable y cuantificación de patrones

La coincidencia de patrones de longitud variable en openCypher se denomina cuantificación de ruta en Spanner Graph. La cuantificación de rutas de acceso usa una sintaxis diferente, como se muestra en el siguiente ejemplo. Para obtener más información, consulta Patrón de ruta de acceso cuantificado.

openCypher Spanner Graph
MATCH (src:Account)-[:Transfers*1..2]->(dst:Account)
WHERE src.id = 16
RETURN dst.id
ORDER BY dst.id;
     
GRAPH FinGraph
MATCH (src:Account)-[:Transfers]->{1,2}(dst:Account)
WHERE src.id = 16
RETURN dst.id
ORDER BY dst.id;
      

Patrón de longitud variable: lista de elementos

Spanner Graph te permite acceder directamente a las variables que se usan en las cuantificaciones de ruta. En el siguiente ejemplo, e en Spanner Graph es lo mismo que edges(p) en openCypher.

openCypher Spanner Graph
MATCH p=(src:Account)-[:Transfers*1..3]->(dst:Account)
WHERE src.id = 16
RETURN edges(p);
      
GRAPH FinGraph
MATCH (src:Account) -[e:Transfers]->{1,3} (dst:Account)
WHERE src.id = 16
RETURN TO_JSON(e) AS e;
     

Ruta más corta

openCypher tiene dos funciones integradas para encontrar la ruta más corta entre nodos: shortestPath y allShortestPath.

  • shortestPath encuentra una sola ruta más corta entre los nodos.
  • allShortestPath encuentra todas las rutas más cortas entre los nodos. Puede haber varias rutas de la misma longitud.

El grafo de Spanner usa una sintaxis diferente para encontrar una sola ruta más corta entre los nodos: ANY SHORTEST para shortestPath.. La función allShortestPath no es compatible con el grafo de Spanner.

openCypher Spanner Graph
MATCH
  (src:Account {id: 7}),
  (dst:Account {id: 20}),
  p = shortestPath((src)-[*1..10]->(dst))
RETURN length(p) AS path_length;
      
GRAPH FinGraph
MATCH ANY SHORTEST
  (src:Account {id: 7})-[e:Transfers]->{1, 3}
  (dst:Account {id: 20})
RETURN ARRAY_LENGTH(e) AS path_length;
      

Sentencias y cláusulas

En la siguiente tabla, se enumeran las cláusulas de openCypher y se indica si son compatibles o no con Spanner Graph.

openCypher Spanner Graph
MATCH Compatible. Para obtener más información, consulta coincidencia de patrones de gráficos.
OPTIONAL MATCH Compatible. Para obtener más información, consulta coincidencia de patrones de gráficos.
RETURN / WITH Compatible. Para obtener más información, consulta la sentencia RETURN y la sentencia WITH.
Spanner Graph requiere un seudónimo explícito para expresiones complicadas.

Compatible.
GRAPH FinGraph
MATCH (p:Person)
RETURN EXTRACT(YEAR FROM p.birthday) AS birthYear;

No se admite.
GRAPH FinGraph
MATCH (p:Person)
RETURN EXTRACT(YEAR FROM p.birthday); -- No aliasing
WHERE Compatible. Para obtener más información, consulta la definición de patrón de gráfico.
ORDER BY Compatible. Para obtener más información, consulta la declaración ORDER BY.
SKIP / LIMIT Compatible. Para obtener más información, consulta la sentencia SKIP y la sentencia LIMIT.

Spanner Graph requiere una expresión constante para el desplazamiento y el límite.

Compatible.
GRAPH FinGraph
MATCH (n:Account)
RETURN n.id
SKIP @offsetParameter
LIMIT 3;

No se admite.
GRAPH FinGraph
MATCH (n:Account)
RETURN n.id
LIMIT VALUE {
  MATCH (m:Person)
  RETURN COUNT(*) AS count
} AS count; -- Not a constant expression
UNION Compatible. Para obtener más información, consulta Consulta de gráfico compuesto.
UNION ALL Compatible. Para obtener más información, consulta Consulta de gráfico compuesto.
UNWIND Es compatible con la declaración FOR.
GRAPH FinGraph
LET arr = [1, 2, 3]
FOR num IN arr
RETURN num;
MANDATORY MATCH No compatible.
CALL[YIELD...] No compatible.
CREATE, DELETE, SET, REMOVE, MERGE Para obtener más información, consulta la sección Mutación y Cómo insertar, actualizar o borrar datos en Spanner Graph.

Tipos de datos

Spanner Graph admite todos los tipos de datos de GoogleSQL. Para obtener más información, consulta Tipos de datos en GoogleSQL.

En las siguientes secciones, se comparan los tipos de datos de openCypher con los tipos de datos de Spanner Graph.

Tipo estructural

openCypher Spanner Graph
Nodo Node
Edge Edge
Ruta Ruta de acceso

Tipo de propiedad

openCypher Spanner Graph
INT INT64
FLOAT FLOAT64
STRING STRING
BOOLEAN BOOL
LIST
Es una lista homogénea de tipos simples.
Por ejemplo, Lista de INT, Lista de STRING.
No puedes combinar INT y STRING en una sola lista.
ARRAY

Tipo compuesto

openCypher Spanner Graph
LIST ARRAY o JSON
MAP STRUCT o JSON

Spanner Graph no admite listas heterogéneas de diferentes tipos ni mapas de una lista de claves dinámicas y tipos de valores de elementos heterogéneos. Usa JSON para estos casos de uso.

Coerción de tipos

openCypher Spanner Graph
INT -> FLOAT Compatible.

Para obtener más información sobre las reglas de conversión de tipos, consulta Reglas de conversión en GoogleSQL.

Funciones y expresiones

Además de las funciones y expresiones de gráfico, Spanner Graph también admite todas las funciones y expresiones integradas de GoogleSQL.

En esta sección, se enumeran las funciones y expresiones de openCypher y sus equivalentes en Spanner Graph.

Funciones y expresiones de tipo estructural

Tipo Función o expresión de openCypher
Función o expresión
de Spanner Graph

Nodo y borde
exists(n.prop) PROPERTY_EXISTS(n, prop)
id (muestra un número entero) No compatible.
properties TO_JSON
keys
(nombres de tipos de propiedades, pero no valores de propiedades)
PROPERTY_NAMES
labels LABELS
Edge endNode No compatible.
startNode No compatible.
type LABELS
Ruta length No compatible.
nodes No compatible.
relationships No compatible.
Nodos y dispositivos perimetrales .
property reference
.
[]
dynamic property reference
MATCH (n)
RETURN n[n.name]

No compatible.
Patrón como expresión size(pattern) No compatible. Usa una subconsulta como la siguiente
VALUE {
  MATCH pattern
  RETURN COUNT(*) AS count;
}

Funciones y expresiones de tipo de propiedad

Tipo Función o expresión de openCypher
Función o expresión
de Spanner Graph
Escalar coalesce COALESCE
head ARRAY_FIRST
last ARRAY_LAST
size(list) ARRAY_LENGTH
size(string) LENGTH
timestamp UNIX_MILLIS(CURRENT_TIMESTAMP())
toBoolean por toFloat por toInteger CAST(expr AS type)
Agregación avg AVG
collect ARRAY_AGG
count COUNT
max MAX
min MIN
percentileCont PERCENTILE_CONT
percentileDisc PERCENTILE_DISC
stDev STDDEV
stDevP No compatible.
sum SUM
Lista range GENERATE_ARRAY
reverse ARRAY_REVERSE
tail Spanner Graph no admite tail.
En su lugar, usa ARRAY_SLICE y ARRAY_LENGTH.
Matemática abs ABS
ceil CEIL
floor FLOOR
rand RAND
round ROUND
sign SIGN
e EXP(1)
exp EXP
log LOG
log10 LOG10
sqrt SQRT
acos ACOS
asin ASIN
atan ATAN
atan2 ATAN2
cos COS
cot COT
degrees r * 90 / ASIN(1)
pi ACOS(-1)
radians d * ASIN(1) / 90
sin SIN
tan TAN
String left LEFT
ltrim LTRIM
replace REPLACE
reverse REVERSE
right RIGHT
rtrim RTRIM
split SPLIT
substring SUBSTR
tolower LOWER
tostring CAST(expr AS STRING)
toupper UPPER
trim TRIM
DISTINCT DISTINCT DISTINCT
Matemática + +
- -
* *
/ /
% MOD
^ POW
Comparación = =
<> <>
< <
> >
<= <=
>= >=
IS [NOT] NULL IS [NOT] NULL
Cadena de comparación
a < b < c

Spanner Graph no admite una cadena de comparación. Esto equivale a las comparaciones unidas con AND.
Por ejemplo:

      a < b AND b < C
      

Booleano AND AND
OR OR
XOR
Spanner Graph no admite XOR. Escribe la consulta con <>.

Por ejemplo:
      boolean_1 <> boolean_2
      

NOT NOT
String STARTS WITH STARTS_WITH
ENDS WITH ENDS_WITH
CONTAINS REGEXP_CONTAINS
+ CONCAT
Lista + ARRAY_CONCAT
IN ARRAY_INCLUDES
[] []

Otras expresiones

openCypher Spanner Graph
Expresión de caso Compatible.
Subconsulta EXISTS Compatible.
Proyección del mapa No compatible.
STRUCT proporcionan funcionalidades similares.
Comprensión de listas No compatible.
GENERATE_ARRAY y ARRAY_TRANSFORM abarcan la mayoría de los casos de uso.

Parámetro de consulta

En las siguientes consultas, se muestra la diferencia entre usar parámetros en openCypher y en Spanner Graph.

openCypher Spanner Graph
Parámetro
MATCH (n:Person)
WHERE n.id = $id
RETURN n.name;
GRAPH FinGraph
MATCH (n:Person)
WHERE n.id = @id
RETURN n.name;

Mutación

Spanner Graph usa el DML de GoogleSQL para mutar las tablas de entrada de nodos y vínculos. Para obtener más información, consulta Cómo insertar, actualizar o borrar datos de Spanner Graph.

Crea un nodo y un borde

openCypher Spanner Graph
Crea nodos y bordes
CREATE (:Person {id: 100, name: 'John'});
CREATE (:Account {id: 1000, is_blocked: FALSE});

MATCH (p:Person {id: 100}), (a:Account {id: 1000}) CREATE (p)-[:Owns {create_time: timestamp()}]->(a);
INSERT INTO
Person (id, name)
VALUES (100, "John");

INSERT INTO Account (id, is_blocked) VALUES (1000, FALSE);
INSERT INTO PersonOwnAccount (id, account_id, create_time) VALUES (100, 1000, CURRENT_TIMESTAMP());
Crea nodos y aristas con los resultados de la consulta
MATCH (a:Account {id: 1}), (oa:Account)
WHERE oa <> a
CREATE (a)-[:Transfers {amount: 100, create_time: timestamp()}]->(oa);
INSERT INTO AccountTransferAccount(id, to_id, create_time, amount)
SELECT a.id, oa.id, CURRENT_TIMESTAMP(), 100
FROM GRAPH_TABLE(
  FinGraph
  MATCH
    (a:Account {id:1000}),
    (oa:Account)
  WHERE oa <> a
);

En Spanner Graph, las etiquetas se asignan de forma estática según la instrucción DDL CREATE PROPERTY GRAPH.

Actualiza el nodo y el borde

openCypher Spanner Graph
Actualiza propiedades
MATCH (p:Person {id: 100})
SET p.country = 'United States';
UPDATE Person AS p
SET p.country = 'United States'
WHERE p.id = 100;

Para actualizar las etiquetas de Spanner Graph, consulta Cómo crear, actualizar o descartar un esquema de Spanner Graph.

Combina nodos y bordes

openCypher Spanner Graph
Cómo insertar un elemento nuevo o actualizar propiedades
MERGE (p:Person {id: 100, country: 'United States'});
INSERT OR UPDATE INTO Person
(id, country)
VALUES (100, 'United States');

Borra el nodo y el borde

Borrar aristas es lo mismo que borrar la tabla de entrada.

openCypher Spanner Graph
Borra nodos y aristas
MATCH (p:Person {id:100}), (a:Account {id:1000})
DELETE (p)-[:Owns]->(a);
DELETE PersonOwnAccount
WHERE id = 100 AND account_id = 1000;

Para borrar nodos, se deben controlar los posibles bordes colgantes. Cuando se especifica DELETE CASCADE, DELETE quita los bordes asociados de los nodos como DETACH DELETE en openCypher. Para obtener más información, consulta la descripción general del esquema de Spanner.

openCypher Spanner Graph
Borra nodos y aristas asociadas
DETACH DELETE (:Account {id: 1000});
DELETE Account
WHERE id = 1000;

Devuelve los resultados de la mutación

openCypher Spanner Graph
Cómo mostrar resultados después de la inserción o actualización
MATCH (p:Person {id: 100})
SET p.country = 'United States'
RETURN p.id, p.name;
UPDATE Person AS p
SET p.country = 'United States'
WHERE p.id = 100
THEN RETURN id, name;
Cómo mostrar resultados después de la eliminación
DELETE (p:Person {id: 100})
RETURN p.country;
DELETE FROM Person
WHERE id = 100
THEN RETURN country;

¿Qué sigue?