在 graph database 中有以下幾筆 Movie 的資料,假設我要找出片名有 Fa 此字眼的 Movie
Movie node entity 內容如下:
package neo4j.springdata.vo;
import org.neo4j.ogm.annotation.GeneratedValue;
import org.neo4j.ogm.annotation.Id;
import org.neo4j.ogm.annotation.Index;
import org.neo4j.ogm.annotation.NodeEntity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
@NodeEntity
@Data
@NoArgsConstructor
@RequiredArgsConstructor
@AllArgsConstructor
public class Movie {
@Id
@GeneratedValue
private Long id;
@Index(unique = true)
@NonNull
private String name;
}
Repository interface / class 內容如下:
package neo4j.springdata.repository;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import neo4j.springdata.repository.custom.MovieRepositoryCustom;
import neo4j.springdata.vo.Movie;
@Repository
public interface MovieRepository extends CrudRepository<Movie, Long>, MovieRepositoryCustom {
}
package neo4j.springdata.repository.custom;
import java.util.List;
import neo4j.springdata.vo.Movie;
public interface MovieRepositoryCustom {
List<Movie> findSimilarName(String name);
}
package neo4j.springdata.repository.impl;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.neo4j.ogm.session.Session;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.google.common.collect.ImmutableList;
import neo4j.springdata.repository.custom.MovieRepositoryCustom;
import neo4j.springdata.vo.Movie;
@Component
public class MovieRepositoryImpl implements MovieRepositoryCustom {
@Autowired
private Session session;
@Override
public List<Movie> findSimilarName(String name) {
String cypher = "match (m:Movie) where m.name =~ {name} return m";
Map<String, Object> params = new HashMap<>();
params.put("name", ".*" + name + ".*");
Iterable<Movie> result = session.query(Movie.class, cypher, params);
return ImmutableList.copyOf(result);
}
}
Service class 內容如下:
package neo4j.springdata.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import neo4j.springdata.repository.MovieRepository;
import neo4j.springdata.vo.Movie;
@Service
public class MovieService {
@Autowired
private MovieRepository movieRepo;
@Transactional
public void createMovies(List<Movie> movies) {
movieRepo.saveAll(movies);
}
public List<Movie> findSimilarName(String name) {
return movieRepo.findSimilarName(name);
}
}
Client class 內容如下:
package neo4j.springdata;
import java.util.List;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.Bean;
import org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories;
import lombok.extern.slf4j.Slf4j;
import neo4j.springdata.service.MovieService;
import neo4j.springdata.vo.Movie;
@SpringBootApplication
@EnableNeo4jRepositories("neo4j.springdata.repository")
@EntityScan(basePackages = "neo4j.springdata.vo")
@Slf4j
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
@Bean
CommandLineRunner createCustomQuery(MovieService movieService) {
return args -> {
List<Movie> movies = movieService.findSimilarName("Fa");
log.info("movies = " + movies.toString());
};
}
}
pom.xml 內容如下:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>neo4j</groupId>
<artifactId>springdata</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>springdata</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-neo4j</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>23.0</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.7.Final</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<repositories>
<repository>
<id>spring-libs-release</id>
<name>Spring Releases</name>
<url>https://repo.spring.io/libs-release</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>