Eddy,
the use of indexes or in-memory structure is a tradeoff of a number of things. Indexes take some time to create, they consume IO since they are persistent on disk, but they are normally only expensive the first time, after that they are faster when treating bigger amounts of data. With millions of indexes, you are going to
1. create a LOT of files, which runs into IO problems
2. Duplicate the data since it is stored in different shapes for the different indexes, increasing your storage, IO and memory overhead
3. Have a harder time keeping all these indexes in sync with changed data (one update to a person might result in 100 indexes to be updated) which slows down write performance.
In short, use indexes for predictable, bigger amounts of your data where you have an idea that you need them repeatedly queried in the same way. (like structure at the beginning or end of traversals)
Caches or filters tend to be more appropriate when you don't need persistent structures, and don't know much on how you are going to query the graph, since there is no penalty for different queries or IO. However, they tend to scale less and involve sequential scans of the data, which doesn't scale.
In short, use caches and filters/iterators for data that is highly unpredictable, not too big and will likely change every time you access it (like structures in the middle of traversals)
HTH