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