Memecahkan Masalah Grafik Spanner

Dokumen ini menjelaskan error yang mungkin Anda alami saat menggunakan Spanner Graph. Contoh error dan perbaikan yang direkomendasikan juga disediakan.

Jika Anda memerlukan dukungan lebih lanjut setelah meninjau panduan pemecahan masalah ini, lihat Mendapatkan dukungan.

Error skema

Hasil skema didasarkan pada set data yang digunakan di Menyiapkan dan membuat kueri Grafik Spanner.

Kunci elemen harus memiliki jaminan keunikan

Pesan error

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.

Contoh error

CREATE OR REPLACE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Person KEY (name)
  );

Membuat indeks unik pada kolom kunci elemen dan menentukan ulang kolom kunci elemen berdasarkan kunci utama tabel sumber.

CREATE OR REPLACE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Person KEY (id)
  );

Atau, buat indeks unik pada kolom kunci elemen.

CREATE UNIQUE INDEX PersonNameIndex ON Person(name);
CREATE OR REPLACE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Person KEY (name)
  );

Nama untuk definisi elemen harus unik

Pesan error

Account is defined more than once; use a unique name.

Contoh error

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

Gunakan nama unik untuk definisi 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
  );

Definisi label harus konsisten untuk properti

Pesan error

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].

Contoh error

CREATE OR REPLACE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Person LABEL Entity PROPERTIES (name),
    Account LABEL Entity PROPERTIES (id)
  );

Anda harus menggunakan kumpulan nama properti yang sama dengan label yang sama.

CREATE OR REPLACE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Person LABEL Entity PROPERTIES (id, name),
    Account LABEL Entity PROPERTIES (id, name)
  );

Deklarasi properti harus konsisten untuk jenis properti

Pesan error

The property declaration of name has type conflicts. There is an existing declaration of type INT64. There is a conflicting one of type STRING.

Contoh error

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

Definisi properti tidak boleh berupa subkueri

Pesan error

Property value expression of count cannot contain a subquery.

Contoh error

CREATE OR REPLACE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Person PROPERTIES ((SELECT COUNT(*) FROM Person) AS count)
  );

T/A. Kondisi ini tidak diizinkan.

Definisi properti harus konsisten dalam definisi elemen yang sama

Pesan error

Property location has more than one definition in the element table Person

Contoh error

CREATE OR REPLACE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Person
      LABEL Person PROPERTIES (country AS location)
      LABEL Entity PROPERTIES (city AS location)
  );

Gunakan definisi properti yang sama.

CREATE OR REPLACE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Person
      LABEL Person PROPERTIES (country AS location)
      LABEL Entity PROPERTIES (country AS location)
  );

Atau, tetapkan nama properti yang berbeda.

CREATE OR REPLACE PROPERTY GRAPH FinGraph
  NODE TABLES (
    Person
      LABEL Person PROPERTIES (country AS location)
      LABEL Entity PROPERTIES (city AS city)
  );

Error kueri

Hasil kueri didasarkan pada set data yang digunakan di Menyiapkan dan membuat kueri Grafik Spanner.

Elemen grafik tidak dapat ditampilkan sebagai hasil kueri

Pesan error

Returning expressions of type GRAPH_ELEMENT is not allowed

Contoh error

GRAPH FinGraph
MATCH (n:Account)
RETURN n;
GRAPH FinGraph
MATCH (n:Account)
RETURN TO_JSON(n) AS n;

Spesifikasi properti tidak dapat digunakan dengan klausa WHERE

Pesan error

WHERE clause cannot be used together with property specification

Contoh error

GRAPH FinGraph
MATCH (n:Account {id: 1} WHERE n.is_blocked)
RETURN n.id;

Anda dapat menggunakan salah satu perbaikan yang disarankan berikut.

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;

Referensi ke variabel yang ditentukan dalam pernyataan sebelumnya tidak diizinkan

Pesan error

Name 'account_id', defined in the previous statement, can only be referenced in the outermost WHERE clause of MATCH

