Neo4j是一種開源的NoSQL圖數據庫,將數據以圖(把一個個實體看成節點,鏈接節點的邊表示節點間的關係)的形式保存,Neo4j也支持ACID事務管理。關係型數據庫數據訪問採用的是ORM(對象關係映射),而Neo4j數據庫採用的是OGM(對象圖形映射, Object Graph Mapper)。java
與SDN相匹配的jar包版本spring
使用Spring Data Neo4j 4.2.x版的需求:數據庫
JDK1.8及以上版本session
Neo4j Graph DataBase 2.3.x及以上版本app
Spring Framework 4.3.9RELEASE及以上版本框架
使用OGM時確保版本在2.1.1+RELEASEdom
版本控制ide
Spring Data Neo4j 4.2及之後的版本的配置,更加簡便。不須要在配置類中繼承Neo4jConfiguration,也不須要定義SessionBean。而是定義SessionFactory和Neo4jTransactionManager的對象bean。鏈接Neo4j時,SDN建立session(org.neo4j.ogm.session.Session)實例時,須要聲明SessionFactory.當SessionFactory被建立,它設置了OGM的元數據,使用它來建立全部的Session,同時packages to scan for domain object 元數據須要提供給SessionFactory的構造函數。,@EnableTransactionManagement是用來申明Neo4jTransactionManager的,配置SDN的事物,配置SessionFactory Bean是爲了申明OGM的配置,以下圖:函數
使用JPA代理實現repository的configthis
聲明一個Spring Data JPA的依賴
neo4j應用
neo4j的driver有三種:Embedd(內嵌式),HTTP以及二進制協議Bolt
OGM(Object Graph Mapper)neo4j數據庫的節點與java實體創建映射關係
SDN在頂端爲OGM提供語法以及代碼,創建基於Spring的Neo4j/OGM的應用
添加依賴
spring-data-neo4j
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-neo4j</artifactId>
<version>{version}</version>
</dependency>
添加dirver的依賴,三種:embedded-driver,http-driver,bolt-driver
<!-- add this dependency if you want to use the embedded driver -->
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-ogm-embedded-driver</artifactId>
<version>{ogm-version}</version>
</dependency>
<!-- add this dependency if you want to use the HTTP driver -->
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-ogm-http-driver</artifactId>
<version>{ogm-version}</version>
</dependency>
<!-- the neo4j-ogm-test jar provides access to the http and embedded drivers for testing purposes -->
<dependency> <groupId>org.neo4j</groupId> <artifactId>neo4j-ogm-test</artifactId> <version>${neo4j-ogm.version}</version> <type>test-jar</type> <scope>test</scope> </dependency>
<dependency> <groupId>org.neo4j</groupId> <artifactId>neo4j-kernel</artifactId> <version>${neo4j.version}</version> <type>test-jar</type> </dependency>
<dependency> <groupId>org.neo4j.app</groupId> <artifactId>neo4j-server</artifactId> <version>${neo4j.version}</version> <type>test-jar</type> </dependency>
<dependency> <groupId>org.neo4j.test</groupId> <artifactId>neo4j-harness</artifactId> <version>${neo4j.version}</version> <scope>test</scope> </dependency>
driver的配置,SDN會自動掃描ogn.properties文件,也能夠經過java Configuration來配置,其中<driver>對應依賴中申明的driver,<uri>對應對應neo4j數據庫連接地址(http://username:password@localhost:7474)以下:
import org.neo4j.ogm.config.Configuration;
@Bean
public Configuration configuration() {
Configuration config = new Configuration();
config .driverConfiguration() .setDriverClassName("org.neo4j.ogm.drivers.<driver>.driver.<driver>Driver") .setURI("<uri>");
return config;
}
@Bean
public SessionFactory sessionFactory() {
return new SessionFactory(configuration(), <packages> );
}
Neo4j OGM支持
OGM將圖數據庫中的節點和關係與域模型中的對象和引用映射起來,節點與對象實例映射起來,而對象引用與關係映射起來。OGM抽象化了數據庫,提供一種方便的方式在圖數據庫持久化域模型(domain model),而且查詢不須要使用低級別的驅動。
Session用於驅動對象圖映射框架。全部存儲庫實現都是由Session驅動的。它跟蹤對實體及其關係所作的更改,這樣作的好處是,只須要保存修改的部分。
Neo4j Repositories使用
@Repository
public interface PersonRepository extends Neo4jRepository<Person, Long> {}
public class MySpringBean {
@Autowired private PersonRepository repo;
...
} // then you can use the repository as you would any other object
Person michael = repo.save(new Person("Michael", 36));
Person dave = repo.load(123);
long numberOfPeople = repo.count();
Mapping Query Results
public interface MovieRepository extends GraphRepository<Movie> {
@Query("MATCH (movie:Movie)-[r:RATING]\->(), (movie)<-[:ACTS_IN]-(actor:Actor) " + "WHERE movie.id={0} " + "RETURN movie as movie, COLLECT(actor) AS 'cast', AVG(r.stars) AS 'averageRating'")
MovieData getMovieData(String movieId);
@QueryResult
public class MovieData {
Movie movie;
Double averageRating;
Set<Actor> cast;
}
}
Neo4j是一種事務型數據庫。對全部與SDN交互的方法標定@Transactional
@Service
class UserManagementImpl implements UserManagement {
private final UserRepository userRepository;
private final RoleRepository roleRepository;
@Autowired
public UserManagementImpl(UserRepository userRepository, RoleRepository roleRepository) {
this.userRepository = userRepository;
this.roleRepository = roleRepository;
}
@Transactional
public void addRoleToAllUsers(String roleName) {
Role role = roleRepository.findByName(roleName);
for (User user : userRepository.findAll()) {
user.addRole(role);
userRepository.save(user);
}
}
Driver Configuration
Annotating Entities