Risoluzione dei problemi del grafico Spanner

Questo documento descrive gli errori che potresti riscontrare quando lavori con Spanner Graph. Vengono inoltre forniti esempi di errori e correzioni consigliate.

Se hai bisogno di ulteriore assistenza dopo aver consultato questa guida alla risoluzione dei problemi, consulta Ricevere assistenza.

Errori dello schema

I risultati dello schema si basano sul set di dati utilizzato in Configura ed esegui query su Spanner Graph.

Le chiavi degli elementi devono avere una garanzia di unicità

Messaggio di errore

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.

Esempio di errore

CREATE OR REPLACE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Person KEY (name)
  );

Crea un indice univoco nelle colonne delle chiavi degli elementi e ridefinisci le colonne delle chiavi degli elementi in base alle chiavi primarie della tabella di origine.

CREATE OR REPLACE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Person KEY (id)
  );

In alternativa, crea un indice univoco nelle colonne delle chiavi degli elementi.

CREATE UNIQUE INDEX PersonNameIndex ON Person(name);
CREATE OR REPLACE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Person KEY (name)
  );

I nomi per le definizioni degli elementi devono essere univoci

Messaggio di errore

Account is defined more than once; use a unique name.

Esempio di errore

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

Utilizza un nome univoco per la definizione dell'edge.

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 definizione dell'etichetta deve essere coerente per le proprietà

Messaggio di errore

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].

Esempio di errore

CREATE OR REPLACE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Person LABEL Entity PROPERTIES (name),
    Account LABEL Entity PROPERTIES (id)
  );

Devi utilizzare lo stesso insieme di nomi di proprietà sotto la stessa etichetta.

CREATE OR REPLACE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Person LABEL Entity PROPERTIES (id, name),
    Account LABEL Entity PROPERTIES (id, name)
  );

La dichiarazione della proprietà deve essere coerente per il tipo di proprietà

Messaggio di errore

The property declaration of name has type conflicts. There is an existing declaration of type INT64. There is a conflicting one of type STRING.

Esempio di errore

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 definizione della proprietà non deve essere una sottoquery

Messaggio di errore

Property value expression of count cannot contain a subquery.

Esempio di errore

CREATE OR REPLACE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Person PROPERTIES ((SELECT COUNT(*) FROM Person) AS count)
  );

N/D. Questa condizione non è consentita.

La definizione della proprietà deve essere coerente all'interno della stessa definizione dell'elemento

Messaggio di errore

Property location has more than one definition in the element table Person

Esempio di errore

CREATE OR REPLACE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Person
      LABEL Person PROPERTIES (country AS location)
      LABEL Entity PROPERTIES (city AS location)
  );

Utilizza la stessa definizione di proprietà.

CREATE OR REPLACE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Person
      LABEL Person PROPERTIES (country AS location)
      LABEL Entity PROPERTIES (country AS location)
  );

In alternativa, assegna nomi diversi alle proprietà.

CREATE OR REPLACE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Person
      LABEL Person PROPERTIES (country AS location)
      LABEL Entity PROPERTIES (city AS city)
  );

Errori di query

I risultati delle query si basano sul set di dati utilizzato in Configura ed esegui query Grafico Spanner.

Impossibile restituire gli elementi del grafico come risultati della query

Messaggio di errore

Returning expressions of type GRAPH_ELEMENT is not allowed

Esempio di errore

GRAPH FinGraph
MATCH (n:Account)
RETURN n;
GRAPH FinGraph
MATCH (n:Account)
RETURN TO_JSON(n) AS n;

La specifica della proprietà non può essere utilizzata con la clausola WHERE

Messaggio di errore

WHERE clause cannot be used together with property specification

Esempio di errore

GRAPH FinGraph
MATCH (n:Account {id: 1} WHERE n.is_blocked)
RETURN n.id;

Puoi utilizzare una delle seguenti correzioni suggerite.

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;

