Referência do Spanner Graph para usuários do openCypher

Este documento compara o openCypher e o Spanner Graph das seguintes maneiras:

  • Terminologia
  • Modelo de dados
  • Esquema
  • Consulta
  • Mutação

Este documento pressupõe que você já conheça o openCypher v9.

Antes de começar

Configure e consulte o Spanner Graph usando o console do .

Terminologia

openCypher Spanner Graph
nós nós
relacionamentos bordas
rótulos de nó rótulos de nó
tipos de relacionamento rótulos de borda
cláusulas O Spanner Graph usa o termo statement para uma unidade completa de execução e clause para um modificador de instruções.

Por exemplo, MATCH é uma instrução, enquanto WHERE é uma cláusula.
exclusividade da relação

O openCypher não retorna resultados com arestas repetidas em uma única correspondência.
Caminho TRAIL

Quando a exclusividade é desejada no Spanner Graph, use o modo TRAIL para retornar bordas exclusivas em uma única correspondência.

Compliance com padrões

O Spanner Graph adota a ISO Graph Query Language (GQL) e os padrões SQL/Property Graph Queries (SQL/PGQ).

Modelo de dados

O Spanner Graph e o openCypher adotam o modelo de dados de gráfico de propriedades com algumas diferenças.

openCypher Spanner Graph
Cada relacionamento tem exatamente um tipo.
Tanto os nós quanto as arestas têm um ou mais rótulos.

Esquema

openCypher Spanner Graph
Um gráfico não tem um esquema predefinido. Um esquema de gráfico precisa ser definido explicitamente usando a instrução CREATE PROPERTY GRAPH.
Os rótulos são definidos estaticamente no esquema. Para atualizar os rótulos, é necessário atualizar o esquema.
Para mais informações, consulte Criar, atualizar ou excluir um esquema do Spanner Graph.

Consulta

Os recursos de consulta do Spanner Graph são semelhantes aos do openCypher. As diferenças entre o Spanner Graph e o openCypher são descritas nesta seção.

Especificar o gráfico

No openCypher, há um gráfico padrão, e as consultas operam no gráfico padrão. No Spanner Graph, é possível definir mais de um gráfico, e uma consulta precisa começar com a cláusula GRAPH para especificar o gráfico a ser consultado. Exemplo:

   GRAPH FinGraph
   MATCH (p:Person)
   RETURN p.name
   ORDER BY p.name
   LIMIT 1;

Para mais informações, consulte a sintaxe de consulta de gráfico.

Correspondência de padrões de gráfico

O Spanner Graph oferece suporte a recursos de correspondência de padrões de gráficos semelhantes ao openCypher. As diferenças são explicadas nas seções a seguir.

Exclusividade da relação e modo TRAIL

O openCypher não retorna resultados com arestas repetidas em uma única correspondência. Isso é chamado de exclusividade de relacionamento no openCypher. No Spanner Graph, as arestas repetidas são retornadas por padrão. Quando a exclusividade for desejada, use o modo TRAIL para garantir que não haja bordas repetidas na correspondência única. Para semânticas detalhadas de TRAIL e outros modos de caminho diferentes, consulte Modo de caminho.

O exemplo a seguir mostra como os resultados de uma consulta mudam com o modo TRAIL:

  • As consultas do modo TRAIL do openCypher e do Spanner Graph retornam resultados vazios porque o único caminho possível é repetir t1 duas vezes.
  • Por padrão, a consulta do Spanner Graph retorna um caminho válido.

Exemplo de gráfico

openCypher Spanner Graph (modo TRAIL) Spanner Graph (modo padrão)
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

Retornar elementos do gráfico como resultados da 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;

No Spanner Graph, os resultados da consulta não retornam elementos de gráfico. Use a função TO_JSON para retornar 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 é chamada de quantificação de caminho no Spanner Graph. A quantificação de caminho usa uma sintaxe diferente, conforme mostrado no exemplo abaixo. Para mais informações, consulte Padrão de caminho quantificado.

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;
      

Padrão de comprimento variável: lista de elementos

O Spanner Graph permite acessar diretamente as variáveis usadas nas quantificações de caminho. No exemplo abaixo, e no Spanner Graph é o mesmo que edges(p) no 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;
     

Caminho mais curto

O openCypher tem duas funções integradas para encontrar o caminho mais curto entre nós: shortestPath e allShortestPath.

  • shortestPath encontra um único caminho mais curto entre os nós.
  • allShortestPath encontra todos os caminhos mais curtos entre os 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 tem suporte no 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;
      

Instruções e cláusulas

A tabela a seguir lista as cláusulas openCypher e indica se elas têm suporte ou não no Spanner Graph.

openCypher Spanner Graph
MATCH Compatível. Para mais informações, consulte Correspondência de padrões de gráfico.
OPTIONAL MATCH Compatível. Para mais informações, consulte Correspondência de padrões de gráfico.
RETURN / WITH Compatível. Para mais informações, consulte a instrução RETURN e a instrução WITH.
O Spanner Graph exige a criação explícita de aliases para expressões complicadas.

Compatível.
GRAPH FinGraph
MATCH (p:Person)
RETURN EXTRACT(YEAR FROM p.birthday) AS birthYear;

Não é compatível.
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 instrução ORDER BY.
SKIP / LIMIT Compatível. Para mais informações, consulte a instrução SKIP e a instrução LIMIT.

O Spanner Graph exige uma expressão constante para o deslocamento e o limite.

Compatível.
GRAPH FinGraph
MATCH (n:Account)
RETURN n.id
SKIP @offsetParameter
LIMIT 3;

