This version is still in development and is not considered stable yet. For the latest stable version, please use Spring Data Neo4j 7.5.2!

Neo4j Vector Search

The @VectorSearch annotation

Spring Data Neo4j supports Neo4j’s vector search on the repository level by using the @VectorSearch annotation. For this to work, Neo4j needs to have a vector index in place. How to create a vector index is explained in the Neo4j documentation.

It’s not required to have any (Spring Data) Vector typed property be defined in the domain entities for this to work because the search operates exclusively on the index.

The @VectorSearch annotation requires two arguments: The name of the vector index to be used and the number of nearest neighbours.

For a general vector search over the whole domain, it’s possible to use a derived finder method without any property.

interface VectorSearchRepository extends Neo4jRepository<EntityWithVector, String> {

    @VectorSearch(indexName = "entityIndex", numberOfNodes = 2)
    List<EntityWithVector> findBy(Vector searchVector);

}

The vector index can be combined with any property-based finder method to filter down the results.

For technical reasons, the vector search will always be executed before the property search gets invoked. E.g. if the property filter looks for a person named "Helge", but the vector search only yields "Hannes", there won’t be a result.
interface VectorSearchRepository extends Neo4jRepository<EntityWithVector, String> {

    @VectorSearch(indexName = "entityIndex", numberOfNodes = 1)
    List<EntityWithVector> findByName(String name, Vector searchVector);

}