Deskripsi

Referensi ke variabel yang ditentukan dalam pernyataan sebelumnya tidak diizinkan dalam Pola MATCH. Dalam kueri grafik, nama yang ditentukan oleh pernyataan sebelumnya dapat hanya digunakan dalam klausa WHERE terluar dari MATCH.

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

Mendefinisikan ulang variabel grafik berkorelasi tidak diizinkan

Pesan error

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.

Deskripsi

Dalam kueri grafik, nama elemen grafik tidak dapat ditentukan ulang dalam subkueri grafik dalam. Skenario ini dapat ditafsirkan sebagai merujuk pada grafik yang sama sebagai ruang lingkup luar atau sebagai pengikatan ke elemen grafik baru, yang membayangi nama lingkup luar. Mendefinisikan ulang tidak diizinkan.

Contoh error

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;

Masalah semantik kueri

Hasil kueri didasarkan pada set data yang digunakan dalam artikel Set up and query Grafik Spanner.

WHERE dan FILTER yang berbeda menghasilkan output yang berbeda

Deskripsi

FILTER adalah pernyataan; WHERE adalah klausa, sebagai bagian dari pernyataan MATCH, OPTIONAL MATCH.

Pada contoh pertama, klausa WHERE menambahkan batasan tambahan ke pola yang dijelaskan dalam pernyataan OPTIONAL MATCH. Ini bukan filter setelah pencocokan selesai.

Pada contoh kedua, pernyataan FILTER adalah filter setelah pencocokan selesai.

Contoh masalah

Contoh berikut memiliki output yang berbeda karena WHERE dan FILTER adalah berbeda.

Contoh 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

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

Hasil kosong.

Variabel berbeda yang disebarkan di seluruh pernyataan menghasilkan output yang berbeda

Deskripsi

Dalam bahasa kueri grafik, variabel yang dideklarasikan beberapa kali mengacu pada elemen grafik yang sama di semua kejadian.

Di Contoh 1, tidak ada node Account yang id-nya adalah 7 dan 16. Akibatnya, hasil kosong akan ditampilkan.

Di Contoh 2, nama n tidak ditampilkan dari pernyataan sebelumnya (hanya id yang ditampilkan). Jadi, MATCH kedua menemukan node Account yang id adalah 16.

Contoh masalah

Contoh berikut memiliki {i>output<i} yang berbeda karena variabel yang berbeda yang disebarkan di seluruh pernyataan.

Contoh 1

GRAPH FinGraph
MATCH (n:Account {id: 7})
RETURN n

NEXT

MATCH (n:Account {id: 16})
RETURN n.id AS n_id;

Hasil kosong.

Contoh 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 diabaikan jika ada pernyataan berhasil yang bukan LIMIT

Deskripsi

Dalam bahasa kueri grafik, pernyataan ORDER BY diabaikan kecuali jika salah satu dari hal berikut benar:

  • ORDER BY adalah pernyataan terakhir.
  • ORDER BY segera diikuti oleh LIMIT.

Dalam Contoh 1, LIMIT tidak langsung mengikuti ORDER BY; LIMIT akhir dipisahkan. Ini berarti ORDER BY diabaikan oleh mesin.

Di Contoh 2, ORDER BY berlaku karena LIMIT langsung mengikuti ORDER BY.

Contoh masalah

Contoh berikut memiliki output yang berbeda karena ORDER BY pernyataan diabaikan jika digunakan tanpa LIMIT dalam Contoh 1.

Contoh 1

GRAPH FinGraph
MATCH (n:Account)
ORDER BY n.id DESC
RETURN n.id
LIMIT 3;
n_id
7

Contoh 2

GRAPH FinGraph
MATCH (n:Account)
ORDER BY n.id DESC
LIMIT 3
RETURN n.id;
n_id
20

Pola edge yang berbeda menghasilkan output yang berbeda

Deskripsi

