Referencia de Spanner Graph para usuarios de openCypher

En este documento, se comparan openCypher y Spanner Graph en la siguiente tabla: 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 a sentencias.

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 el gráfico de Spanner, usa el modo TRAIL para mostrar aristas únicas en una sola coincidencia.

Cumplimiento de los estándares

Spanner Graph adopta las normas ISO Lenguaje de consulta de grafo (GQL) y Consultas de grafos de propiedades o SQL (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 debe definirse explícitamente mediante el uso de Declaración CREATE PROPERTY GRAPH.
Las etiquetas se definen de forma estática en el esquema. Para actualizar las etiquetas, puedes 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 grafos de Spanner son similares a las de openCypher. Las diferencias entre el grafo de Spanner y openCypher se describen en esta sección.

Especifica el gráfico

En openCypher, hay un gráfico predeterminado, y las consultas operan en esa red gráfico. En el grafo de Spanner, puedes definir más de un grafo 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, revisa la sintaxis de consulta de grafos.

Representar gráficamente la coincidencia de patrones

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

Relación de unicidad 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 el grafo de Spanner, los bordes repetidos se muestran de forma predeterminada. Si quieres que sea único, usa Modo TRAIL para garantizar que no exista ningún borde repetitivo en la sola coincidencia 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

Cómo mostrar elementos del 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 el grafo de Spanner, los resultados de la consulta no muestran elementos del gráfico. Usa el La función TO_JSON para mostrar elementos del 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 la ruta de acceso usa una sintaxis diferente, como se muestra a continuación en el siguiente ejemplo. Para obtener más información, consulta Patrón de ruta cuantificada.

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;
     

El camino más corto

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 busca todas las rutas más cortas entre nodos. Puede ser múltiples 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 que 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 el sentencia RETURN y la Declaración WITH.
Spanner Graph requiere alias explícitos 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 el sentencia SKIP y la Declaración 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 es compatible.
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 grafo compuesto.
UNION ALL Compatible. Para obtener más información, consulta Consulta de grafo compuesto.
UNWIND 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 Mutation (Mutación). y, luego, Insertar, actualizar o borrar datos en el gráfico de Spanner.

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 datos del grafo de Spanner. de tipos de datos.

Tipo estructural

openCypher Spanner Graph
Nodo Node
Edge Edge
Ruta No compatible.

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 o 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 o 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, consulte 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.

Para obtener una lista completa de funciones y expresiones, consulta Funciones, operadores y condicionales de GoogleSQL.

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

Funciones y expresiones de tipos estructurales

Tipo Función o expresión de openCypher
Gráfico de Spanner
función o expresión

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 de la siguiente manera
VALUE {
  MATCH pattern
  RETURN COUNT(*) AS count;
}

Funciones y expresiones de tipo de propiedad

Tipo Función o expresión de openCypher
Gráfico de Spanner
función o expresión
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 es compatible con tail.
Usa ARRAY_SLICE y ARRAY_LENGTH. en su lugar.
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

Gráfico de Spanner no admite una cadena de comparación. Esto equivale a lo siguiente: comparaciones conjuntadas con AND.
Por ejemplo:

      a < b AND b < C
      

Booleano AND AND
OR OR
XOR
Gráfico de Spanner no es compatible con 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 existente Compatible.
Proyección del mapa No compatible.
Los tipos de 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 DML de GoogleSQL para mutar las tablas de entrada perimetral y de nodo. Para obtener más información, consulta Insertar, actualizar o borrar datos del gráfico de Spanner.

Crear nodo y perímetro

openCypher Spanner Graph
Crea 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());
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 el grafo de Spanner, las etiquetas se asignan estáticamente según el CREATE PROPERTY GRAPH declaración DDL.

Actualiza el nodo y el perímetro

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 equivale a 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?