在Spring Boot中訪問Neo4j,經過Spring Data Neo4j能夠輕易地實現。java
例如,現有以下圖所示的數據模型:spring
這表示有兩個節點:用戶和組,而且這兩個節點的關係是從屬關係,即用戶從屬於組。數據庫
根據這個數據模型,使用Spring Data Neo4j進行建模。服務器
首先,在項目工程中引用Spring Boot的依賴,以下所示:session
<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的依賴,以下所示:dom
<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進行建模和實現數據持久化。ide
用戶節點建模:spring-boot
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; } }
數據持久化設計:ui
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 ==================