Risolvere i problemi di Spanner Graph

Questo documento descrive gli errori che potresti riscontrare quando utilizzi 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 la sezione Ricevere assistenza.

Errori di 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 per le colonne delle chiavi degli elementi e ridefinisci le colonne delle chiavi degli elementi in base alle chiavi principali 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 delle 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 delle etichette 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à nella 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 su Spanner Graph.

Gli elementi del grafico non possono essere restituiti come risultati di 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 sul grafico, i nomi definiti dagli enunciati precedenti possono essere utilizzati solo nella clausola WHERE più esterna di MATCH.

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

La ridefinizione di una variabile di grafico correlata non è consentita

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 sul grafo, i nomi degli elementi del grafo non possono essere ridefiniti in una sottoquery del grafo interno. 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 su Spanner Graph.

WHERE e FILTER diversi generano risultati 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 ai pattern descritti nell'istruzione OPTIONAL MATCH. Non si tratta di un filtro al termine della corrispondenza.

Nel secondo esempio, l'istruzione FILTER è un filtro al termine della corrispondenza.

Problema di esempio

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

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 del grafo, una variabile dichiarata più volte fa riferimento allo stesso elemento del grafo in tutte le occorrenze.

Nell'esempio 1, non esiste un nodo Account il cui id sia 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). Pertanto, il secondo MATCH trova il nodo Account il 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 che non è 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 è immediatamente seguito 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 di bordo direzione ANY corrisponde a ogni bordo Transfers del grafo due volte.

Nell'esempio 1, un bordo Transfers da Account(id=x) a Account(id=y) può essere associato 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

I seguenti esempi hanno output diversi perché vengono utilizzati diversi pattern di bordi.

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 delle mutazioni si basano sul set di dati utilizzato in Configura ed esegui query su Spanner Graph.

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 di edge AccountTransferAccount è tabella INTERLEAVED INTO PARENT Account node. 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 principale, quindi crea l'elemento Transfer.

Il nodo di destinazione mancante viola il vincolo della 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 un ForeignKey chiamato FK_TransferTo. Per creare l'edge Transfer, il node Account di coda di 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 degli spigoli AccountTransferAccount è la tabella dei nodi INTERLEAVED INTO PARENT Account e il nodo Account da eliminare ha ancora spigoli in uscita collegati.

Esempio di errore

DELETE FROM Account WHERE id = 1;

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

Un bordo in arrivo orfano viola la relazione principale-secondario

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.

Esempio di errore

DELETE FROM Account WHERE id = 1;

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