Resolva problemas com o Spanner Graph

Este documento descreve os erros que pode encontrar quando trabalha com o Spanner Graph. Também são fornecidos exemplos de erros e correções recomendadas.

Se precisar de mais apoio técnico depois de rever este guia de resolução de problemas, consulte a secção Obter apoio técnico.

Erros de esquema

Os resultados do esquema baseiam-se no conjunto de dados usado em Configurar e consultar Spanner Graph.

As chaves de elementos têm de ter uma garantia de exclusividade

Mensagem de erro

Neither the primary keys nor any unique index defined on the property graph element source table `Person` provides the uniqueness guarantee for graph element `Person` belonging to the graph `FinGraph`. You want to redefine the element key columns (`name`) based on the source table's primary keys, or create a unique index on the element's key columns.

Exemplo de erro

CREATE OR REPLACE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Person KEY (name)
  );

Crie um índice único nas colunas de chaves de elementos e redefina as colunas de chaves de elementos com base nas chaves primárias da tabela de origem.

CREATE OR REPLACE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Person KEY (id)
  );

Em alternativa, crie um índice único nas colunas de chaves de elementos.

CREATE UNIQUE INDEX PersonNameIndex ON Person(name);
CREATE OR REPLACE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Person KEY (name)
  );

Os nomes das definições de elementos têm de ser exclusivos

Mensagem de erro

Account is defined more than once; use a unique name.

Exemplo de erro

CREATE OR REPLACE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Account,
    Person
  )
  EDGE TABLES (
    Account
      SOURCE KEY(owner_id) REFERENCES Person
      DESTINATION KEY(account_id) REFERENCES Account
  );

Use um nome exclusivo para a definição de limite.

CREATE OR REPLACE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Account,
    Person
  )
  EDGE TABLES (
    Account AS Owns
      SOURCE KEY(owner_id) REFERENCES Person
      DESTINATION KEY(account_id) REFERENCES Account
  );

A definição de etiqueta tem de ser consistente para as propriedades

Mensagem de erro

The label Entity is defined with different property declarations. There is one instance of this label defined with properties of [id]. Another instance is defined with properties of [name].

Exemplo de erro

CREATE OR REPLACE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Person LABEL Entity PROPERTIES (name),
    Account LABEL Entity PROPERTIES (id)
  );

Tem de usar o mesmo conjunto de nomes de propriedades na mesma etiqueta.

CREATE OR REPLACE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Person LABEL Entity PROPERTIES (id, name),
    Account LABEL Entity PROPERTIES (id, name)
  );

A declaração de propriedade tem de ser consistente para o tipo de propriedade

Mensagem de erro

The property declaration of name has type conflicts. There is an existing declaration of type INT64. There is a conflicting one of type STRING.

Exemplo de erro

CREATE OR REPLACE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Person PROPERTIES (name),
    Account PROPERTIES (id AS name)
  );
CREATE OR REPLACE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Person PROPERTIES (name),
    Account PROPERTIES (CAST(id AS STRING) AS name)
  );

A definição da propriedade não pode ser uma subconsulta

Mensagem de erro

Property value expression of count cannot contain a subquery.

Exemplo de erro

CREATE OR REPLACE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Person PROPERTIES ((SELECT COUNT(*) FROM Person) AS count)
  );

N/A. Esta condição não é permitida.

A definição da propriedade tem de ser consistente na mesma definição do elemento

Mensagem de erro

Property location has more than one definition in the element table Person

Exemplo de erro

CREATE OR REPLACE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Person
      LABEL Person PROPERTIES (country AS location)
      LABEL Entity PROPERTIES (city AS location)
  );

Use a mesma definição de propriedade.

CREATE OR REPLACE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Person
      LABEL Person PROPERTIES (country AS location)
      LABEL Entity PROPERTIES (country AS location)
  );

Em alternativa, atribua nomes de propriedades diferentes.

CREATE OR REPLACE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Person
      LABEL Person PROPERTIES (country AS location)
      LABEL Entity PROPERTIES (city AS city)
  );

Erros de consulta

Os resultados das consultas baseiam-se no conjunto de dados usado em Configurar e consultar o gráfico do Spanner.

Não é possível devolver elementos do gráfico como resultados da consulta

Mensagem de erro

Returning expressions of type GRAPH_ELEMENT is not allowed

Exemplo de erro

GRAPH FinGraph
MATCH (n:Account)
RETURN n;
GRAPH FinGraph
MATCH (n:Account)
RETURN TO_JSON(n) AS n;

Não é possível usar a especificação de propriedade com a cláusula WHERE

Mensagem de erro

WHERE clause cannot be used together with property specification

Exemplo de erro

GRAPH FinGraph
MATCH (n:Account {id: 1} WHERE n.is_blocked)
RETURN n.id;

