Referencia del grafo de Spanner 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 asume que estás familiarizado 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 nodo etiquetas de nodo
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 las relaciones

openCypher no devuelve resultados con aristas repetidas en una sola la coincidencia.
Ruta de TRAIL

Cuando se desea la unicidad en el gráfico de Spanner, usar 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 del 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 Crea, actualiza o descarta un esquema de grafo 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 grafo predeterminado, y las consultas operan en esa plataforma. 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 capacidades de coincidencia de patrones de grafos similares a openCypher. Las diferencias se explican en las siguientes secciones.

Relación de unicidad y modo TRAIL

openCypher no devuelve resultados con aristas repetidas en una sola coincidencia; este se denomina unicidad de relaciones 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 semántica detallada de TRAIL y otros modos de ruta de acceso diferentes, consulta Modo de ruta de acceso.

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

  • Las consultas en modo TRAIL de grafo de openCypher y Spanner muestran un valor vacío porque la única ruta posible es repetir t1 dos veces.
  • De forma predeterminada, la consulta de grafo de Spanner muestra una ruta válida.

Gráfico de ejemplo

openCypher Gráfico de Spanner (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 gráfico 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.

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 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 usadas en la ruta cuantificables. En el siguiente ejemplo, e en el grafo de Spanner es el mismo. como 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 única ruta más corta entre nodos.
  • allShortestPath busca todas las rutas más cortas entre nodos. Puede ser múltiples rutas de la misma longitud.

Spanner Graph usa una sintaxis diferente para encontrar una sola ruta más corta entre nodos: ANY SHORTEST para shortestPath. allShortestPath no es compatible.

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
COINCIDIR Compatible. Para obtener más información, consulta Coincidencia de patrones de grafos.
COINCIDENCIA OPCIONAL Compatible. Para obtener más información, consulta Coincidencia de patrones de grafos.
DEVOLUCIÓN / CON Compatible. Para obtener más información, consulta el Instrucción RETURN y el Sentencia 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 compatible.
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 el Sentencia ORDER BY.
OMITIR / LÍMITE Compatible. Para obtener más información, consulta el Instrucción SKIP y el Sentencia LIMIT.

El grafo de Spanner requiere una expresión constante para la compensación y el límite.

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

No 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.
DESENVIAR Compatible con la instrucción “FOR”.
GRAPH FinGraph
LET arr = [1, 2, 3]
FOR num IN arr
RETURN num;
PARTIDA OBLIGATORIA No compatible.
LLAMAR[RENDTO...] No compatible.
CREAR, BORRAR, CONFIGURAR, QUITAR O COMBINAR 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 ver 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
LISTA
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
LISTA 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
ENTERO -> NÚMERO DE PUNTO FLOTANTE 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 grafos, Graph de Spanner admite todas las funciones y expresiones integradas de GoogleSQL.

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

En esta sección, se enumeran las funciones y expresiones de openCypher, así como su equivalentes en Spanner Graph.

Funciones y expresiones de tipos estructurales

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

Nodo y perimetral
exists(n.prop) property_exists(n, prop)
id(devuelve un número entero) No compatible.
del bucket to_json
claves
(nombres de tipos de propiedades, pero no valores de propiedades)
property_names
etiquetas etiquetas
Edge endNode No compatible.
startNode No compatible.
tipo etiquetas
Ruta length No compatible.
nodos No compatible.
relaciones No compatible.
Nodo y perimetral

referencia de propiedad
.
[]

referencia de propiedad dinámica
MATCH (n)
RETURN n[n.name]

No compatible.
Patrón como expresión tamaño(diseño) No compatible. Usa una subconsulta de la siguiente manera
VALUE {
  MATCH pattern
  RETURN COUNT(*) AS count;
}

Funciones y expresiones de tipo de propiedad

Tipo openCypher
función o expresión
Gráfico de Spanner
función o expresión
Escalar fusionar fusionar
head array_first
última array_last
tamaño(lista) array_length
tamaño(cadena) length
timestamp unix_millis(current_timestamp())
toBoolean/toFloat/toInteger cast( como )
Agregación prom. prom.
collect array_agg
count count
máx. máx.
min min
percentileCont percentile_cont
percentileDisc percentile_disc
stDev stdev
stDevP stdev_pop
ponderada ponderada
Lista rango generate_array
revertir array_reverse
tail Spanner Graph no es compatible con tail.
Usa array_slice y array_length. en su lugar.
Matemático abdominales abdominales
Celeste Celeste
piso piso
rand rand
redondear redondear
firmar firmar
e exp. (1)
exp exp
log log
log10 log10
rq rq
acos acos
asin asin
atan atan
atan2 atan2
cos cos
cot cot
grados r * 90 / asin(1)
pi pi
radianes d * asin(1) / 90
sen sen
tostado tostado
String izquierda izquierda
borde borde
reemplazar reemplazar
revertir revertir
derecha derecha
borde borde
split split
subcadena substr
tolower menor
tostring cast( as string)
toupper upper
cortar cortar
DISTINCT DISTINCT DISTINCT
Matemático + +
- -
* *
/ /
% MOD
^ POW
Comparación = =
<> <>
< <
> >
<= <=
>= >=
ES [NO] NULO ES [NO] NULO
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 Y Y
O O
XO
Gráfico de Spanner no es compatible con XOR. Escribe la consulta con <>.

Por ejemplo:
      boolean_1 <> boolean_2
      

NOT NOT
String COMIENZA CON starts_with
TERMINA CON ends_with
CONTAINS regexp_contains
+ string_concat
Lista + array_concat
IN array_includes
[] []

Otras expresiones

openCypher Spanner Graph
Expresión de mayúsculas y minúsculas Compatible.
Subconsulta existente Compatible.
Proyección del mapa No compatible.
Los tipos de STRUCT brindan 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

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;

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 resultados de consultas
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
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 etiquetas de gráficos de Spanner, consulta Crea, actualiza o descarta un esquema de grafo de Spanner.

Combinar nodo y perímetro

openCypher Spanner Graph
Inserta un elemento nuevo o actualiza las propiedades
MERGE (p:Person {id: 100, country: 'United States'});
INSERT OR UPDATE INTO Person
(id, country)
VALUES (100, 'United States');

Borrar nodo y perímetro

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 como DETACH DELETE en openCypher. Para obtener más información, consulta Spanner descripción general del esquema.

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

Muestra los resultados de mutación

openCypher Spanner Graph
Cómo mostrar 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;
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?