Este documento compara o openCypher e o Spanner Graph das seguintes formas:
- Terminologia
- Modelo de dados
- Esquema
- Consulta
- Mutação
Este documento pressupõe que tem conhecimentos sobre o openCypher v9.
Antes de começar
Configure e consulte o Spanner Graph através da Google Cloud consola.
Terminologia
openCypher | Gráfico do Spanner |
---|---|
nós | nós |
estados civis | bordas |
etiquetas de nós | etiquetas de nós |
tipos de relações | etiquetas de arestas |
cláusulas | O Spanner Graph usa o termo statement para uma unidade completa de execução e clause para um modificador de declarações.Por exemplo, MATCH é uma declaração, enquanto
WHERE é uma cláusula. |
relationship uniqueness O openCypher não devolve resultados com arestas repetidas numa única correspondência. |
TRAIL pathQuando a unicidade é desejada no Spanner Graph, use o TRAIL mode para devolver arestas únicas numa única correspondência.
|
Conformidade com as normas
O Spanner Graph adota as normas ISO Graph Query Language (GQL) e SQL/Property Graph Queries (SQL/PGQ).
Modelo de dados
O Spanner Graph e o openCypher adotam o modelo de dados de grafos de propriedades com algumas diferenças.
openCypher | Gráfico do Spanner |
---|---|
Cada relação tem exatamente um tipo de relação. |
Os nós e as arestas têm uma ou mais etiquetas. |
Esquema
openCypher | Gráfico do Spanner |
---|---|
Um gráfico não tem um esquema predefinido. | Um esquema de gráfico tem de ser definido explicitamente através da declaração CREATE PROPERTY GRAPH .As etiquetas são definidas estaticamente no esquema. Para atualizar as etiquetas, tem de atualizar o esquema. Para mais informações, consulte o artigo Crie, atualize ou elimine um esquema de grafos do Spanner. |
Consulta
As capacidades de consulta do Spanner Graph são semelhantes às do openCypher. As diferenças entre o Spanner Graph e o openCypher são descritas nesta secção.
Especifique o gráfico
No openCypher, existe um gráfico predefinido e as consultas operam no gráfico predefinido. No Spanner Graph, pode definir mais do que um gráfico e uma consulta tem de começar com a cláusula GRAPH
para especificar o gráfico a consultar. Por exemplo:
GRAPH FinGraph
MATCH (p:Person)
RETURN p.name;
Para mais informações, consulte a sintaxe de consulta de gráficos.
Correspondência de padrões de grafos
O Spanner Graph suporta capacidades de correspondência de padrões de grafos semelhantes ao openCypher. As diferenças são explicadas nas secções seguintes.
Unicidade da relação e modo TRAIL
O openCypher não devolve resultados com arestas repetidas numa única correspondência. Isto chama-se unicidade da relação no openCypher. No Spanner Graph, as arestas repetidas são devolvidas por predefinição. Quando a exclusividade é desejada, use o modo TRAIL
para garantir que não existe nenhuma aresta repetida na única correspondência. Para ver a semântica detalhada de TRAIL
e outros modos de caminho diferentes, consulte o modo de caminho.
O exemplo seguinte mostra como os resultados de uma consulta mudam com o modo TRAIL
:
- As consultas no modo openCypher e Spanner Graph
TRAIL
devolvem resultados vazios porque o único caminho possível é repetirt1
duas vezes. - Por predefinição, a consulta do gráfico do Spanner devolve um caminho válido.
openCypher | Gráfico do Spanner (modo TRAIL) | Gráfico do Spanner (modo predefinido) | ||||
---|---|---|---|---|---|---|
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 vazio. | Resultado vazio. | Resultado:
|
Devolver elementos do gráfico como resultados da consulta
openCypher | Gráfico do Spanner |
---|---|
MATCH (account:Account) WHERE account.id = 16 RETURN account; |
GRAPH FinGraph MATCH (account:Account) WHERE account.id = 16 RETURN TO_JSON(account) AS account; |
No gráfico do Spanner, os resultados da consulta não devolvem elementos do gráfico. Use a função
TO_JSON
para devolver elementos do gráfico como JSON.
Correspondência de padrões de comprimento variável e quantificação de padrões
A correspondência de padrões de comprimento variável no openCypher é denominada quantificação de caminhos no Spanner Graph. A quantificação do caminho usa uma sintaxe diferente, conforme mostrado no exemplo seguinte. Para mais informações, consulte o artigo Padrão de caminho quantificado.
openCypher | Gráfico do Spanner |
---|---|
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; |
Padrão de comprimento variável: lista de elementos
O Spanner Graph permite-lhe aceder diretamente às variáveis usadas nas quantificações de caminhos. No exemplo seguinte, e
no Spanner Graph é igual a edges(p)
no openCypher.
openCypher | Gráfico do Spanner |
---|---|
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; |
Caminho mais curto
O openCypher tem duas funções incorporadas para encontrar o caminho mais curto entre nós:
shortestPath
e allShortestPath
.
shortestPath
encontra um único caminho mais curto entre nós.allShortestPath
encontra todos os caminhos mais curtos entre nós. Pode haver vários caminhos com o mesmo comprimento.
O Spanner Graph usa uma sintaxe diferente para encontrar um único caminho mais curto
entre nós: ANY SHORTEST
para shortestPath.
A função allShortestPath
não é suportada no Spanner Graph.
openCypher | Gráfico do Spanner |
---|---|
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; |
Declarações e cláusulas
A tabela seguinte lista as cláusulas openCypher e indica se são suportadas ou não no Spanner Graph.
openCypher | Gráfico do Spanner | |
---|---|---|
MATCH |
Compatível. Para mais informações, consulte a secção Correspondência de padrões de grafos. | |
OPTIONAL MATCH |
Compatível. Para mais informações, consulte a secção Correspondência de padrões de grafos. | |
RETURN / WITH |
Compatível. Para mais informações, consulte a
RETURN declaração e a
WITH declaração.
O Spanner Graph requer a atribuição de alias explícita para expressões complicadas. |
|
Suportado. |
GRAPH FinGraph MATCH (p:Person) RETURN EXTRACT(YEAR FROM p.birthday) AS birthYear; |
|
Não suportado. |
GRAPH FinGraph MATCH (p:Person) RETURN EXTRACT(YEAR FROM p.birthday); -- No aliasing |
|
WHERE |
Compatível. Para mais informações, consulte a definição de padrão de gráfico. | |
ORDER BY |
Compatível. Para mais informações, consulte a
declaração ORDER BY . |
|
SKIP / LIMIT |
Compatível. Para mais informações, consulte a
SKIP declaração e a
LIMIT declaração.O gráfico do Spanner requer uma expressão constante para o desvio e o limite. |
|
Suportado. |
GRAPH FinGraph MATCH (n:Account) RETURN n.id SKIP @offsetParameter LIMIT 3; |
|
Não suportado. |
GRAPH FinGraph MATCH (n:Account) RETURN n.id LIMIT VALUE { MATCH (m:Person) RETURN COUNT(*) AS count } AS count; -- Not a constant expression |
|
UNION |
Compatível. Para mais informações, consulte o artigo Consulta de gráfico composto. | |
UNION ALL |
Compatível. Para mais informações, consulte o artigo Consulta de gráfico composto. | |
UNWIND |
Suportado pela declaração FOR . |
|
GRAPH FinGraph LET arr = [1, 2, 3] FOR num IN arr RETURN num; |
||
MANDATORY MATCH |
Não suportado. | |
CALL[YIELD...] |
Não suportado. | |
CREATE , DELETE , SET ,
REMOVE , MERGE |
Para saber mais, consulte a secção Mutação e Inserir, atualizar ou eliminar dados no Spanner Graph. |
Tipos de dados
O Spanner Graph suporta todos os tipos de dados GoogleSQL. Para mais informações, consulte Tipos de dados no GoogleSQL.
As secções seguintes comparam os tipos de dados openCypher com os tipos de dados do Spanner Graph.
Tipo estrutural
openCypher | Gráfico do Spanner |
---|---|
Nó | Node |
Edge | Edge |
Caminho | Caminho |
Tipo de propriedade
openCypher | Gráfico do Spanner |
---|---|
INT |
INT64 |
FLOAT |
FLOAT64 |
STRING |
STRING |
BOOLEAN |
BOOL |
LIST Uma lista homogénea de tipos simples. Por exemplo, Lista de INT , Lista de STRING .Não pode misturar INT e STRING numa única lista. |
ARRAY |
Tipo composto
openCypher | Gráfico do Spanner |
---|---|
LIST |
ARRAY ou JSON |
MAP |
STRUCT ou JSON |
O Spanner Graph não suporta listas heterogéneas de diferentes tipos nem mapas de uma lista de chaves dinâmicas e tipos de valores de elementos heterogéneos. Use JSON para estes exemplos de utilização.
Coerção de tipo
openCypher | Gráfico do Spanner |
---|---|
INT -> FLOAT |
Compatível. |
Para mais informações sobre as regras de conversão de tipos, consulte o artigo Regras de conversão no GoogleSQL.
Funções e expressões
Além das funções e expressões de gráficos, o Spanner Graph também suporta todas as funções e expressões incorporadas do GoogleSQL.
Esta secção apresenta as funções e as expressões openCypher, bem como os respetivos equivalentes no Spanner Graph.
Funções e expressões de tipo estrutural
Tipo | função ou expressão openCypher |
Função ou expressão do gráfico do Spanner |
|
---|---|---|---|
Nó e extremidade |
exists(n.prop) |
PROPERTY_EXISTS(n, prop) |
|
id (devolve um número inteiro) |
Não suportado. | ||
properties |
TO_JSON |
||
keys (nomes de tipos de propriedades, mas não valores de propriedades) |
PROPERTY_NAMES |
||
labels |
LABELS |
||
Edge | endNode |
Não suportado. | |
startNode |
Não suportado. | ||
type |
LABELS |
||
Caminho | length |
Não suportado. | |
nodes |
Não suportado. | ||
relationships |
Não suportado. | ||
Nó e aresta | .
|
. |
|
[]
|
Não suportado. | ||
Padrão como expressão | size(pattern) |
Não suportado. Use uma subconsulta da seguinte forma
|
Funções e expressões do tipo de propriedade
Tipo | função ou expressão openCypher |
Função ou expressão do gráfico do Spanner |
|
---|---|---|---|
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 |
Não suportado. | ||
sum |
SUM |
||
Lista | range |
GENERATE_ARRAY |
|
reverse |
ARRAY_REVERSE |
||
tail |
O Spanner Graph não suporta tail .Em alternativa, use ARRAY_SLICE e ARRAY_LENGTH . |
||
Matemático | 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ático | + |
+ |
|
- |
- |
||
* |
* |
||
/ |
/ |
||
% |
MOD |
||
^ |
POW |
||
Comparação | = |
= |
|
<> |
<> |
||
< |
< |
||
> |
> |
||
<= |
<= |
||
>= |
>= |
||
IS [NOT] NULL |
IS [NOT] NULL |
||
Cadeia de comparação
|
O Spanner Graph não suporta uma cadeia de comparação. Isto é equivalente a comparações conjuntas com AND . Por exemplo:
|
||
Booleano | AND |
AND |
|
OR |
OR |
||
XOR |
O Spanner Graph
não suporta XOR . Escreva a consulta com a funcionalidade <> .Por exemplo:
|
||
NOT |
NOT |
||
String | STARTS WITH |
STARTS_WITH |
|
ENDS WITH |
ENDS_WITH |
||
CONTAINS |
REGEXP_CONTAINS |
||
+ |
CONCAT |
||
Lista | + |
ARRAY_CONCAT |
|
IN |
ARRAY_INCLUDES |
||
[] |
[] |
Outras expressões
openCypher | Gráfico do Spanner |
---|---|
Expressão case | Compatível. |
Subconsulta Exists | Compatível. |
Projeção de mapa | Não suportado. Os tipos STRUCT oferecem funcionalidades semelhantes. |
Compreensão da lista | Não suportado.GENERATE_ARRAY e ARRAY_TRANSFORM abrangem a maioria dos exemplos de utilização. |
Parâmetro de consulta
As consultas seguintes mostram a diferença entre a utilização de parâmetros em openCypher e no Spanner Graph.
openCypher | Gráfico do Spanner | |
---|---|---|
Parâmetro | MATCH (n:Person) WHERE n.id = $id RETURN n.name; |
GRAPH FinGraph MATCH (n:Person) WHERE n.id = @id RETURN n.name; |
Mutação
O Spanner Graph usa o GoogleSQL DML para alterar as tabelas de entrada de nós e arestas. Para mais informações, consulte o artigo Insira, atualize ou elimine dados do Spanner Graph.
Crie nós e arestas
openCypher | Gráfico do Spanner | |
---|---|---|
Crie nós e arestas | CREATE (:Person {id: 100, name: 'John'}); CREATE (:Account {id: 1000, is_blocked: FALSE}); |
INSERT INTO Person (id, name) VALUES (100, "John"); |
Crie nós e arestas com os resultados da 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 ); |
No Spanner Graph, as etiquetas são atribuídas estaticamente de acordo com a declaração DDL.CREATE PROPERTY GRAPH
Atualize o nó e o limite
openCypher | Gráfico do Spanner | |
---|---|---|
Atualize propriedades | MATCH (p:Person {id: 100}) SET p.country = 'United States'; |
UPDATE Person AS p SET p.country = 'United States' WHERE p.id = 100; |
Para atualizar as etiquetas do Spanner Graph, consulte o artigo Crie, atualize ou elimine um esquema do Spanner Graph.
Unir nó e aresta
openCypher | Gráfico do Spanner | |
---|---|---|
Inserir novo elemento ou atualizar propriedades | MERGE (p:Person {id: 100, country: 'United States'}); |
INSERT OR UPDATE INTO Person (id, country) VALUES (100, 'United States'); |
Elimine o nó e a aresta
A eliminação de arestas é igual à eliminação da tabela de entrada.
openCypher | Gráfico do Spanner | |
---|---|---|
Elimine nós e arestas | MATCH (p:Person {id:100}), (a:Account {id:1000}) DELETE (p)-[:Owns]->(a); |
DELETE PersonOwnAccount WHERE id = 100 AND account_id = 1000; |
A eliminação de nós requer o processamento de potenciais arestas pendentes. Quando DELETE CASCADE
é especificado, DELETE
remove as arestas associadas de nós como DETACH DELETE
no openCypher. Para mais informações, consulte a vista geral do esquema do Spanner.
openCypher | Gráfico do Spanner | |
---|---|---|
Elimine nós e arestas associadas | DETACH DELETE (:Account {id: 1000}); |
DELETE Account WHERE id = 1000; |
Devolver resultados de mutação
openCypher | Gráfico do Spanner | |
---|---|---|
Devolver resultados após a inserção ou a atualização | 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; |
Devolva resultados após a eliminação | DELETE (p:Person {id: 100}) RETURN p.country; |
DELETE FROM Person WHERE id = 100 THEN RETURN country; |