Pode usar uma das seguintes correções sugeridas.

GRAPH FinGraph
MATCH (n:Account {id: 1})
WHERE n.is_blocked
RETURN n.id;
GRAPH FinGraph
MATCH (n:Account WHERE n.id = 1 AND n.is_blocked )
RETURN n.id;
GRAPH FinGraph
MATCH (n:Account {id: 1, is_blocked: TRUE})
RETURN n.id;

Não é permitida a referência a variáveis definidas em declarações anteriores

Mensagem de erro

Name 'account_id', defined in the previous statement, can only be referenced in the outermost WHERE clause of MATCH

Descrição

Não é permitida a referência a variáveis definidas em declarações anteriores no padrão MATCH. Na consulta de gráfico, os nomes definidos por declarações anteriores só podem ser usados na cláusula WHERE mais externa de MATCH.

Exemplo de erro
GRAPH FinGraph
LET account_id = 1
MATCH (n:Account {id: account_id})
RETURN n.id;
GRAPH FinGraph
LET account_id = 1
MATCH (n:Account)
WHERE n.id = account_id
RETURN n.id;

Não é permitido redefinir uma variável de gráfico correlacionada

Mensagem de erro

The name account is already defined; redefining graph element variables in a subquery is not allowed. To refer to the same graph element, use a different name and add an explicit filter that checks for equality.

Descrição

Na consulta de gráfico, os nomes dos elementos do gráfico não podem ser redefinidos numa subconsulta de gráfico interno. Este cenário pode ser interpretado como uma referência ao mesmo elemento do gráfico que o âmbito externo ou como uma associação a novos elementos do gráfico, que obscurecem o nome do âmbito externo. A redefinição não é permitida.

Exemplo de erro

GRAPH FinGraph
MATCH (account:Account)
RETURN account.id AS account_id, VALUE {
  MATCH (account:Account)-[transfer:Transfers]->(:Account)
  RETURN SUM(transfer.amount) AS total_transfer
} AS total_transfer;
GRAPH FinGraph
MATCH (account:Account)
RETURN account.id AS account_id, VALUE {
  MATCH (a:Account)-[transfer:Transfers]->(:Account)
  WHERE a = account
  RETURN SUM(transfer.amount) AS total_transfer
} AS total_transfer;

Problemas de semântica de consultas

Os resultados das consultas baseiam-se no conjunto de dados usado em Configurar e consultar o gráfico do Spanner.

WHERE e FILTER diferentes resultam em resultados diferentes

Descrição

FILTER é uma declaração; WHERE é uma cláusula, como parte das declarações MATCH e OPTIONAL MATCH.

No primeiro exemplo, a cláusula WHERE adiciona restrições adicionais aos padrões descritos na declaração OPTIONAL MATCH. Este não é um filtro após a conclusão da correspondência.

No segundo exemplo, a declaração FILTER é um filtro após a conclusão da correspondência.

Exemplo de problema

Os exemplos seguintes têm resultados diferentes porque WHERE e FILTER são diferentes.

Exemplo 1

GRAPH FinGraph
MATCH (n:Account {id: 7})
OPTIONAL MATCH (m:Account)
WHERE FALSE
RETURN n.id AS n_id, m.id AS m_id;
n_id m_id
7 nulo

Exemplo 2

GRAPH FinGraph
MATCH (n:Account {id: 7})
OPTIONAL MATCH (m:Account)
FILTER FALSE
RETURN n.id AS n_id, m.id AS m_id;

Resultados vazios.

As diferentes variáveis propagadas nas declarações resultam em diferentes resultados

Descrição

Na linguagem de consulta de grafos, uma variável declarada várias vezes refere-se ao mesmo elemento do grafo em todas as ocorrências.

No exemplo 1, não existe nenhum nó Account cujo id seja 7 e 16. Como resultado, são devolvidos resultados vazios.

No exemplo 2, o nome n não é devolvido pela declaração anterior (apenas id é devolvido). Assim, o segundo MATCH encontra o nó Account cujo id é 16.

Exemplo de problema

Os exemplos seguintes têm resultados diferentes porque são propagadas diferentes variáveis nas declarações.

Exemplo 1

GRAPH FinGraph
MATCH (n:Account {id: 7})
RETURN n

NEXT

MATCH (n:Account {id: 16})
RETURN n.id AS n_id;

Resultados vazios.

Exemplo 2

GRAPH FinGraph
MATCH (n:Account {id: 7})
RETURN n.id AS id

NEXT

MATCH (n:Account {id: 16})
RETURN n.id AS n_id;
n_id
16

ORDER BY é ignorado se existir uma declaração subsequente que não seja LIMIT

Descrição

Na linguagem de consulta de grafos, a declaração ORDER BY é ignorada, a menos que uma das seguintes afirmações seja verdadeira:

  • ORDER BY é o último extrato.
  • ORDER BY é imediatamente seguido por LIMIT.

