Referência do gráfico do Spanner para utilizadores do openCypher

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 path

Quando 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 é repetir t1 duas vezes.
  • Por predefinição, a consulta do gráfico do Spanner devolve um caminho válido.

Gráfico de exemplo

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:
src_id dst_id
16 20

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
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 .
property reference
.
[]
dynamic property reference
MATCH (n)
RETURN n[n.name]

Não suportado.
Padrão como expressão size(pattern) Não suportado. Use uma subconsulta da seguinte forma
VALUE {
  MATCH pattern
  RETURN COUNT(*) AS count;
}

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
a < b < c

O Spanner Graph não suporta uma cadeia de comparação. Isto é equivalente a comparações conjuntas com AND.
Por exemplo:

      a < b AND b < C
      

Booleano AND AND
OR OR
XOR
O Spanner Graph não suporta XOR. Escreva a consulta com a funcionalidade <>.

Por exemplo:
      boolean_1 <> boolean_2
      

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});

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());
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;

O que se segue?