Résoudre les problèmes liés aux graphiques Spanner

<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)
  );

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
  );

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)
  );

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)
  );
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)
  );

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)
  );

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;
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;

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;
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;
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 de LIMIT.

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);

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);

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;

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;

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.