Praktik terbaik untuk menyesuaikan kueri Grafik Spanner

Dokumen ini menjelaskan praktik terbaik untuk menyesuaikan performa kueri Spanner Graph, yang mencakup pengoptimalan berikut:

  • Hindari pemindaian penuh tabel input untuk node dan edge.
  • Kurangi jumlah data yang perlu dibaca kueri dari penyimpanan.
  • Mengurangi ukuran data perantara.

Mulai dari node kardinalitas yang lebih rendah

Tulis traversal jalur sehingga dimulai dengan node kardinalitas yang lebih rendah. Pendekatan ini membuat kumpulan hasil perantara tetap kecil, dan mempercepat eksekusi kueri.

Misalnya, kueri berikut memiliki semantik yang sama:

  • Penjelajahan tepi maju:

    GRAPH FinGraph
    MATCH (p:Person)-[:Owns]->(a:Account)
    WHERE p.name = "Alex"
      AND a.is_blocked
    RETURN p.id AS person_id, a.id AS account_id;
    
  • Traversal tepi terbalik:

    GRAPH FinGraph
    MATCH (a:Account)<-[:Owns]-(p:Person)
    WHERE p.name = "Alex"
      AND a.is_blocked
    RETURN p.id AS person_id, a.id AS account_id;
    

Dengan asumsi bahwa ada lebih sedikit orang dengan nama Alex daripada akun yang diblokir, sebaiknya tulis kueri ini di traversal edge maju.

Memulai dari node kardinalitas yang lebih rendah sangat penting untuk traversal jalur panjang variabel. Contoh berikut menunjukkan cara yang direkomendasikan untuk menemukan akun yang ditransfer secara transitif dari akun tertentu dalam tiga hop.

GRAPH FinGraph
MATCH (:Account {id: 7})-[:Transfers]->{1,3}(a:Account)
RETURN a.id;

Menentukan semua label secara default

Spanner Graph menyimpulkan node dan label tepi yang memenuhi syarat jika label dihilangkan. Sebaiknya tentukan label untuk semua node dan tepi jika memungkinkan, karena inferensi ini mungkin tidak selalu dapat dilakukan dan dapat menyebabkan lebih banyak label daripada yang diperlukan untuk dipindai.

Satu pernyataan MATCH

Contoh berikut menemukan akun yang ditautkan oleh maksimal 3 transfer dari akun yang diberikan:

GRAPH FinGraph
MATCH (src:Account {id: 7})-[:Transfers]->{1,3}(dst:Account)
RETURN dst.id;

Di seluruh pernyataan MATCH

Tentukan label pada node dan edge jika merujuk ke elemen yang sama, tetapi terdapat di seluruh pernyataan MATCH.

Contoh berikut menunjukkan pendekatan yang direkomendasikan ini:

GRAPH FinGraph
MATCH (acct:Account {id: 7})-[:Transfers]->{1,3}(other_acct:Account)
RETURN acct, COUNT(DISTINCT other_acct) AS related_accts
GROUP BY acct

NEXT

MATCH (acct:Account)<-[:Owns]-(p:Person)
RETURN p.id AS person, acct.id AS acct, related_accts;

Langkah selanjutnya