Det, du prøver at gøre her, er et omvendt indeks.
For hver kolonne skal du få den til at blive "sæt". Derefter kan du krydse sættene for at få resultatet.
Så APPLE: RED ROUND FRUIT
vil knyttes til følgende indsættelser:
SADD p1:RED APPLE
SADD p2:ROUND APPLE
SADD p3:FRUIT APPLE
Lad os så sige, at jeg vil forespørge efter * ROUND FRUIT
, jeg ville gøre:
SINTER p2:ROUND p3:FRUIT
Denne kommando tager skæringspunktet mellem elementerne i p2:ROUND
set og p3:FRUIT
sæt. Dette vil returnere alle de varer, der er ROUND
og FRUIT
, ligeglad med hvad p1
er.
Nogle andre eksempler:
SMEMBERS p1:GREEN
SINTER p1:RED p2:ROUND p3:FRUIT
SUNION p1:RED p1:GREEN
Mit svar ovenfor kommer til at bruge noget regnekraft, fordi skæringsoperationen er O(N*M)
. Her er en måde at gøre det på, der er mere hukommelsesintensiv, men vil have hurtigere hentning, fordi den effektivt forudberegner indekserne.
For hver kombination af egenskaber skal du lave en nøgle, der gemmer et sæt:
Så APPLE: RED ROUND FRUIT
vil knyttes til følgende indsættelser:
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
Derefter, for at forespørge, skal du blot få adgang til den respektive nøgle. For eksempel * ROUND FRUIT
ville simpelthen være
SMEMBERS :ROUND:FRUIT
Dette skalerer naturligvis ikke godt med hensyn til hukommelse, når du har mange dimensioner, men det vil være ekstremt hurtigt at hente resultater.