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