In diesem Dokument werden mögliche Fehler beschrieben. wenn Sie mit Spanner Graph arbeiten. Beispiele für Fehler und empfohlene Korrekturen werden ebenfalls bereitgestellt.
Wenn Sie nach Durchsicht dieser Anleitung zur Fehlerbehebung weitere Unterstützung benötigen, Weitere Informationen finden Sie unter Support kontaktieren.
Schemafehler
Die Schemaergebnisse basieren auf dem Datensatz, der unter Cloud Spanner Graph einrichten und abfragen verwendet wurde.
Elementschlüssel müssen eindeutig sein
Fehlermeldung
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.
Beispiel für Fehlermeldung
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Person KEY (name)
);
Empfohlene Korrektur
Erstellen Sie einen eindeutigen Index für die Spalten mit Elementschlüsseln und definieren Sie die Spalten mit Elementschlüsseln anhand der Primärschlüssel der Quelltabelle neu.
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Person KEY (id)
);
Alternativ können Sie einen eindeutigen Index für die Spalten mit Elementschlüsseln erstellen.
CREATE UNIQUE INDEX PersonNameIndex ON Person(name);
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Person KEY (name)
);
Namen für Elementdefinitionen müssen eindeutig sein
Fehlermeldung
Account is defined more than once; use a unique name.
Beispiel für Fehlermeldung
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
);
Empfohlene Korrektur
Verwenden Sie einen eindeutigen Namen für die Kantendefinition.
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
);
Die Labeldefinition muss für Attribute einheitlich sein
Fehlermeldung
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].
Beispiel für Fehlermeldung
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Person LABEL Entity PROPERTIES (name),
Account LABEL Entity PROPERTIES (id)
);
Empfohlene Fehlerbehebung
Sie müssen denselben Satz von Attributnamen unter demselben Label verwenden.
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Person LABEL Entity PROPERTIES (id, name),
Account LABEL Entity PROPERTIES (id, name)
);
Deklaration der Property muss für den Property-Typ konsistent sein
Fehlermeldung
The property declaration of name has type conflicts. There is an existing
declaration of type INT64. There is a conflicting one of type STRING.
Beispiel für Fehlermeldung
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Person PROPERTIES (name),
Account PROPERTIES (id AS name)
);
Empfohlene Korrektur
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Person PROPERTIES (name),
Account PROPERTIES (CAST(id AS STRING) AS name)
);
Attributdefinition darf keine Unterabfrage sein
Fehlermeldung
Property value expression of count cannot contain a subquery.
Beispiel für Fehlermeldung
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Person PROPERTIES ((SELECT COUNT(*) FROM Person) AS count)
);
Empfohlene Korrektur
n/a Diese Bedingung ist nicht zulässig.
Die Property-Definition muss innerhalb derselben Elementdefinition konsistent sein.
Fehlermeldung
Property location has more than one definition in the element table Person
Beispiel für Fehlermeldung
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Person
LABEL Person PROPERTIES (country AS location)
LABEL Entity PROPERTIES (city AS location)
);
Empfohlene Fehlerbehebung
Verwenden Sie dieselbe Property-Definition.
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Person
LABEL Person PROPERTIES (country AS location)
LABEL Entity PROPERTIES (country AS location)
);
Alternativ können Sie auch unterschiedliche Property-Namen zuweisen.
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Person
LABEL Person PROPERTIES (country AS location)
LABEL Entity PROPERTIES (city AS city)
);
Abfragefehler
Die Abfrageergebnisse basieren auf dem Dataset, das unter Einrichtung und Abfrage Spanner-Diagramm.
Graphenelemente können nicht als Abfrageergebnisse zurückgegeben werden
Fehlermeldung
Returning expressions of type GRAPH_ELEMENT is not allowed
Beispiel für Fehlermeldung
GRAPH FinGraph
MATCH (n:Account)
RETURN n;
Empfohlene Fehlerbehebung
GRAPH FinGraph
MATCH (n:Account)
RETURN TO_JSON(n) AS n;
Attributspezifikation kann nicht mit der WHERE
-Klausel verwendet werden
Fehlermeldung
WHERE clause cannot be used together with property specification
Beispiel für Fehlermeldung
GRAPH FinGraph
MATCH (n:Account {id: 1} WHERE n.is_blocked)
RETURN n.id;
Empfohlene Korrektur
Sie können eine der folgenden Lösungen ausprobieren.
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;
Verweise auf in vorherigen Anweisungen definierte Variablen sind nicht zulässig.
Fehlermeldung
Name 'account_id', defined in the previous statement, can only be referenced in
the outermost WHERE clause of MATCH
Beschreibung
Verweise auf Variablen, die in vorherigen Anweisungen definiert wurden, sind im
MATCH
-Muster. In der Graphabfrage können durch vorherige Anweisungen definierte Namen
kann nur in der äußersten WHERE
-Klausel von MATCH
verwendet werden.
Beispiel für Fehlermeldung
GRAPH FinGraph
LET account_id = 1
MATCH (n:Account {id: account_id})
RETURN n.id;
Empfohlene Korrektur
GRAPH FinGraph
LET account_id = 1
MATCH (n:Account)
WHERE n.id = account_id
RETURN n.id;
Eine korrelierte Graphvariable kann nicht neu definiert werden
Fehlermeldung
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.
Beschreibung
In der Graph-Abfrage können Namen von Graph-Elementen in einem inneren Diagramm nicht neu definiert werden Unterabfrage. Dieses Szenario könnte als Verweis auf dasselbe Diagramm interpretiert werden -Element als äußeren Geltungsbereich oder als Bindung an neue Grafikelemente, die Schatten den Namen des äußeren Bereichs. Eine Neudefinition ist nicht zulässig.
Beispiel für Fehlermeldung
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;
Empfohlene Fehlerbehebung
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;
Probleme mit der Abfragesemantik
Die Abfrageergebnisse basieren auf dem Dataset, das unter Einrichtung und Abfrage Spanner-Diagramm.
Unterschiedliche WHERE
und FILTER
führen zu unterschiedlichen Ergebnissen
Beschreibung
FILTER
ist eine Anweisung. WHERE
ist eine Klausel, die Teil der MATCH
-, OPTIONAL
MATCH
-Anweisungen ist.
Im ersten Beispiel fügt die WHERE
-Klausel den in der OPTIONAL MATCH
-Anweisung beschriebenen Mustern zusätzliche Einschränkungen hinzu. Dies ist kein Filter nach
der Abgleich abgeschlossen ist.
Im zweiten Beispiel ist die FILTER
-Anweisung ein Filter, der nach dem Abgleich angewendet wird.
Problembeispiel
Die folgenden Beispiele haben unterschiedliche Ausgaben, da WHERE
und FILTER
unterscheiden.
Beispiel 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 |
Beispiel 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;
Leere Ergebnisse.
Unterschiedliche Variablen, die über Anweisungen hinweg weitergegeben werden, führen zu unterschiedlichen Ergebnissen
Beschreibung
In der Graphabfragesprache bezieht sich eine mehrmals deklarierte Variable in allen Vorkommen auf dasselbe Graphelement.
In Beispiel 1 gibt es keinen Account
-Knoten, dessen id
sowohl 7
als auch 16
ist. Als
ein Ergebnis, werden leere Ergebnisse zurückgegeben.
In Beispiel 2 wird der Name n
von der vorherigen Anweisung nicht zurückgegeben.
(nur id
wird zurückgegeben). So findet die zweite MATCH
den Account
-Knoten, dessen
id
ist 16
.
Problembeispiel
Die folgenden Beispiele haben unterschiedliche Ausgaben, da unterschiedliche Variablen in allen Anweisungen verbreitet werden.
Beispiel 1
GRAPH FinGraph
MATCH (n:Account {id: 7})
RETURN n
NEXT
MATCH (n:Account {id: 16})
RETURN n.id AS n_id;
Leere Ergebnisse.
Beispiel 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
wird ignoriert, wenn es eine nachfolgende Anweisung gibt, die nicht LIMIT
ist.
Beschreibung
In der Graph-Abfragesprache wird die ORDER BY
-Anweisung ignoriert, es sei denn,
trifft Folgendes zu:
ORDER BY
ist die letzte Anweisung.- Auf
ORDER BY
folgt unmittelbarLIMIT
.
In Beispiel 1 folgt LIMIT
nicht direkt auf ORDER BY
. das letzte
LIMIT
ist getrennt. Das bedeutet, dass ORDER BY
von der Suchmaschine ignoriert wird.
In Beispiel 2 ist ORDER BY
zutreffend, da LIMIT
direkt auf ORDER BY
folgt.
Problembeispiel
Die folgenden Beispiele haben unterschiedliche Ausgaben, da die ORDER BY
wird ignoriert, wenn sie in Beispiel 1 ohne LIMIT
verwendet wird.
Beispiel 1
GRAPH FinGraph
MATCH (n:Account)
ORDER BY n.id DESC
RETURN n.id
LIMIT 3;
n_id |
---|
7 |
Beispiel 2
GRAPH FinGraph
MATCH (n:Account)
ORDER BY n.id DESC
LIMIT 3
RETURN n.id;
n_id |
---|
20 |
Unterschiedliche Kantenmuster führen zu unterschiedlichen Ausgaben.
Beschreibung
Im Dataset, das im Fehlerbeispiel verwendet wird, hat das Kantenmuster ANY
-Richtung
entspricht jeder Transfers
-Kanten im Diagramm zweimal.
In Beispiel 1 kann eine Transfers
-Kante von Account(id=x)
nach Account(id=y)
zweimal übereinstimmen:
- n =
Account(id=x)
, m =Account(id=y)
- n=
Account(id=y)
, m=Account(id=x)
Es gibt nur eine Übereinstimmung in Beispiel 2, wobei n=Account(id=x)
ist.
und m=Account(id=y)
.
Daher gibt die Abfrage in Beispiel 1 10
und die Abfrage in Beispiel 2 zurück.
gibt 5
zurück.
Problembeispiel
Die folgenden Beispiele haben unterschiedliche Ausgaben, da unterschiedliche Randmuster verwendet werden.
Beispiel 1
GRAPH FinGraph
MATCH (n:Account)-[:Transfers]-(m:Account)
RETURN COUNT(*) AS num_transfer_edges;
num_transfer_edges |
---|
10 |
Beispiel 2
GRAPH FinGraph
MATCH (n:Account)-[:Transfers]->(m:Account)
RETURN COUNT(*) AS num_transfer_edges;
num_transfer_edges |
---|
5 |
Mutationsfehler
Mutationsergebnisse basieren auf dem unter Einrichtung und Abfrage verwendeten Datensatz Spanner-Diagramm.
Fehlender Quellknoten verstößt gegen Fremdschlüsseleinschränkung
Fehlermeldung
Parent row for row [...] in table AccountTransferAccount is missing. Row cannot
be written.
Beschreibung
Die Kantentabelle AccountTransferAccount
ist INTERLEAVED INTO PARENT Account node
. Damit die Kante Transfer
erstellt werden kann, muss der übergeordnete Knoten Account
bereits vorhanden sein.
Beispiel für Fehlermeldung
INSERT INTO AccountTransferAccount (id, to_id, create_time, amount)
VALUES (100, 1, PENDING_COMMIT_TIMESTAMP(), 200);
Empfohlene Fehlerbehebung
Erstellen Sie zuerst den führenden Account
-Knoten und dann den Edge-Transfer
-Knoten.
Fehlender Zielknoten verstößt gegen Fremdschlüsseleinschränkung
Fehlermeldung
Foreign key constraint FK_TransferTo is violated on table
AccountTransferAccount. Cannot find referenced values in Account(id)
Beschreibung
Die Tabelle AccountTransferAccount
verweist auf Accounttable
durch einen
ForeignKey
mit dem Namen FK_TransferTo
. Zum Erstellen der Kante Transfer
Der Knoten Account
des referenzierten Tailing-Knotens muss bereits vorhanden sein.
Beispiel für Fehlermeldung
INSERT INTO AccountTransferAccount (id, to_id, create_time, amount)
VALUES (1, 100, PENDING_COMMIT_TIMESTAMP(), 200);
Empfohlene Korrektur
Erstellen Sie zuerst den Tailing-Kontoknoten und dann den Edge Transfer
.
Eine verwaiste ausgehende Kante verstößt gegen die übergeordnete/untergeordnete Beziehung
Fehlermeldung
Integrity constraint violation during DELETE/REPLACE. Found child row [...] in
table AccountTransferAccount
Beschreibung
Die AccountTransferAccount
-Kantentabelle ist die INTERLEAVED INTO PARENT
-Account
-Knotentabelle und der zu löschende Account
-Knoten hat noch ausgehende Kanten.
Beispiel für Fehlermeldung
DELETE FROM Account WHERE id = 1;
Empfohlene Fehlerbehebung
Löschen Sie zuerst alle ausgehenden Transfer
-Kanten und dann den Account
-Knoten.
Alternativ können Sie ON DELETE CASCADE
für INTERLEAVE
definieren und Spanner diese Kanten automatisch löschen lassen.
Einsame eingehende Kante verstößt gegen die übergeordnete/untergeordnete Beziehung
Fehlermeldung
Foreign key constraint violation when deleting or updating referenced row(s):
referencing row(s) found in table AccountTransferAccount
Beschreibung
Die Kantentabelle AccountTransferAccount
verweist über eine ForeignKey
auf die Knotentabelle Account
und der zu löschende Knoten Account
hat noch eingehende Kanten.
Beispiel für Fehlermeldung
DELETE FROM Account WHERE id = 1;
Empfohlene Fehlerbehebung
Löschen Sie zuerst alle eingehenden Transfer
-Kanten und dann den Knoten Account
.
Alternativ können Sie ON DELETE CASCADE
definieren
für ForeignKey
und lassen Spanner diese automatisch löschen
Kanten.