No exemplo 1, LIMIT não segue imediatamente ORDER BY; o LIMIT final está separado. Isto significa que ORDER BY é ignorado pelo motor.

No exemplo 2, ORDER BY é aplicável porque LIMIT segue-se imediatamente a ORDER BY.

Exemplo de problema

Os exemplos seguintes têm resultados diferentes porque a declaração ORDER BY é ignorada quando é usada sem LIMIT no exemplo 1.

Exemplo 1

GRAPH FinGraph
MATCH (n:Account)
ORDER BY n.id DESC
RETURN n.id
LIMIT 3;
n_id
7

Exemplo 2

GRAPH FinGraph
MATCH (n:Account)
ORDER BY n.id DESC
LIMIT 3
RETURN n.id;
n_id
20

Diferentes padrões de contornos resultam em diferentes resultados

Descrição

No conjunto de dados usado no exemplo de erro, o padrão de aresta de direção ANY corresponde a cada aresta Transfers no gráfico duas vezes.

No exemplo 1, uma aresta Transfers de Account(id=x) para Account(id=y) pode ter correspondência duas vezes, da seguinte forma:

  • n= Account(id=x), m= Account(id=y)
  • n= Account(id=y), m= Account(id=x)

Só existe uma correspondência no exemplo 2, em que n=Account(id=x) e m=Account(id=y).

Como resultado, a consulta no Exemplo 1 devolve 10 e a consulta no Exemplo 2 devolve 5.

Exemplo de problema

Os exemplos seguintes têm resultados diferentes porque são usados padrões de arestas diferentes.

Exemplo 1

GRAPH FinGraph
MATCH (n:Account)-[:Transfers]-(m:Account)
RETURN COUNT(*) AS num_transfer_edges;
num_transfer_edges
10

Exemplo 2

GRAPH FinGraph
MATCH (n:Account)-[:Transfers]->(m:Account)
RETURN COUNT(*) AS num_transfer_edges;
num_transfer_edges
5

Erros de mutação

Os resultados da mutação baseiam-se no conjunto de dados usado em Configurar e consultar o gráfico do Spanner.

O nó de origem em falta viola a restrição de chave externa

Mensagem de erro

Parent row for row [...] in table AccountTransferAccount is missing. Row cannot be written.

Descrição

A tabela de arestas AccountTransferAccount é uma INTERLEAVED INTO PARENT Account node tabela. Para criar o limite Transfer, o respetivo nó Account principal tem de já existir.

Exemplo de erro

INSERT INTO AccountTransferAccount (id, to_id, create_time, amount)
VALUES (100, 1, PENDING_COMMIT_TIMESTAMP(), 200);

Crie primeiro o nó Account principal e, em seguida, crie a aresta Transfer.

O nó de destino em falta viola a restrição de chave externa

Mensagem de erro

Foreign key constraint FK_TransferTo is violated on table AccountTransferAccount. Cannot find referenced values in Account(id)

Descrição

A tabela AccountTransferAccount refere-se a Accounttable através de um ForeignKey denominado FK_TransferTo. Para criar a aresta Transfer, o nó Account de seguimento referenciado já tem de existir.

Exemplo de erro

INSERT INTO AccountTransferAccount (id, to_id, create_time, amount)
VALUES (1, 100, PENDING_COMMIT_TIMESTAMP(), 200);

Primeiro, crie o nó da conta final e, em seguida, crie a aresta Transfer.

O limite de saída órfão viola a relação principal-secundário

Mensagem de erro

Integrity constraint violation during DELETE/REPLACE. Found child row [...] in table AccountTransferAccount

Descrição

A tabela de arestas AccountTransferAccount é uma tabela de nós INTERLEAVED INTO PARENT Account e o nó a eliminar ainda tem arestas de saída anexadas.Account

Exemplo de erro

DELETE FROM Account WHERE id = 1;

Elimine primeiro todas as arestas Transfer de saída e, em seguida, elimine o nó Account. Em alternativa, defina ON DELETE CASCADE para INTERLEAVE e faça com que o Spanner elimine automaticamente essas arestas.

O limite de entrada órfão viola a relação principal-secundário

Mensagem de erro

Foreign key constraint violation when deleting or updating referenced row(s): referencing row(s) found in table AccountTransferAccount

Descrição

A tabela de arestas AccountTransferAccount refere-se à tabela de nós Account através de ForeignKey e o nó Account a eliminar ainda tem arestas de entrada anexadas.

Exemplo de erro

DELETE FROM Account WHERE id = 1;

Elimine primeiro todas as arestas Transfer de entrada e, em seguida, elimine o nó Account. Em alternativa, defina ON DELETE CASCADE para ForeignKey e faça com que o Spanner elimine automaticamente essas arestas.