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 repetirt1
dos veces. - De forma predeterminada, la consulta de grafo de Spanner muestra una ruta válida.
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:
|
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
|
No compatible. | ||
Patrón como expresión | tamaño(diseño) | No compatible. Usa una subconsulta de la siguiente manera
|
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( |
||
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( |
||
toupper | upper | ||
cortar | cortar | ||
DISTINCT | DISTINCT | DISTINCT | |
Matemático | + | + | |
- | - | ||
* | * | ||
/ | / | ||
% | MOD | ||
^ | POW | ||
Comparación | = | = | |
<> | <> | ||
< | < | ||
> | > | ||
<= | <= | ||
>= | >= | ||
ES [NO] NULO | ES [NO] NULO | ||
Cadena de comparación
|
Gráfico de Spanner
no admite una cadena de comparación. Esto equivale a lo siguiente:
comparaciones conjuntadas con AND . Por ejemplo:
|
||
Booleano | Y | Y | |
O | O | ||
XO |
Gráfico de Spanner
no es compatible con XOR. Escribe la consulta con <> .Por ejemplo:
|
||
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}); |
INSERT INTO Person (id, name) VALUES (100, "John"); |
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; |