Ce document décrit les erreurs que vous pouvez rencontrer lorsque vous travaillez avec Spanner Graph. Des exemples d'erreurs et des corrections recommandées sont également fournis.
Si vous avez besoin d'une aide supplémentaire après avoir consulté ce guide de dépannage, consultez la page Obtenir de l'aide.
Erreurs de schéma
Les résultats du schéma sont basés sur l'ensemble de données utilisé dans Configurer et interroger Spanner Graph.
Les clés d'élément doivent être uniques
Message d'erreur
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.
Exemple d'erreur
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Person KEY (name)
);
Correction recommandée
Créez un indice unique sur les colonnes de clé d'élément et redéfinissez les colonnes de clé d'élément en fonction des clés primaires de la table source.
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Person KEY (id)
);
Vous pouvez également créer un index unique sur les colonnes de clé d'élément.
CREATE UNIQUE INDEX PersonNameIndex ON Person(name);
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Person KEY (name)
);
Les noms des définitions d'éléments doivent être uniques
Message d'erreur
Account is defined more than once; use a unique name.
Exemple d'erreur
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
);
Correction recommandée
Utilisez un nom unique pour la définition de l'arête.
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
);
La définition des libellés doit être cohérente pour les propriétés
Message d'erreur
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].
Exemple d'erreur
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Person LABEL Entity PROPERTIES (name),
Account LABEL Entity PROPERTIES (id)
);
Correction recommandée
Vous devez utiliser le même ensemble de noms de propriétés sous le même libellé.
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Person LABEL Entity PROPERTIES (id, name),
Account LABEL Entity PROPERTIES (id, name)
);
La déclaration de la propriété doit être cohérente pour le type de propriété
Message d'erreur
The property declaration of name has type conflicts. There is an existing
declaration of type INT64. There is a conflicting one of type STRING.
Exemple d'erreur
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Person PROPERTIES (name),
Account PROPERTIES (id AS name)
);
Correction recommandée
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Person PROPERTIES (name),
Account PROPERTIES (CAST(id AS STRING) AS name)
);
La définition de la propriété ne doit pas être une sous-requête
Message d'erreur
Property value expression of count cannot contain a subquery.
Exemple d'erreur
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Person PROPERTIES ((SELECT COUNT(*) FROM Person) AS count)
);
Correction recommandée
N/A. Cette condition n'est pas autorisée.
La définition de la propriété doit être cohérente dans la même définition d'élément.
Message d'erreur
Property location has more than one definition in the element table Person
Exemple d'erreur
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Person
LABEL Person PROPERTIES (country AS location)
LABEL Entity PROPERTIES (city AS location)
);
Correction recommandée
Utilisez la même définition de propriété.
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Person
LABEL Person PROPERTIES (country AS location)
LABEL Entity PROPERTIES (country AS location)
);
Vous pouvez également attribuer des noms de propriété différents.
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Person
LABEL Person PROPERTIES (country AS location)
LABEL Entity PROPERTIES (city AS city)
);
Erreurs de requête
Les résultats de la requête sont basés sur l'ensemble de données utilisé dans Configurer et interroger Spanner Graph.
Les éléments de graphique ne peuvent pas être renvoyés en tant que résultats de requête
Message d'erreur
Returning expressions of type GRAPH_ELEMENT is not allowed
Exemple d'erreur
GRAPH FinGraph
MATCH (n:Account)
RETURN n;
Correction recommandée
GRAPH FinGraph
MATCH (n:Account)
RETURN TO_JSON(n) AS n;
La spécification de propriété ne peut pas être utilisée avec la clause WHERE
Message d'erreur
WHERE clause cannot be used together with property specification
Exemple d'erreur
GRAPH FinGraph
MATCH (n:Account {id: 1} WHERE n.is_blocked)
RETURN n.id;
Correction recommandée
Vous pouvez utiliser l'une des solutions suggérées ci-dessous.
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;
Les références à des variables définies dans des instructions précédentes ne sont pas autorisées.
Message d'erreur
Name 'account_id', defined in the previous statement, can only be referenced in
the outermost WHERE clause of MATCH
Description
Les références aux variables définies dans des instructions précédentes ne sont pas autorisées dans le modèle MATCH
. Dans la requête de graphique, les noms définis par les instructions précédentes ne peuvent être utilisés que dans la clause WHERE
la plus externe de MATCH
.
Exemple d'erreur
GRAPH FinGraph
LET account_id = 1
MATCH (n:Account {id: account_id})
RETURN n.id;
Correction recommandée
GRAPH FinGraph
LET account_id = 1
MATCH (n:Account)
WHERE n.id = account_id
RETURN n.id;
Vous ne pouvez pas redéfinir une variable de graphique corrélée.
Message d'erreur
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.
Description
Dans la requête de graphique, les noms des éléments de graphique ne peuvent pas être redéfinis dans une sous-requête de graphique interne. Ce scénario peut être interprété comme faisant référence au même élément de graphique que le champ d'application externe ou comme une liaison à de nouveaux éléments de graphique, qui masque le nom du champ d'application externe. La redéfinition n'est pas autorisée.
Exemple d'erreur
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;
Correction recommandée
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;
Problèmes de sémantique des requêtes
Les résultats de la requête sont basés sur l'ensemble de données utilisé dans Configurer et interroger Spanner Graph.
Différents WHERE
et FILTER
génèrent des résultats différents
Description
FILTER
est une instruction. WHERE
est une clause, dans les instructions MATCH
et OPTIONAL
MATCH
.
Dans le premier exemple, la clause WHERE
ajoute des contraintes supplémentaires aux modèles décrits dans l'instruction OPTIONAL MATCH
. Il ne s'agit pas d'un filtre une fois la mise en correspondance terminée.
Dans le deuxième exemple, l'instruction FILTER
est un filtre une fois la mise en correspondance terminée.
Exemple de problème
Les exemples suivants ont des sorties différentes, car WHERE
et FILTER
sont différents.
Exemple 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 |
Exemple 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;
Résultats vides.
Différentes variables propagées dans les instructions génèrent des résultats différents
Description
Dans le langage de requête de graphique, une variable déclarée plusieurs fois fait référence au même élément de graphique dans toutes les occurrences.
Dans l'exemple 1, il n'existe aucun nœud Account
dont le id
est à la fois 7
et 16
. Par conséquent, des résultats vides sont renvoyés.
Dans l'exemple 2, le nom n
n'est pas renvoyé à partir de l'instruction précédente (seul id
est renvoyé). Le deuxième MATCH
trouve donc le nœud Account
dont le id
est 16
.
Exemple de problème
Les exemples suivants ont des résultats différents, car différentes variables sont propagées dans les instructions.
Exemple 1
GRAPH FinGraph
MATCH (n:Account {id: 7})
RETURN n
NEXT
MATCH (n:Account {id: 16})
RETURN n.id AS n_id;
Résultats vides.
Exemple 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
est ignoré si une instruction suivante n'est pas LIMIT
.
Description
Dans le langage de requêtes de graphes, l'instruction ORDER BY
est ignorée, sauf si l'une des conditions suivantes est remplie:
ORDER BY
est la dernière instruction.ORDER BY
est immédiatement suivi parLIMIT
.
Dans l'exemple 1, LIMIT
ne suit pas immédiatement ORDER BY
. Le LIMIT
final est séparé. Cela signifie que ORDER BY
est ignoré par le moteur.
Dans l'exemple 2, ORDER BY
est applicable, car LIMIT
suit immédiatement ORDER BY
.
Exemple de problème
Les exemples suivants génèrent des sorties différentes, car l'instruction ORDER BY
est ignorée lorsqu'elle est utilisée sans LIMIT
dans l'exemple 1.
Exemple 1
GRAPH FinGraph
MATCH (n:Account)
ORDER BY n.id DESC
RETURN n.id
LIMIT 3;
n_id |
---|
7 |
Exemple 2
GRAPH FinGraph
MATCH (n:Account)
ORDER BY n.id DESC
LIMIT 3
RETURN n.id;
n_id |
---|
20 |
Différents modèles de bords génèrent des résultats différents
Description
Dans l'ensemble de données utilisé dans l'exemple d'erreur, le motif d'arête de direction ANY
correspond à chaque arête Transfers
du graphique deux fois.
Dans l'exemple 1, une arête Transfers
de Account(id=x)
à Account(id=y)
peut être mise en correspondance deux fois, comme suit:
- n=
Account(id=x)
, m=Account(id=y)
- n=
Account(id=y)
, m=Account(id=x)
Il n'y a qu'une seule correspondance dans l'exemple 2, où n=Account(id=x)
et m=Account(id=y)
.
Par conséquent, la requête de l'exemple 1 renvoie 10
et celle de l'exemple 2 renvoie 5
.
Exemple de problème
Les exemples suivants ont des résultats différents, car différents motifs de bords sont utilisés.
Exemple 1
GRAPH FinGraph
MATCH (n:Account)-[:Transfers]-(m:Account)
RETURN COUNT(*) AS num_transfer_edges;
num_transfer_edges |
---|
10 |
Exemple 2
GRAPH FinGraph
MATCH (n:Account)-[:Transfers]->(m:Account)
RETURN COUNT(*) AS num_transfer_edges;
num_transfer_edges |
---|
5 |
Erreurs de mutation
Les résultats de la mutation sont basés sur l'ensemble de données utilisé dans Configurer et interroger Spanner Graph.
Le nœud source manquant enfreint la contrainte de clé étrangère
Message d'erreur
Parent row for row [...] in table AccountTransferAccount is missing. Row cannot
be written.
Description
La table des bords AccountTransferAccount
est la table INTERLEAVED INTO PARENT Account node
. Pour créer l'arête Transfer
, son nœud parent Account
doit déjà exister.
Exemple d'erreur
INSERT INTO AccountTransferAccount (id, to_id, create_time, amount)
VALUES (100, 1, PENDING_COMMIT_TIMESTAMP(), 200);
Correction recommandée
Commencez par créer le nœud Account
de tête, puis l'arête Transfer
.
Le nœud de destination manquant enfreint la contrainte de clé étrangère
Message d'erreur
Foreign key constraint FK_TransferTo is violated on table
AccountTransferAccount. Cannot find referenced values in Account(id)
Description
La table AccountTransferAccount
fait référence à Accounttable
via un ForeignKey
appelé FK_TransferTo
. Pour créer l'arc Transfer
, le nœud Account
de suivi référencé doit déjà exister.
Exemple d'erreur
INSERT INTO AccountTransferAccount (id, to_id, create_time, amount)
VALUES (1, 100, PENDING_COMMIT_TIMESTAMP(), 200);
Correction recommandée
Créez d'abord le nœud de compte de suivi, puis l'arc Transfer
.
Arête sortante orpheline non conforme à la relation parent-enfant
Message d'erreur
Integrity constraint violation during DELETE/REPLACE. Found child row [...] in
table AccountTransferAccount
Description
La table des arêtes AccountTransferAccount
est la table des nœuds Account
INTERLEAVED INTO PARENT
, et le nœud Account
à supprimer comporte toujours des arêtes sortantes qui y sont associées.
Exemple d'erreur
DELETE FROM Account WHERE id = 1;
Correction recommandée
Supprimez d'abord tous les bords Transfer
sortants, puis le nœud Account
.
Vous pouvez également définir ON DELETE CASCADE
pour INTERLEAVE
et demander à Spanner de supprimer automatiquement ces arêtes.
Une arête entrante orpheline ne respecte pas la relation parent-enfant
Message d'erreur
Foreign key constraint violation when deleting or updating referenced row(s):
referencing row(s) found in table AccountTransferAccount
Description
La table des arêtes AccountTransferAccount
fait référence à la table des nœuds Account
via un ForeignKey
, et le nœud Account
à supprimer comporte toujours des arêtes entrantes qui lui sont associées.
Exemple d'erreur
DELETE FROM Account WHERE id = 1;
Correction recommandée
Supprimez d'abord tous les arcs Transfer
entrants, puis le nœud Account
.
Vous pouvez également définir ON DELETE CASCADE
pour ForeignKey
et demander à Spanner de supprimer automatiquement ces arêtes.