SoFunction
Updated on 2025-04-14

Spring Data Neo4j implements multiple ways to complex query

1. Use custom query

Custom queries allow you to write Cypher queries directly and map them to methods.

1. Modify Repository

In your Repository interface, use the @Query annotation to write complex Cypher queries. For example, suppose we have a Person entity that wants to query people related to a specific node based on a certain condition.

import ..Neo4jRepository;
import .;

import ;

public interface PersonRepository extends Neo4jRepository<Person, Long> {

    @Query("MATCH (p:Person)-[:FRIENDS_WITH]->(friend:Person) WHERE  = $name RETURN friend")
    List<Person> findFriendsByName(String name);
}

2. How to use

Use this custom query in the service layer:

import ;
import ;

import ;

@Service
public class PersonService {
    private final PersonRepository personRepository;

    @Autowired
    public PersonService(PersonRepository personRepository) {
         = personRepository;
    }

    public List<Person> getFriends(String name) {
        return (name);
    }
}

2. Use method naming query

Spring Data Neo4j allows automatic queries to be generated through method naming conventions. This works for simpler queries, but multiple conditions can be combined.

1. Define query method

import ..Neo4jRepository;

import ;

public interface PersonRepository extends Neo4jRepository<Person, Long> {

    List<Person> findByAgeGreaterThan(int age);
    List<Person> findByNameAndAge(String name, int age);
}

2. Use query methods

Call these methods in the service layer:

public List<Person> findAdults() {
    return (18);
}

public List<Person> findByNameAndAge(String name, int age) {
    return (name, age);
}

3. Use Cypher query language

For more complex queries, use@QueryAnnotated Cypher query is the most flexible choice.

1. Complex Cypher query

Suppose you want to find all friends of a user, and those friends are older than a certain value.

@Query("MATCH (p:Person)-[:FRIENDS_WITH]->(friend:Person) " +
       "WHERE  = $name AND  > $age " +
       "RETURN friend")
List<Person> findFriendsByNameAndAge(String name, int age);

2. Use query

Use this method in the service layer:

public List<Person> getFriendsOlderThan(String name, int age) {
    return (name, age);
}

4. Handle complex relationships

If your query involves multiple relationships, you can useMATCHStatements combine multiple conditions.

1. Example

Suppose you have onePersonNode and oneCitynode, and want to find friends who live in a specific city.

@Query("MATCH (p:Person)-[:FRIENDS_WITH]->(friend:Person), (friend)-[:LIVES_IN]->(city:City) " +
       "WHERE  = $cityName RETURN friend")
List<Person> findFriendsLivingInCity(String cityName);

2. Use query

Call this method at the service layer:

public List<Person> getFriendsLivingInCity(String cityName) {
    return (cityName);
}

5. Summary

In Spring Data Neo4j, methods to implement complex queries include:

  • Custom query:use@QueryWrite Cypher query directly by writing annotations.
  • Method naming query: Generate a simple query through method naming convention.
  • Combination query: Combining multiple conditions and relationships in a Cypher query.

Through the above methods, you can flexibly query the Neo4j database to meet complex data access needs. This allows you to take full advantage of graph databases when developing with Spring Boot. Hope this helps you better use Spring Data Neo4j!

This is the end of this article about Spring Data Neo4j's various ways to implement complex queries. For more relevant Spring Data Neo4j's complex queries, please search for my previous articles or continue browsing the related articles below. I hope everyone will support me in the future!