Does Neo4j GraphRAG Support Multiple Vector Indexes?

Hello Neo4j Community,
I am currently working with Neo4j GraphRAG and exploring its capabilities for multi-vector index retrieval in an LLM-powered system. I have referred to the official documentation (Neo4j GraphRAG User Guide), which demonstrates how to use a single vector index with VectorRetriever . However, I need clarification on using multiple vector indexes in a single query.

Questions:

  1. Does Neo4j GraphRAG natively support querying multiple vector indexes simultaneously?
  • If yes, what is the recommended approach?
  • If not, is there a roadmap for adding this feature?
  1. The MultiVectorRetriever class appears in the library but is not mentioned in the documentation.
  • Is this officially supported? If so, how should it be used?
  1. What is the best practice for querying multiple indexes?
  • I am currently initializing multiple VectorRetriever instances (one per index) and manually merging the results before passing them to GraphRAG .
  • Is this the best way to handle multiple indexes, or is there an alternative method?
  1. Does Neo4j support hybrid retrieval combining multiple vector indexes with full-text search?
  • If yes, how can we efficiently merge the results?

Context:

  • I am using SentenceTransformers for embeddings.
  • My LLM is Mistral.
  • I have three different vector indexes (transactions, accounts, illicit transactions) that I want to search across simultaneously.

Any guidance, best practices, or code examples would be greatly appreciated. Thanks in advance! :raising_hands:

Hello! I'm not aware of any frameworks, libraries, or tools that currently allow us to query against multiple vector indexes in a single query. As far as I know, we have to query each vector index separately and combine them afterwards, as you mentioned. I'd love to see this capability in the future, though! :sweat_smile:

Is a langchain retriever defined as:

Retrieve from a set of multiple embeddings for the same document

... it isn't "multiple vector indexes".

Not sure why do you need 3 different vectors ?, as far as i can see "transactions and illicit transactions" are in the same index with just a dimension that differentiates "good" from "bad", and "accounts" are connected to all transactions ...

(A:Account { id:'abc' } )-[:has]->(T:Transaction { id: "123", valid: true|false } )