Saya memiliki pertanyaan naif mengenai penggunaan kata kunci DISTINCT. Jadi pada dasarnya saya memiliki grafik (Pengguna-[Suka]->Item) dengan jutaan node. Saya ingin menemukan pengguna berbeda yang menyukai item tertentu. Dua kueri berikut memiliki perbedaan kinerja yang signifikan, dan saya bingung. Saya membuat indeks :Item(id) dan :User(id).

Pertanyaan 1:

profile match (a:Item {id:'001'})<-[:LIKES]-(u:User)
return  count(distinct u);

Pertanyaan 2:

profile match (a:Item {id:'001'})<-[:LIKES]-(u:User)
return  distinct u;

Kueri pertama mengembalikan hasil dalam hitungan detik, tetapi kueri kedua terus berjalan selama lebih dari 5 menit dan saya kehilangan kesabaran dan menghentikan kueri. Saya pikir kueri kedua akan lebih cepat daripada kueri pertama karena tidak ada operasi agregasi hitungan, jadi saya tidak mengerti perbedaan kinerja.

1
Idealist 2 Juni 2016, 22:11
2
Bukankah kueri pertama mengembalikan satu angka, sedangkan kueri kedua mengembalikan kemungkinan ribuan (atau jutaan?) node?
 – 
David Makogon
2 Juni 2016, 23:06
Anda harus menjalankan kueri kedua dari driver, atau menambahkan LIMIT 100 atau lebih di akhir.
 – 
Michael Hunger
3 Juni 2016, 02:01

1 menjawab

Jawaban Terbaik

Kueri pertama Anda hanya mengembalikan jumlah nilai berbeda yang merupakan pekerjaan mudah bagi neo4j.

Sedangkan kueri kedua Anda mengembalikan semua node yang berbeda, jika database Anda memiliki terlalu banyak nilai berbeda, itu akan memakan waktu lama. Jika Anda hanya ingin melihat sekilas beberapa nilai yang berbeda, Anda dapat menambahkan limit ke kueri Anda.

Misalnya:

profile match (a:Item {id:'001'})<-[:LIKES]-(u:User)
return  distinct u 
limit 5;

Ini mengembalikan (acak) lima pengguna yang like Item('001').

2
Tim Kuehn 3 Juni 2016, 14:23
Sekarang saya mengerti. Namun, alih-alih mencantumkan jumlah yang berbeda, tugas saya adalah membuat daftar semua pengguna yang berbeda dan menyimpannya di tempat yang sama untuk diproses. Apakah itu berarti saya harus menunggu sampai kueri selesai? Apakah ada alternatif cara yang lebih efisien? Terima kasih!
 – 
Idealist
3 Juni 2016, 18:17