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
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
);
Perbaikan yang direkomendasikan
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)
);
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 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;
Perbaikan yang direkomendasikan
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;
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 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 olehLIMIT
.
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);
Perbaikan yang direkomendasikan
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);
Perbaikan yang direkomendasikan
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;
Perbaikan yang direkomendasikan
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;
Perbaikan yang direkomendasikan
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.