<ph type="x-smartling-placeholder">
Ce document décrit les erreurs que vous pouvez rencontrer lorsque vous travaillez avec Spanner Graph. Exemples d'erreurs et de 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 des schémas sont basés sur l'ensemble de données utilisé dans la section Configurer et interroger Graphe Spanner.
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 index 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 d'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 étiquettes 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)
);
Solution 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 la section Configurer et interroger Graphe Spanner.
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;
Solution 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
Vous n'êtes pas autorisé à faire référence à des variables définies dans les instructions précédentes dans les
Format MATCH
. Dans la requête de graphique, les noms définis par les instructions précédentes peuvent
ne doit être utilisé 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;
Solution 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;
Solution 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 la section Configurer et interroger Graphe Spanner.
Différents WHERE
et FILTER
génèrent des résultats différents
Description
FILTER
est une instruction ; WHERE
est une clause incluse dans les instructions MATCH
et OPTIONAL
MATCH
.
Dans le premier exemple, la clause WHERE
ajoute des contraintes supplémentaires au
des 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 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 à travers les instructions génèrent des sorties différentes
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 la valeur id
est 7
et 16
. En tant que
des résultats vides sont renvoyés.
Dans l'exemple 2, le nom n
n'est pas renvoyé par 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ête graphique, l'instruction ORDER BY
est ignorée, sauf si l'une des
ce qui suit est vrai:
ORDER BY
est la dernière instruction.ORDER BY
est immédiatement suivi deLIMIT
.
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 ont des sorties différentes, car 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 de bord de direction ANY
correspond à chaque bord 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 la requête de l'exemple 2
renvoie 5
.
Exemple de problème
Les exemples suivants ont des sorties différentes, car différents modèles de périphérie 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 ne respecte pas 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 périphérique AccountTransferAccount
est INTERLEAVED INTO PARENT Account node
tableau. 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
Créez d'abord 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
Le tableau AccountTransferAccount
fait référence à Accounttable
via un
ForeignKey
a appelé FK_TransferTo
. Pour créer l'arête Transfer
,
Le nœud de suivi des dernières référencés Account
doit déjà exister.
Exemple d'erreur
INSERT INTO AccountTransferAccount (id, to_id, create_time, amount)
VALUES (1, 100, PENDING_COMMIT_TIMESTAMP(), 200);
Solution 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 toutes les arêtes Transfer
sortantes, puis supprimez 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 périphérique AccountTransferAccount
fait référence à la table de nœuds Account
via une
ForeignKey
et le nœud Account
à supprimer ont toujours des arêtes entrantes
qui lui est associée.
Exemple d'erreur
DELETE FROM Account WHERE id = 1;
Solution 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.