Fehler im Spanner-Diagramm beheben

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)
  );

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
  );

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)
  );

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)
  );
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)
  );

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)
  );

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;
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;

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;
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;
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 unmittelbar LIMIT.

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);

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);

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;

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;

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.