Referencia de Spanner Graph para usuarios de openCypher

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

  • Terminología
  • Modelo de datos
  • Esquema
  • Consulta
  • Mutation

En este documento se da por supuesto que tienes conocimientos sobre openCypher v9.

Antes de empezar

Configura y consulta Spanner Graph con la Google Cloud consola.

Terminología

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

Por ejemplo, MATCH es una instrucción, mientras que WHERE es una cláusula.
Unicidad de las relaciones

openCypher no devuelve resultados con aristas repetidas en una sola coincidencia.
TRAIL ruta

Si quieres que los resultados de Spanner Graph sean únicos, usa el modo TRAIL para devolver aristas únicas en una sola coincidencia.

Cumplimiento de los estándares

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

Modelo de datos

Tanto Spanner Graph como openCypher adoptan el modelo de datos de gráfico de propiedades, aunque con algunas diferencias.

openCypher Spanner Graph
Cada relación tiene exactamente un tipo de relación.
Tanto los nodos como los bordes tienen una o varias etiquetas.

Esquema

openCypher Spanner Graph
Un gráfico no tiene ningún esquema predefinido. Un esquema de gráfico debe definirse explícitamente mediante la instrucció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 Crear, actualizar o eliminar un esquema de Spanner Graph.

Consulta

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

Especificar el gráfico

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

   GRAPH FinGraph
   MATCH (p:Person)
   RETURN p.name;

Para obtener más información, consulta la sintaxis de las consultas 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 las relaciones y modo TRAIL

openCypher no devuelve resultados con aristas repetidas en una sola coincidencia. Esto se denomina unicidad de relaciones en openCypher. En Spanner Graph, los bordes repetidos se devuelven de forma predeterminada. Si quieres que los resultados sean únicos, usa el modo TRAIL para asegurarte de que no haya bordes repetidos en la coincidencia. Para obtener información detallada sobre la semántica de TRAIL y otros modos de ruta, consulte Modo de ruta.

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

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

Gráfico de ejemplo

openCypher Spanner Graph (modo PRUEBA) 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;
      
No se ha obtenido ningún resultado. No se ha obtenido ningún resultado. Resultado:
src_id dst_id
16 20

Devolver elementos de gráfico como resultados de 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 devuelven elementos de gráfico. Usa la función TO_JSON para devolver elementos de gráfico como JSON.

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

La coincidencia de patrones de longitud variable en openCypher se denomina cuantificación de rutas en Spanner Graph. La cuantificación de rutas usa una sintaxis diferente, como se muestra en el siguiente ejemplo. Para obtener más información, consulta Patrón de ruta 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 rutas. En el ejemplo siguiente, 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 busca una única ruta más corta entre nodos.
  • allShortestPath encuentra todas las rutas más cortas entre nodos. Puede haber varios trazados de la misma longitud.

Spanner Graph usa una sintaxis diferente para encontrar el camino más corto entre nodos: ANY SHORTEST para shortestPath. La función allShortestPath no se admite en Spanner Graph.

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;
      

Afirmaciones y cláusulas

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

openCypher Spanner Graph
MATCH Compatible. Para obtener más información, consulta Coincidencia de patrones de grafos.
OPTIONAL MATCH Compatible. Para obtener más información, consulta Coincidencia de patrones de grafos.
RETURN / WITH Compatible. Para obtener más información, consulta la RETURN declaración y la WITH declaración.
Spanner Graph requiere alias explícitos para expresiones complejas.

Se admite.
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 de ORDER BY.
SKIP / LIMIT Compatible. Para obtener más información, consulta la SKIP declaración y la LIMIT declaración.

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

Se admite.
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áficos compuestos.
UNION ALL Compatible. Para obtener más información, consulta Consulta de gráficos compuestos.
UNWIND Respaldado por la declaración FOR.
GRAPH FinGraph
LET arr = [1, 2, 3]
FOR num IN arr
RETURN num;
MANDATORY MATCH No es compatible.
CALL[YIELD...] No es compatible.
CREATE, DELETE, SET, REMOVE, MERGE Para obtener más información, consulta la sección Mutación y el artículo Insertar, actualizar o eliminar 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
Node Nodo
Edge Edge
Ruta Ruta

Tipo de propiedad

openCypher Spanner Graph
INT INT64
FLOAT FLOAT64
STRING STRING
BOOLEAN BOOL
LIST
Una lista homogénea de tipos simples.
Por ejemplo, Lista de INT, Lista de STRING.
No puedes mezclar INT y STRING en una misma 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 en estos casos prácticos.

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áficos, 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, así como 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 (devuelve un número entero) No es compatible.
properties TO_JSON
keys
(nombres de tipos de propiedades, pero no valores de propiedades)
PROPERTY_NAMES
labels LABELS
Edge endNode No es compatible.
startNode No es compatible.
type LABELS
Ruta length No es compatible.
nodes No es compatible.
relationships No es compatible.
Nodo y borde .
property reference
.
[]
dynamic property reference
MATCH (n)
RETURN n[n.name]

No es compatible.
Patrón como expresión size(pattern) No es 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/toFloat/toInteger CAST(expr AS type)
Agregar avg AVG
collect ARRAY_AGG
count COUNT
max MAX
min MIN
percentileCont PERCENTILE_CONT
percentileDisc PERCENTILE_DISC
stDev STDDEV
stDevP No es compatible.
sum SUM
Lista range GENERATE_ARRAY
reverse ARRAY_REVERSE
tail Spanner Graph no admite tail.
Usa ARRAY_SLICE y ARRAY_LENGTH en su lugar.
Matemáticas 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
Cadena 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áticas + +
- -
* *
/ /
% 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. Equivale a las comparaciones combinadas 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
Cadena 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 de mapa No es compatible.
Los tipos STRUCT ofrecen funciones similares.
Comprensión de listas No es compatible.
GENERATE_ARRAY y ARRAY_TRANSFORM cubren la mayoría de los casos prácticos.

Parámetro de consulta

Las siguientes consultas muestran 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;

Mutation

Spanner Graph usa DML de GoogleSQL para mutar las tablas de entrada de nodos y aristas. Para obtener más información, consulta el artículo Insertar, actualizar o eliminar datos de gráficos de Spanner.

Crear nodos y aristas

openCypher Spanner Graph
Crear nodos y aristas
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());
Crear nodos y aristas con los resultados de una 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.

Actualizar nodos y aristas

openCypher Spanner Graph
Actualizar 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 Crear, actualizar o eliminar un esquema de Spanner Graph.

Fusionar nodos y aristas

openCypher Spanner Graph
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');

Eliminar nodo y arista

Eliminar aristas es lo mismo que eliminar la tabla de entrada.

openCypher Spanner Graph
Eliminar 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 eliminar nodos, es necesario gestionar las posibles aristas colgantes. Cuando se especifica DELETE CASCADE, DELETE elimina los bordes asociados de los nodos, como DETACH DELETE en openCypher. Para obtener más información, consulta el resumen del esquema de Spanner.

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

Devuelve los resultados de la mutación

openCypher Spanner Graph
Devuelve los resultados después de la inserción o la 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;
Devolver resultados después de la eliminación
DELETE (p:Person {id: 100})
RETURN p.country;
DELETE FROM Person
WHERE id = 100
THEN RETURN country;

Siguientes pasos