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)
);
Perbaikan yang direkomendasikan
Buat indeks unik pada kolom kunci elemen dan tentukan 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
);
Perbaikan yang direkomendasikan
Gunakan nama unik untuk definisi tepi.
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)
);
Perbaikan yang direkomendasikan
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)
);
Perbaikan yang direkomendasikan
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)
);
Perbaikan yang direkomendasikan
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)
);
Perbaikan yang direkomendasikan
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;
Perbaikan yang direkomendasikan
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;
Perbaikan yang direkomendasikan
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 hanya dapat digunakan dalam klausa WHERE
terluar dari MATCH
.
Contoh error
GRAPH FinGraph
LET account_id = 1
MATCH (n:Account {id: account_id})
RETURN n.id;
Perbaikan yang direkomendasikan
GRAPH FinGraph
LET account_id = 1
MATCH (n:Account)
WHERE n.id = account_id
RETURN n.id;
Menentukan ulang variabel grafik yang 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 mungkin ditafsirkan sebagai mereferensikan elemen grafik yang sama dengan cakupan luar atau sebagai pengikatan ke elemen grafik baru, yang menyamarkan nama cakupan luar. Penetapan 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;
Perbaikan yang direkomendasikan
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 di Menyiapkan dan membuat kueri 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
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 yang berbeda yang disebarkan di seluruh pernyataan akan menghasilkan output yang berbeda
Deskripsi
Dalam bahasa kueri grafik, variabel yang dideklarasikan beberapa kali merujuk pada elemen grafik yang sama di semua kemunculan.
Dalam Contoh 1, tidak ada node Account
yang id
-nya adalah 7
dan 16
. Akibatnya, hasil kosong akan ditampilkan.
Pada Contoh 2, nama n
tidak ditampilkan dari pernyataan sebelumnya
(hanya id
yang ditampilkan). Jadi, MATCH
kedua menemukan node Account
yang
id
-nya adalah 16
.
Contoh masalah
Contoh berikut memiliki output yang berbeda karena variabel yang berbeda di-propagasi 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 berikutnya yang bukan LIMIT
Deskripsi
Dalam bahasa kueri grafik, pernyataan ORDER BY
diabaikan kecuali jika salah satu
hal berikut benar:
ORDER BY
adalah pernyataan terakhir.ORDER BY
langsung diikuti olehLIMIT
.
Dalam Contoh 1, LIMIT
tidak langsung mengikuti ORDER BY
; LIMIT
akhir dipisahkan. Artinya, ORDER BY
diabaikan oleh mesin.
Dalam Contoh 2, ORDER BY
berlaku karena LIMIT
langsung mengikuti
ORDER BY
.
Contoh masalah
Contoh berikut memiliki output yang berbeda karena pernyataan ORDER BY
diabaikan saat 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 tepi yang berbeda menghasilkan output yang berbeda
Deskripsi
Dalam set data yang digunakan dalam contoh error, pola tepi arah ANY
cocok dengan setiap tepi Transfers
dalam grafik dua kali.
Pada Contoh 1, tepi 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 dalam Contoh 2, dengan n=Account(id=x)
dan m=Account(id=y)
.
Akibatnya, kueri dalam Contoh 1 menampilkan 10
dan kueri dalam Contoh 2
menampilkan 5
.
Contoh masalah
Contoh berikut memiliki output 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 di Menyiapkan dan membuat 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 tepi AccountTransferAccount
adalah tabel
INTERLEAVED INTO PARENT Account node
. 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);
Perbaikan yang direkomendasikan
Buat node Account
utama terlebih dahulu, lalu buat tepi Transfer
.
Node tujuan yang 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
yang disebut 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);
Perbaikan yang direkomendasikan
Buat node Account tailing terlebih dahulu, lalu buat edge Transfer
.
Tepi keluar yang tidak memiliki induk 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;
Perbaikan yang direkomendasikan
Hapus semua tepi Transfer
keluar terlebih dahulu, lalu hapus node Account
.
Atau, tentukan
ON DELETE CASCADE
untuk INTERLEAVE
dan minta Spanner untuk otomatis menghapus
edge tersebut.
Tepi masuk yang tidak memiliki induk 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 tepi AccountTransferAccount
merujuk ke tabel node Account
melalui
ForeignKey
, dan node Account
yang akan dihapus masih memiliki tepi masuk
yang terpasang padanya.
Contoh error
DELETE FROM Account WHERE id = 1;
Perbaikan yang direkomendasikan
Hapus semua tepi Transfer
yang masuk terlebih dahulu, lalu hapus node Account
.
Atau, tentukan ON DELETE CASCADE
untuk ForeignKey
dan minta Spanner untuk otomatis menghapus
edge tersebut.