Spring Boot 輕易訪問Neo4j

在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 ==================
相關文章
相關標籤/搜索