In diesem Dokument werden Fehler beschrieben, die beim Arbeiten mit Spanner Graph auftreten können. Außerdem werden Beispiele für Fehler und empfohlene Fehlerbehebungen bereitgestellt.
Wenn Sie nach dem Lesen dieser Anleitung zur Fehlerbehebung weitere Unterstützung benötigen, wenden Sie sich bitte an den Support.
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 Fehlerbehebung
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 Fehlerbehebung
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
);
Labeldefinition muss für Properties 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 für das gleiche Label dieselben Property-Namen 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 Fehlerbehebung
CREATE OR REPLACE PROPERTY GRAPH FinGraph
NODE TABLES (
Person PROPERTIES (name),
Account PROPERTIES (CAST(id AS STRING) AS name)
);
Die Attributdefinition darf keine untergeordnete Abfrage 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 Fehlerbehebung
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)
);
Sie können 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 Datensatz, der unter Cloud Spanner Graph einrichten und abfragen verwendet wurde.
Diagrammelemente 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;
Property-Angabe kann nicht mit 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 Fehlerbehebung
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 in vorherigen Anweisungen definierte Variablen sind im MATCH
-Muster nicht zulässig. In der Graphabfrage können Namen, die durch vorherige Anweisungen definiert wurden, 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 Fehlerbehebung
GRAPH FinGraph
LET account_id = 1
MATCH (n:Account)
WHERE n.id = account_id
RETURN n.id;
Eine korrelierte Grafikvariable 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 Graphabfrage können Graphelementnamen nicht in einer inneren Graph-Unterabfrage neu definiert werden. Dieses Szenario kann als Verweis auf dasselbe Graphelement wie der äußere Bereich oder als Bindung an neue Graphelemente interpretiert werden, die den Namen des äußeren Bereichs überschatten. 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 Cloud Spanner Graph einrichten und abfragen verwendet wurde.
Unterschiedliche WHERE
und FILTER
führen zu unterschiedlichen Ergebnissen
Beschreibung
FILTER
ist eine Anweisung; WHERE
ist eine Klausel, die Teil der Anweisungen MATCH
und OPTIONAL
MATCH
ist.
Im ersten Beispiel fügt die WHERE
-Klausel den in der OPTIONAL MATCH
-Anweisung beschriebenen Mustern zusätzliche Einschränkungen hinzu. Nach Abschluss der Übereinstimmung ist dies kein Filter mehr.
Im zweiten Beispiel ist die FILTER
-Anweisung ein Filter, der nach dem Abgleich angewendet wird.
Problembeispiel
Die folgenden Beispiele haben unterschiedliche Ergebnisse, da WHERE
und FILTER
unterschiedlich sind.
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 Graph Query Language 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. Daher werden leere Ergebnisse zurückgegeben.
In Beispiel 2 wird der Name n
nicht von der vorherigen Anweisung zurückgegeben (nur id
wird zurückgegeben). So wird mit dem zweiten MATCH
der Account
-Knoten gefunden, dessen id
16
ist.
Problembeispiel
Die folgenden Beispiele haben unterschiedliche Ergebnisse, da verschiedene Variablen über Anweisungen hinweg weitergegeben 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 die nachfolgende Anweisung nicht LIMIT
ist.
Beschreibung
In der Graphabfragesprache wird die Anweisung ORDER BY
ignoriert, es sei denn, eine der folgenden Bedingungen ist erfüllt:
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 Ergebnisse, da die ORDER BY
-Anweisung in Beispiel 1 ignoriert wird, wenn sie 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 Ergebnissen
Beschreibung
Im Dataset, das im Fehlerbeispiel verwendet wird, entspricht das ANY
-Eckmuster der Richtung jeder Transfers
-Kante im Graphen 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)
In Beispiel 2 gibt es nur eine Übereinstimmung, bei der n=Account(id=x)
und m=Account(id=y)
.
Daher gibt die Abfrage in Beispiel 1 10
und die Abfrage in Beispiel 2 5
zurück.
Problembeispiel
Die folgenden Beispiele haben unterschiedliche Ergebnisse, da unterschiedliche Kantenmuster 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 |
Fehler bei der Mutation
Die Mutationsergebnisse basieren auf dem Datensatz, der unter Cloud Spanner Graph einrichten und abfragen verwendet wurde.
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 leitenden Account
-Knoten und dann die Transfer
-Kante.
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 über eine ForeignKey
namens FK_TransferTo
auf Accounttable
. Damit die Kante Transfer
erstellt werden kann, muss der referenzierte Endknoten Account
bereits vorhanden sein.
Beispiel für Fehlermeldung
INSERT INTO AccountTransferAccount (id, to_id, create_time, amount)
VALUES (1, 100, PENDING_COMMIT_TIMESTAMP(), 200);
Empfohlene Fehlerbehebung
Erstellen Sie zuerst den Kontoknoten für die Nachbearbeitung und dann die Kante 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
für ForeignKey
definieren und Spanner diese Kanten automatisch löschen lassen.