在Spring Boot中访问Neo4j,通过Spring Data Neo4j可以轻易地实现。
例如,现有如下图所示的数据模型:
这表示有两个节点:用户和组,并且这两个节点的关系是从属关系,即用户从属于组。
根据这个数据模型,使用Spring Data Neo4j进行建模。
首先,在项目工程中引用Spring Boot的依赖,如下所示:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.2.RELEASE</version>
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
然后,在Neo4j模块引用Neo4j的依赖,如下所示:
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-neo4j</artifactId>
</dependency>
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-ogm-embedded-driver</artifactId>
<version>2.0.5</version>
</dependency>
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-ogm-bolt-driver</artifactId>
<version>2.0.5</version>
</dependency>
</dependencies>
上面依赖包下载完成后,就可以使用Spring Data Neo4j进行建模和实现数据持久化。
用户节点建模:
package com.demo.neo4j.domain;
import org.neo4j.ogm.annotation.GraphId;
import org.neo4j.ogm.annotation.NodeEntity;
import org.neo4j.ogm.annotation.Relationship;
@NodeEntity
public class User {
@GraphId
private Long id;
private String name;
@Relationship(type = "从属", direction = Relationship.OUTGOING)
private Group group;
public User() {
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Group getGroup() {
return group;
}
public void setGroup(Group group) {
this.group = group;
}
}
组节点建模:
package com.demo.neo4j.domain;
import org.neo4j.ogm.annotation.GraphId;
public class Group {
@GraphId
private Long id;
private String name;
public Group() {
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
数据持久化设计:
package com.demo.neo4j.repository;
import com.demo.neo4j.domain.User;
import org.springframework.data.neo4j.repository.GraphRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends GraphRepository<User> {
User findByName(String name);
}
为了让上面设计生效,需要对使用的Spring Data Neo4j进行配置:
package com.demo.neo4j.config;
import org.neo4j.ogm.session.SessionFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.neo4j.config.Neo4jConfiguration;
import org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
@EnableNeo4jRepositories(basePackages = { "com.demo.neo4j.repository" })
@EnableTransactionManagement
public class Neo4jConfig extends Neo4jConfiguration {
@Override
public SessionFactory getSessionFactory() {
return new SessionFactory("com.demo.neo4j.domain");
}
}
连接Neo4j数据库,可以使用2.x或3.x版本,或者不用安装服务器,直接使用嵌入式数据库。
使用嵌入式方式连接数据库,编辑如下内容到ogm.properties文件,并将文件保存到资源目录中:
compiler=org.neo4j.ogm.compiler.MultiStatementCypherCompiler
driver=org.neo4j.ogm.drivers.embedded.driver.EmbeddedDriver
URI=file:///test/graph.db
最后使用如下测试用例进行测试:
package com.demo.neo4j.test;
import com.demo.neo4j.config.Neo4jConfig;
import com.demo.neo4j.domain.Group;
import com.demo.neo4j.domain.User;
import com.demo.neo4j.repository.UserRepository;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.util.Assert;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {Neo4jConfig.class})
public class Neo4jTest {
private static Logger log = LoggerFactory.getLogger(Neo4jTest.class);
@Autowired
private UserRepository userRepository;
@Before
public void addData() {
Group group = new Group();
group.setName("admins");
User user = new User();
user.setName("admin");
user.setGroup(group);
userRepository.save(user);
Assert.notNull(user.getId());
}
@Test
public void getData() {
User user = userRepository.findByName("admin");
Assert.notNull(user);
log.info("\n================== user name={}; group name={} ==================",
user.getName(), user.getGroup().getName());
}
}
运行测试用例通过,并可看到如下结果:
================== user name=admin; group name=admins ==================