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