Il riferimento alle variabili definite nelle istruzioni precedenti non è consentito

Messaggio di errore

Name 'account_id', defined in the previous statement, can only be referenced in the outermost WHERE clause of MATCH

Descrizione

Il riferimento alle variabili definite nelle istruzioni precedenti non è consentito all'interno del MATCH pattern. Nella query del grafico, i nomi definiti dalle istruzioni precedenti possono essere utilizzato solo nella clausola WHERE più esterna di MATCH.

Errore di esempio
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;

Non è consentito ridefinire una variabile di grafico correlata

Messaggio di errore

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.

Descrizione

Nella query del grafico, i nomi degli elementi del grafico non possono essere ridefiniti in un grafico interno una sottoquery. Questo scenario potrebbe essere interpretato come un riferimento allo stesso elemento del grafico dell'ambito esterno o come un'associazione a nuovi elementi del grafico, che oscurano il nome dell'ambito esterno. La ridefinizione non è consentita.

Esempio di errore

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;

Problemi di semantica delle query

I risultati delle query si basano sul set di dati utilizzato in Configura ed esegui query Grafico Spanner.

WHERE e FILTER diversi generano output diversi

Descrizione

FILTER è un'istruzione; WHERE è una clausola, che fa parte delle istruzioni MATCH, OPTIONAL MATCH.

Nel primo esempio, la clausola WHERE aggiunge ulteriori vincoli al pattern descritti nell'istruzione OPTIONAL MATCH. Non si tratta di un filtro al termine della corrispondenza.

Nel secondo esempio, l'istruzione FILTER è un filtro dopo che la corrispondenza è completato.

Problema di esempio

Gli esempi seguenti hanno output diversi perché WHERE e FILTER sono diverso.

Esempio 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

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

Risultati vuoti.

Variabili diverse propagate tra le istruzioni generano output diversi.

Descrizione

Nel linguaggio di query dei grafici, una variabile dichiarata più volte fa riferimento alla lo stesso elemento grafico in tutte le occorrenze.

Nell'esempio 1, non esistono nodi Account i cui id sono sia 7 sia 16. Come risultato, vengono restituiti risultati vuoti.

Nell'esempio 2, il nome n non viene restituito dall'istruzione precedente (viene restituito solo id). Il secondo MATCH trova il nodo Account la cui id è 16.

Problema di esempio

Gli esempi seguenti hanno output diversi perché variabili diverse vengono propagate tra le istruzioni.

Esempio 1

GRAPH FinGraph
MATCH (n:Account {id: 7})
RETURN n

NEXT

MATCH (n:Account {id: 16})
RETURN n.id AS n_id;

Risultati vuoti.

Esempio 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 viene ignorato se esiste un'istruzione successiva diversa da LIMIT

Descrizione

Nel linguaggio di query dei grafici, l'istruzione ORDER BY viene ignorata, a meno che non sia vera una delle seguenti condizioni:

  • ORDER BY è l'ultima istruzione.
  • ORDER BY è seguito immediatamente da LIMIT.

Nell'esempio 1, LIMIT non segue immediatamente ORDER BY; ilLIMIT finale è separato. Ciò significa che ORDER BY viene ignorato dal motore.

Nell'esempio 2, ORDER BY è applicabile perché LIMIT segue immediatamente ORDER BY.

Problema di esempio

I seguenti esempi hanno output diversi perché l'istruzione ORDER BY viene ignorata quando viene utilizzata senza LIMIT nell'esempio 1.

Esempio 1

GRAPH FinGraph
MATCH (n:Account)
ORDER BY n.id DESC
RETURN n.id
LIMIT 3;
n_id
7

Esempio 2

GRAPH FinGraph
MATCH (n:Account)
ORDER BY n.id DESC
LIMIT 3
RETURN n.id;
n_id
20

Pattern di bordi diversi generano risultati diversi

Descrizione