Dalam set data yang digunakan dalam contoh error, pola tepi arah ANY cocok dengan setiap tepi Transfers pada grafik dua kali.

Di Contoh 1, edge Transfers dari Account(id=x) ke Account(id=y) dapat dicocokkan dua kali, sebagai berikut:

  • n= Account(id=x), m= Account(id=y)
  • n= Account(id=y), m= Account(id=x)

Hanya ada satu kecocokan di Contoh 2, di mana n=Account(id=x) dan m=Account(id=y).

Akibatnya, kueri di Contoh 1 menampilkan 10 dan kueri di Contoh 2 akan menampilkan 5.

Contoh masalah

Contoh berikut memiliki {i>output<i} yang berbeda karena pola tepi yang berbeda digunakan.

Contoh 1

GRAPH FinGraph
MATCH (n:Account)-[:Transfers]-(m:Account)
RETURN COUNT(*) AS num_transfer_edges;
num_transfer_edges
10

Contoh 2

GRAPH FinGraph
MATCH (n:Account)-[:Transfers]->(m:Account)
RETURN COUNT(*) AS num_transfer_edges;
num_transfer_edges
5

Error mutasi

Hasil mutasi didasarkan pada set data yang digunakan dalam bagian Penyiapan dan kueri Grafik Spanner.

Node sumber yang tidak ada melanggar batasan kunci asing

Pesan error

Parent row for row [...] in table AccountTransferAccount is missing. Row cannot be written.

Deskripsi

Tabel edge AccountTransferAccount adalah INTERLEAVED INTO PARENT Account node tabel sementara. Untuk membuat tepi Transfer, node Account induknya harus sudah ada.

Contoh error

INSERT INTO AccountTransferAccount (id, to_id, create_time, amount)
VALUES (100, 1, PENDING_COMMIT_TIMESTAMP(), 200);

Buat node Account utama terlebih dahulu, lalu buat tepi Transfer.

Node tujuan tidak ada melanggar batasan kunci asing

Pesan error

Foreign key constraint FK_TransferTo is violated on table AccountTransferAccount. Cannot find referenced values in Account(id)

Deskripsi

Tabel AccountTransferAccount merujuk ke Accounttable melalui ForeignKey bernama FK_TransferTo. Untuk membuat edge Transfer, node Account node tailing yang direferensikan harus sudah ada.

Contoh error

INSERT INTO AccountTransferAccount (id, to_id, create_time, amount)
VALUES (1, 100, PENDING_COMMIT_TIMESTAMP(), 200);

Buat node Account tailing terlebih dahulu, lalu buat edge Transfer.

Edge keluar yang usang melanggar hubungan induk-turunan

Pesan error

Integrity constraint violation during DELETE/REPLACE. Found child row [...] in table AccountTransferAccount

Deskripsi

Tabel tepi AccountTransferAccount adalah tabel node INTERLEAVED INTO PARENT Account dan node Account yang akan dihapus masih memiliki tepi keluar yang terpasang ke node tersebut.

Contoh error

DELETE FROM Account WHERE id = 1;

Hapus semua edge Transfer keluar terlebih dahulu, lalu hapus node Account. Atau, tentukan ON DELETE CASCADE untuk INTERLEAVE dan membuat Spanner akan otomatis menghapusnya tepi.

Edge masuk yang usang melanggar hubungan induk-turunan

Pesan error

Foreign key constraint violation when deleting or updating referenced row(s): referencing row(s) found in table AccountTransferAccount

Deskripsi

Tabel edge AccountTransferAccount merujuk pada tabel node Account melalui ForeignKey, dan node Account yang akan dihapus masih memiliki tepi yang akan muncul yang melekat padanya.

Contoh error

DELETE FROM Account WHERE id = 1;

Hapus semua edge Transfer yang masuk terlebih dahulu, lalu hapus node Account. Atau, tentukan ON DELETE CASCADE untuk ForeignKey dan minta Spanner untuk otomatis menghapus edge tersebut.