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)
);
Correzione consigliata
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
);
Correzione consigliata
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)
);
Correzione consigliata
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)
);
Correzione consigliata
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)
);
Correzione consigliata
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)
);
Correzione consigliata
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;
Correzione consigliata
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;
Correzione consigliata
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;
Correzione consigliata
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;
Correzione consigliata
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 daLIMIT
.
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);
Correzione consigliata
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);
Correzione consigliata
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;
Correzione consigliata
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;
Correzione consigliata
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.