Não é compatível.
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 Consulta de gráfico composto.
UNION ALL Compatível. Para mais informações, consulte Consulta de gráfico composto.
UNWIND Suporte para a instrução FOR.
GRAPH FinGraph
LET arr = [1, 2, 3]
FOR num IN arr
RETURN num;
MANDATORY MATCH Incompatível.
CALL[YIELD...] Incompatível.
CREATE, DELETE, SET, REMOVE, MERGE Para saber mais, consulte a seção Mutação e Inserir, atualizar ou excluir dados no Spanner Graph.

Tipos de dados

O Spanner Graph oferece suporte a todos os tipos de dados do GoogleSQL. Para mais informações, consulte Tipos de dados no GoogleSQL.

As seções a seguir comparam os tipos de dados do openCypher com os tipos de dados do Spanner Graph.

Tipo estrutural

openCypher Spanner Graph
Edge Edge
Caminho Caminho

Tipo de propriedade

openCypher Spanner Graph
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 é possível misturar INT e STRING em uma única lista.
ARRAY

Tipo composto

openCypher Spanner Graph
LIST ARRAY ou JSON
MAP STRUCT ou JSON

O Spanner Graph não oferece suporte a listas heterogêneas de tipos diferentes ou mapas de uma lista de chaves dinâmicas e tipos de valor de elementos heterogêneos. Use JSON para esses casos de uso.

Coerção de tipo

openCypher Spanner Graph
INT -> FLOAT Compatível.

Para mais informações sobre as regras de conversão de tipo, consulte Regras de conversão no GoogleSQL.

Funções e expressões

Além das funções e expressões de gráfico, o Spanner Graph também é compatível com todas as funções e expressões integradas do GoogleSQL.

Esta seção lista funções e expressões do openCypher e os 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 Spanner Graph

Nó e borda
exists(n.prop) PROPERTY_EXISTS(n, prop)
id (retorna um número inteiro) Incompatível.
properties TO_JSON
keys
(nomes de tipos de propriedade, mas não valores de propriedade)
PROPERTY_NAMES
labels LABELS
Edge endNode Incompatível.
startNode Incompatível.
type LABELS
Caminho length Incompatível.
nodes Incompatível.
relationships Incompatível.
Nó e borda .
property reference
.
[]
dynamic property reference
MATCH (n)
RETURN n[n.name]

Incompatível.
Padrão como expressão size(pattern) Incompatível. Use uma subconsulta como esta
VALUE {
  MATCH pattern
  RETURN COUNT(*) AS count;
}

Funções e expressões de tipo de propriedade

Tipo Função ou expressão openCypher
Função ou expressão
do 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 Incompatível.
sum SUM
Lista range GENERATE_ARRAY
reverse ARRAY_REVERSE
tail O Spanner Graph não oferece suporte a tail.
Use ARRAY_SLICE e ARRAY_LENGTH.
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
Comparação = =
<> <>
< <
> >
<= <=
>= >=
IS [NOT] NULL IS [NOT] NULL
Cadeia de comparação
a < b < c

O Spanner Graph não oferece suporte a uma cadeia de comparação. Isso é equivalente a comparações combinadas com AND.
Exemplo:

      a < b AND b < C
      

Booleano AND AND
OR OR
XOR
O Spanner Graph não oferece suporte a XOR. Crie a consulta com <>.

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 Spanner Graph
Expressão de caso Compatível.
Subconsulta EXISTS Compatível.
Projeção do mapa Incompatível.Os tipos
STRUCT oferecem funcionalidades semelhantes.
Compreensão de lista Incompatível.
GENERATE_ARRAY e ARRAY_TRANSFORM abrangem a maioria dos casos de uso.

Parâmetro de consulta

As consultas a seguir mostram a diferença entre o uso de parâmetros no openCypher e no 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;

Mutação

O Spanner Graph usa a DML do GoogleSQL para modificar as tabelas de entrada de arestas e nós. Para mais informações, consulte Inserir, atualizar ou excluir dados do Spanner Graph.

Criar nó e aresta

openCypher Spanner Graph
Criar 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());
Criar nós e arestas com resultados de 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, os rótulos são atribuídos estaticamente de acordo com a instrução DDL CREATE PROPERTY GRAPH.

Atualizar nó e borda

openCypher Spanner Graph
Atualizar 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 os rótulos do Spanner Graph, consulte Criar, atualizar ou excluir um esquema do Spanner Graph.

Mesclar nó e borda

openCypher Spanner Graph
Inserir um novo elemento ou atualizar propriedades
MERGE (p:Person {id: 100, country: 'United States'});
INSERT OR UPDATE INTO Person
(id, country)
VALUES (100, 'United States');

Excluir nó e borda

Excluir arestas é o mesmo que excluir a tabela de entrada.

openCypher Spanner Graph
Excluir 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 exclusão de nós exige o tratamento de possíveis bordas soltas. Quando DELETE CASCADE é especificado, DELETE remove as arestas associadas de nós como DETACH DELETE no openCypher. Para mais informações, consulte a visão geral do esquema do Spanner.

openCypher Spanner Graph
Excluir nós e arestas associadas
DETACH DELETE (:Account {id: 1000});
DELETE Account
WHERE id = 1000;

Retornar resultados de mutação

openCypher Spanner Graph
Retorne os resultados após a inserção ou 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;
Retornar resultados após a exclusão
DELETE (p:Person {id: 100})
RETURN p.country;
DELETE FROM Person
WHERE id = 100
THEN RETURN country;

A seguir