Praktik terbaik untuk menyesuaikan kueri Spanner Graph

Dokumen ini menjelaskan praktik terbaik untuk menyesuaikan kueri Grafik Spanner performa, 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 path traversal agar dimulai dengan node kardinalitas yang lebih rendah. Pendekatan ini membuat kumpulan hasil perantara tetap kecil, dan mempercepat kueri dalam proses eksekusi.

Misalnya, kueri berikut memiliki semantik yang sama:

  • {i>Forward edge traversal<i} (traversal 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;
    
  • Reverse edge traversal:

    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 dibandingkan dengan yang ada akun yang diblokir, sebaiknya Anda menulis kueri ini di kolom {i>edge traversal<i}.

Memulai dari node kardinalitas yang lebih rendah sangat penting untuk {i>variabel-length path traversal<i}. 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;

Tentukan semua label secara default

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

Satu pernyataan MATCH

Contoh berikut menemukan akun yang ditautkan dengan 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

Menentukan label pada node dan edge jika merujuk pada elemen yang sama tetapi 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