Resolver problemas do Spanner Graph

Este documento descreve os erros que você pode encontrar ao trabalhar com o Spanner Graph. Exemplos de erros e correções recomendadas também são fornecidas.

Se você precisar de mais suporte depois de consultar este guia de solução de problemas, consulte Receber suporte.

Erros de esquema

Os resultados do esquema são baseados no conjunto de dados usado em Configurar e consultar o Spanner Graph.

As chaves de elementos precisam 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 exclusivo nas colunas de chave de elemento e redefina as colunas de chave de elemento com base nas chaves primárias da tabela de origem.

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

Como alternativa, crie um índice exclusivo nas colunas de chave de elemento.

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 precisam 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 da borda.

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 do rótulo precisa 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)
  );

É necessário usar o mesmo conjunto de nomes de propriedades no mesmo rótulo.

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 precisa 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 precisa ser consistente na mesma definição de 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)
  );

Também é possível atribuir 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 da consulta são baseados no conjunto de dados usado na etapa Configurar e consultar Gráfico do Spanner (em inglês).

Elementos de gráfico não podem ser retornados como resultados de 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;

A especificação da propriedade não pode ser usada 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;

Você pode usar uma das correções sugeridas a seguir.

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 instruçõ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

A referência a variáveis definidas em instruções anteriores não é permitida no padrão MATCH. Na consulta de gráfico, os nomes definidos pelas instruções anteriores podem ser usada apenas 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 correlacionado

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 não podem ser redefinidos em uma subconsulta de gráfico interno. Este cenário pode ser interpretado como referência ao mesmo gráfico como escopo externo ou como vinculação a novos elementos do gráfico, o nome do escopo 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 consulta

Os resultados da consulta são baseados no conjunto de dados usado na etapa Configurar e consultar Gráfico do Spanner (em inglês).

WHERE e FILTER diferentes resultam em saídas diferentes

Descrição

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

No primeiro exemplo, a cláusula WHERE adiciona outras restrições aos padrões descritos na instrução OPTIONAL MATCH. Não é um filtro depois que a correspondência é concluída.

No segundo exemplo, a instrução FILTER é um filtro após a correspondência ser concluída.

Exemplo de problema

Os exemplos a seguir têm saídas 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 null

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.

Variáveis diferentes propagadas em instruções resultam em saídas diferentes

Descrição

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

No exemplo 1, não há nó Account em que id seja 7 e 16. Como resultado, os resultados vazios são retornados.

No exemplo 2, o nome n não é retornado da instrução anterior. (somente id é retornado). Assim, o segundo MATCH encontra o nó Account cujo id é 16.

Exemplo de problema

Os exemplos a seguir têm saídas diferentes porque variáveis diferentes são propagdas em instruçõ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 será ignorado se houver uma instrução subsequente que não seja LIMIT

Descrição

Na linguagem de consulta do gráfico, a instrução ORDER BY é ignorada, a menos que uma das o seguinte é verdadeiro:

  • ORDER BY é a última instrução.
  • ORDER BY é imediatamente seguido por LIMIT.

No Exemplo 1, LIMIT não segue imediatamente ORDER BY. O LIMIT final é separado. Isso significa que ORDER BY é ignorado pelo mecanismo.

No exemplo 2, ORDER BY é aplicável porque LIMIT vem imediatamente ORDER BY:

Exemplo de problema

Os exemplos a seguir têm saídas diferentes porque a instruçã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 borda resultam em diferentes saídas

Descrição

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

No Exemplo 1, uma aresta Transfers de Account(id=x) a Account(id=y) pode ser combinada duas vezes, conforme mostrado abaixo:

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

Há apenas uma correspondência no Exemplo 2, em que n=Account(id=x) e m=Account(id=y).

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

Exemplo de problema

Os exemplos a seguir têm saídas diferentes porque são usados padrões de borda 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 de mutação são baseados no conjunto de dados usado em Configurar e consultar o Spanner Graph.

O nó de origem ausente 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 borda AccountTransferAccount está INTERLEAVED INTO PARENT Account node tabela. Para criar a borda Transfer, o nó Account pai precisa já existem.

Exemplo de erro

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

Crie o nó Account inicial primeiro e, em seguida, crie a borda Transfer.

O nó de destino ausente 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 se refere a Accounttable por meio de uma ForeignKey chamado FK_TransferTo. Para criar a borda Transfer, a o nó Account referenciado já precisa existir.

Exemplo de erro

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

Crie o nó da conta secundário primeiro e, em seguida, crie a borda Transfer.

A borda de saída órfã viola o relacionamento pai-filho

Mensagem de erro

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

Descrição

A tabela de borda AccountTransferAccount está INTERLEAVED INTO PARENT Account nó tabela e o nó Account a ser excluído ainda tem bordas de saída anexadas a reimplantá-lo.

Exemplo de erro

DELETE FROM Account WHERE id = 1;

Primeiro, exclua todas as bordas de saída Transfer e, depois, exclua o nó Account. Como alternativa, defina ON DELETE CASCADE para INTERLEAVE e faça com que o Spanner exclua automaticamente essas arestas.

A borda de entrada órfã viola a relação pai-filho

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 borda AccountTransferAccount refere-se à tabela de nós Account por meio de uma ForeignKey, e o nó Account a ser excluído ainda tem bordas de entrada. anexada a ele.

Exemplo de erro

DELETE FROM Account WHERE id = 1;

Primeiro, exclua todas as bordas de Transfer de entrada e, depois, exclua o nó Account. Como alternativa, defina ON DELETE CASCADE para ForeignKey e faça com que o Spanner os exclua automaticamente pontas.