Este documento descreve os erros que podem ocorrer ao trabalhar com o Spanner Graph. Exemplos de erros e correções recomendadas também são fornecidos.
Se você precisar de mais suporte após 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)
);
Correção recomendada
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
);
Correção recomendada
Use um nome exclusivo para a definição de 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)
);
Correção recomendada
É preciso usar o mesmo conjunto de nomes de propriedade 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)
);
Correção recomendada
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)
);
Correção recomendada
N/A. Essa condição não é permitida.
A definição da propriedade precisa 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)
);
Correção recomendada
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)
);
Como 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 da consulta são baseados no conjunto de dados usado em Configurar e consultar o Spanner Graph.
Os elementos do 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;
Correção recomendada
GRAPH FinGraph
MATCH (n:Account)
RETURN TO_JSON(n) AS n;
A especificação de 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;
Correção recomendada
Use 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 por instruçõ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;
Correção recomendada
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. Esse cenário pode ser interpretado como uma referência ao mesmo elemento do gráfico que o escopo externo ou como vinculação a novos elementos do gráfico, que ocultam 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;
Correção recomendada
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 em Configurar e consultar o Spanner Graph.
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
e 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 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 | 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á um 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
(apenas 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 de gráfico, a instrução ORDER BY
é ignorada, a menos que uma das
seguintes condições seja verdadeira:
ORDER BY
é a última instrução.ORDER BY
é seguida imediatamente porLIMIT
.
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
segue 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 saídas diferentes
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)
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
é a tabela INTERLEAVED INTO PARENT Account node
. Para criar a aresta Transfer
, o nó Account
pai precisa
já existir.
Exemplo de erro
INSERT INTO AccountTransferAccount (id, to_id, create_time, amount)
VALUES (100, 1, PENDING_COMMIT_TIMESTAMP(), 200);
Correção recomendada
Crie primeiro o nó Account
principal e depois a aresta 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
chamada FK_TransferTo
. Para criar a aresta Transfer
, o
nó Account
de cauda referenciado já precisa existir.
Exemplo de erro
INSERT INTO AccountTransferAccount (id, to_id, create_time, amount)
VALUES (1, 100, PENDING_COMMIT_TIMESTAMP(), 200);
Correção recomendada
Crie primeiro o nó da conta de cauda e depois a aresta Transfer
.
A borda de saída órfã viola a relação pai-filho
Mensagem de erro
Integrity constraint violation during DELETE/REPLACE. Found child row [...] in
table AccountTransferAccount
Descrição
A tabela de arestas AccountTransferAccount
é a tabela de nós INTERLEAVED INTO PARENT
Account
,
e o nó Account
a ser excluído ainda tem arestas de saída anexadas a
ele.
Exemplo de erro
DELETE FROM Account WHERE id = 1;
Correção recomendada
Exclua todas as arestas Transfer
de saída primeiro e, em seguida, 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 arestas AccountTransferAccount
se refere à tabela de nós Account
por meio de um
ForeignKey
, e o nó Account
a ser excluído ainda tem arestas de entrada
anexadas a ele.
Exemplo de erro
DELETE FROM Account WHERE id = 1;
Correção recomendada
Exclua todas as arestas Transfer
de entrada primeiro e, em seguida, exclua o nó Account
.
Como alternativa, defina ON DELETE CASCADE
para ForeignKey
e faça com que o Spanner exclua automaticamente essas
arestas.