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)
);
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 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)
);
Correção recomendada
É 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)
);
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. 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)
);
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)
);
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;
Correção recomendada
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;
Correção recomendada
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;
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. 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;
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 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 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
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);
Correção recomendada
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);
Correção recomendada
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;
Correção recomendada
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;
Correção recomendada
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.