Apa yang Anda coba lakukan di sini adalah indeks terbalik.
Untuk setiap kolom, buat petanya ke "set". Kemudian, Anda dapat memotong set untuk mendapatkan hasilnya.
Jadi, APPLE: RED ROUND FRUIT
akan memetakan ke sisipan berikut:
SADD p1:RED APPLE
SADD p2:ROUND APPLE
SADD p3:FRUIT APPLE
Lalu, misalkan saya ingin menanyakan * ROUND FRUIT
, saya akan melakukan:
SINTER p2:ROUND p3:FRUIT
Perintah ini mengambil persimpangan item di p2:ROUND
set dan p3:FRUIT
mengatur. Ini akan mengembalikan semua item yang ROUND
dan FRUIT
, tidak peduli apa p1
adalah.
Beberapa contoh lain:
SMEMBERS p1:GREEN
SINTER p1:RED p2:ROUND p3:FRUIT
SUNION p1:RED p1:GREEN
Jawaban saya di atas akan menggunakan beberapa kekuatan komputasi karena operasi persimpangan adalah O(N*M)
. Berikut adalah cara melakukannya yang lebih intensif memori, tetapi akan memiliki pengambilan lebih cepat karena secara efektif menghitung indeks sebelumnya.
Untuk setiap kombinasi properti, buat kunci yang menyimpan satu set:
Jadi, APPLE: RED ROUND FRUIT
akan memetakan ke sisipan berikut:
SADD RED:ROUND:FRUIT APPLE
SADD :ROUND:FRUIT APPLE
SADD RED::FRUIT APPLE
SADD RED:ROUND: APPLE
SADD RED:: APPLE
SADD :ROUND: APPLE
SADD ::FRUIT APPLE
SADD ::: APPLE
Kemudian, untuk query, Anda cukup mengakses kunci masing-masing. Misalnya, * ROUND FRUIT
hanya akan menjadi
SMEMBERS :ROUND:FRUIT
Jelas, ini tidak berskala sama sekali dalam hal memori ketika Anda memiliki banyak dimensi, tetapi akan sangat cepat untuk mengambil hasil.