Nel set di dati utilizzato nell'esempio di errore, il pattern del bordo della direzione ANY corrisponde due volte a ogni bordo Transfers del grafico.

Nell'esempio 1, un bordo Transfers da Account(id=x) a Account(id=y) può possono essere abbinate due volte, come segue:

  • n= Account(id=x), m= Account(id=y)
  • n= Account(id=y), m= Account(id=x)

Nell'esempio 2 esiste una sola corrispondenza, dove n=Account(id=x) e m=Account(id=y).

Di conseguenza, la query nell'esempio 1 restituisce 10 e la query nell'esempio 2 restituisce 5.

Problema di esempio

Gli esempi seguenti hanno output diversi perché pattern del perimetro diversi .

Esempio 1

GRAPH FinGraph
MATCH (n:Account)-[:Transfers]-(m:Account)
RETURN COUNT(*) AS num_transfer_edges;
num_transfer_edges
10

Esempio 2

GRAPH FinGraph
MATCH (n:Account)-[:Transfers]->(m:Account)
RETURN COUNT(*) AS num_transfer_edges;
num_transfer_edges
5

Errori di mutazione

I risultati della mutazione si basano sul set di dati utilizzato in Configura ed esegui query Grafico Spanner.

Il nodo di origine mancante viola il vincolo di chiave esterna

Messaggio di errore

Parent row for row [...] in table AccountTransferAccount is missing. Row cannot be written.

Descrizione

La tabella perimetrale AccountTransferAccount è INTERLEAVED INTO PARENT Account node tabella. Per creare l'edge Transfer, il relativo nodo principale Account deve essere già esistente.

Esempio di errore

INSERT INTO AccountTransferAccount (id, to_id, create_time, amount)
VALUES (100, 1, PENDING_COMMIT_TIMESTAMP(), 200);

Crea prima il nodo Account iniziale, poi crea il perimetro Transfer.

Il nodo di destinazione mancante viola il vincolo di chiave esterna

Messaggio di errore

Foreign key constraint FK_TransferTo is violated on table AccountTransferAccount. Cannot find referenced values in Account(id)

Descrizione

La tabella AccountTransferAccount fa riferimento a Accounttable tramite una ForeignKey ha chiamato FK_TransferTo. Per creare il bordo Transfer, il nodo di tailing Account a cui viene fatto riferimento deve già esistere.

Esempio di errore

INSERT INTO AccountTransferAccount (id, to_id, create_time, amount)
VALUES (1, 100, PENDING_COMMIT_TIMESTAMP(), 200);

Crea prima il nodo Account finale, quindi crea l'edge Transfer.

Un bordo in uscita orfano viola la relazione principale-secondario

Messaggio di errore

Integrity constraint violation during DELETE/REPLACE. Found child row [...] in table AccountTransferAccount

Descrizione

La tabella perimetrale AccountTransferAccount è INTERLEAVED INTO PARENT Account nodo e il nodo Account da eliminare ha ancora archi in uscita collegati li annotino.

Errore di esempio

DELETE FROM Account WHERE id = 1;

Elimina prima tutti gli archi in uscita Transfer, quindi elimina il nodo Account. In alternativa, definisci ON DELETE CASCADE per INTERLEAVE e lascia che sia Spanner a eliminare automaticamente questi bordi.

Il bordo in entrata orfano viola la relazione genitore-figlio

Messaggio di errore

Foreign key constraint violation when deleting or updating referenced row(s): referencing row(s) found in table AccountTransferAccount

Descrizione

La tabella degli spigoli AccountTransferAccount fa riferimento alla tabella dei nodi Account tramite un ForeignKey e il nodo Account da eliminare ha ancora spigoli in entrata collegati.

Errore di esempio

DELETE FROM Account WHERE id = 1;

Elimina prima tutti i lati Transfer in entrata, quindi elimina il nodo Account. In alternativa, definisci ON DELETE CASCADE per ForeignKey e consenti a Spanner di eliminare automaticamente questi bordi.