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 rutaSi 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 repetirt1
dos veces. - De forma predeterminada, la consulta de Spanner Graph devuelve una ruta válida.
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:
|
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 | .
|
. |
|
[]
|
No es compatible. | ||
Patrón como expresión | size(pattern) |
No es compatible. Usa una subconsulta como la siguiente:
|
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
|
Spanner Graph
no admite una cadena de comparación. Equivale a las comparaciones combinadas con AND . Por ejemplo:
|
||
Booleano | AND |
AND |
|
OR |
OR |
||
XOR |
Spanner Graph
no admite XOR . Escribe la consulta con <> .Por ejemplo:
|
||
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}); |
INSERT INTO Person (id, name) VALUES (100, "John"); |
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; |