1. 程式人生 > >Spring Data Neo4j個人筆記

Spring Data Neo4j個人筆記

由於機緣巧合,原來要接手做一個和圖資料庫相關的外包專案。但是由於臨近畢業,各種壓力大,遂放棄。但是自己還是各種翻牆瞭解了一番Neo4j,我自己理解的Neo4j就是一個圖資料庫,它存在的目的就是類似一個引擎,使得一些巢狀級別高的,可以以更快的速度來獲取結果。僅僅是個人見解,不知道對不對。發現度娘很難找到自己需要的材料。就各種看官網網站,最後在這文章裡找到了一點材料,自己總結一下,有不對的地方,請指出。

1、Neo4j簡介

什麼是圖資料庫?

圖形資料庫是專門儲存和檢索大量資訊的儲存引擎。它能高效的儲存節點和關係,並且支援高效率的查詢這些結構。節點和關係中都可以增加屬性,一個節點可以沒有標籤,也可以有多個標籤,關係總是有向的,並且必須被命名。

圖形資料庫非常適合儲存大多數型別的實體模型,在幾乎所有的實體中,都存在著從一個實體到另外一個實體之間的關係。在其他建模方法中,事情之間的關係被減少到一直有一個單一的連線,並且沒有標識和屬性。圖資料庫支援將域內原有的豐富關係完好地儲存到資料庫中,而不訴諸於將關係建模為“事物”。將現實域對映到圖形資料庫時,很少有“阻抗不匹配”。

2、概述

入門

我們首先定義一些實體類和一些可選的註解。我們通過使用註解來對映節點和關係到圖資料庫中。Spring Data Neo4j 4.1(以下簡稱SDN 4.1)戲劇化的簡化了開發過程。但是一些設定自然還是需要的。為了構建應用,我們的構建工具需要包含Spring Data Neo4j的依賴。並且當構建完成之後,我們的Spring應用配置上Spring Data Neo4j。Spring Data Neo4j 4.x版本之後,不支援配置檔案來配置,需要引入註解來配置。這裡介紹通過使用Maven來構建該應用。先貼上一張自己新建的maven專案,並且相關的SpringMVC的依賴。

這裡寫圖片描述

Maven依賴

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <sdn.version>4.1.0.RELEASE</sdn.version>
        <neo4j-ogm.version>2.1.0</neo4j-ogm.version>
        <neo4j.version>3.1.0</neo4j.version>
        <spring.version
>
4.2.5.RELEASE</spring.version> <neo4j.ogm.version>2.1.0</neo4j.ogm.version> </properties> <dependencies> <!--Spring--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>${spring.version}</version> </dependency> <!--SDN--> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-neo4j</artifactId> <version>${sdn.version}</version> </dependency> <!--Neo4j--> <dependency> <groupId>org.neo4j</groupId> <artifactId>neo4j-kernel</artifactId> <version>${neo4j.version}</version> </dependency> <dependency> <groupId>org.neo4j.app</groupId> <artifactId>neo4j-server</artifactId> <version>${neo4j.version}</version> </dependency> <!-- Tests --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${spring.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.neo4j</groupId> <artifactId>neo4j-ogm-test</artifactId> <version>${neo4j-ogm.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.neo4j.test</groupId> <artifactId>neo4j-harness</artifactId> <version>${neo4j.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71

SDN 4.1預設的使用Http驅動來連線到Neo4j伺服器,並且你不需要將它宣告在一個獨立的依賴中。如果想要使用嵌入式的驅動到你的應用中,那麼你必須其他依賴,這裡就介紹Http驅動,因為嵌入式的就是用來測試的,想了解嵌入式的方式,可是去檢視英文文件。

Spring配置

Spring 4.x之後,不支援使用配置檔案來配置,可以使用Java bean配置。建議Spring Context繼承來Spring Data Neo4j的Neo4jConfiguration類。並且需要覆寫getSessionFactory()和getSession(),以便能夠提供需要的上下文。

package com.cjzheng.myfood;

import org.neo4j.ogm.session.Session;
import org.neo4j.ogm.session.SessionFactory;
import org.springframework.context.annotation.*;
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.cjzheng.myfood.repository")
@EnableTransactionManagement
@ComponentScan("com.cjzheng.myfood")
public class AppConfiguration extends Neo4jConfiguration {

    @Bean
    public SessionFactory getSessionFactory() {
        return new SessionFactory("com.cjzheng.myfood.domain");// with domain entity base package(s)
    }

    @Bean
    @Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
    public Session getSession() throws Exception {
        return super.getSession();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

驅動程式

SDN 4.1提供了多種不同的驅動程式,包括http driver、Embedded driver、Bolt driver。預設的SDN將會嘗試從classpath中一個被命名為ogm.properties的檔案裡讀取驅動的配置。這裡就介紹Http driver,通過Http的形式連線到Neo4j伺服器,這種形式適用於客戶端-服務端模型。

Properties file

driver=org.neo4j.ogm.drivers.http.driver.HttpDriver
URI=http://user:[email protected]:7474
  • 1
  • 2

域模型

這裡就是簡單的一個Actor模型,這裡要做的就是簡單連線上Neo4j伺服器,並且將它儲存。所以我們這裡不用涉及其他操作。

package com.cjzheng.myfood.domain;

import org.neo4j.ogm.annotation.GraphId;
import org.neo4j.ogm.annotation.NodeEntity;
import org.neo4j.ogm.annotation.Property;
import org.neo4j.ogm.annotation.Relationship;

import java.util.List;

@NodeEntity
public class Actor {

    @GraphId
    private Long nodeId;

    String id;
    String name;

    public Actor() {
    }

    public Actor(String id, String name) {
        this.id = id;
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

持久層

package com.cjzheng.myfood.repository;

import com.cjzheng.myfood.domain.Actor;
import org.springframework.data.neo4j.repository.GraphRepository;

/**
 * Created by zhengchaojie on 2017/1/7/0007.
 */
public interface ActorRepository extends GraphRepository<Actor> {
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

業務層

package com.cjzheng.myfood.service;

import org.neo4j.ogm.session.Session;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * Created by zhengchaojie on 2017/1/13/0013.
 */
@Service
public class Neo4jDBCleaner {
    @Autowired
    Session session;

    public void cleanDb() {
        session.purgeDatabase();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

Spring Junit測試

package com.cjzheng.myfood.test;

import com.cjzheng.myfood.PersistenceContext;
import com.cjzheng.myfood.domain.Actor;
import com.cjzheng.myfood.repository.ActorRepository;
import com.cjzheng.myfood.service.Neo4jDBCleaner;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {PersistenceContext.class})
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
public class Neo4jTest {

    @Autowired
    ActorRepository actorRepository;

    @Autowired
    Neo4jDBCleaner cleaner;

    @Test
    public void databaseShouldBeCleared() {
        System.out.println(actorRepository.getClass());
        Actor tomHanks = new Actor("1", "Tom Hanks");
        actorRepository.save(tomHanks);
        cleaner.cleanDb();
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
package com.cjzheng.myfood;

import org.neo4j.ogm.session.Session;
import org.neo4j.ogm.session.SessionFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
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("com.cjzheng.myfood.repository")
@EnableTransactionManagement
@ComponentScan("com.cjzheng.myfood")
public class PersistenceContext extends Neo4jConfiguration {

    @Override
    public SessionFactory getSessionFactory() {
        return new SessionFactory("com.cjzheng.myfood.domain");
    }

    @Override
    @Bean
    public Session getSession() throws Exception {
        return super.getSession();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

這裡寫圖片描述

相關推薦

Spring Data Neo4j個人筆記

由於機緣巧合,原來要接手做一個和圖資料庫相關的外包專案。但是由於臨近畢業,各種壓力大,遂放棄。但是自己還是各種翻牆瞭解了一番Neo4j,我自己理解的Neo4j就是一個圖資料庫,它存在的目的就是類似一個引擎,使得一些巢狀級別高的,可以以更快的速度來獲取結果。僅僅是個人見解,不知道對不對。發現度娘很難找到自己需

spring data mongo使用筆記

先列提綱,後續有時間再完善 1.配置 maven依賴   <dependency> <groupId>org.springframework.boot</groupId>

訪問Neo4j spring-data-neo4j入門 (二)@Query 複雜查詢

本文在訪問Neo4j spring-data-neo4j入門 (一) 基礎上成文,因此請先閱讀訪問Neo4j spring-data-neo4j入門 (一) 。 我們在上一篇提到使用@Query完成複雜查詢,如同我們的業務一樣,使用簡單的比較大小、日期範圍無法完成業務需要,特別是當我

Spring系列學習之Spring Data Neo4J資料訪問

英文原文:https://spring.io/projects/spring-data-neo4j 目錄 概述 特性 學習 文件 概述 該專案為Neo4j圖形資料庫提供Spring Data支援,包括帶註釋的POJO,SD-Repositories和Neo4j-Tem

Spring-Data-JPA 學習筆記(一)

作者:zeng1994 一、spring-data-jpa的簡單介紹 SpringData : Spring 的一個子專案。用於簡化資料庫訪問,支援NoSQL 和 關係資料儲存。其主要目標是使資料庫的訪問變得方便快捷。 SpringData

spring data neo4j 查詢超時問題

使用sdn查詢時,當資料量較大並且需要做全庫掃描時,很容易出現超時問題。丟擲如下異常: Exception in thread "main" com.sun.jersey.api.client.ClientHandlerException: java.ne

Spring Data Neo4j reference文件中關於@RelatedTo註解的注意事項

源於3.2.2的reference文件 22.5.5.基於結束節點(end node)區分關係 22.5.5. Discriminating Relationships Based On End Node Type ... Example 61. Discrimin

利用Spring Data Neo4j搭建推薦系統

本文作者Daniel Bartl是一位專案開發者,在這裡分享如何使用Spring Data Neo4j來構建推薦系統。Neo4j是一款非常流行的開源圖型NoSQL資料庫。它完全支援ACID資料庫事務屬性,由於其良好的圖形資料模型設計,Neo4j的速度非常快。對於連線的資料操作,Neo4j的速度要比傳統的關

通過Spring Data Neo4J操作您的圖形資料庫

在前面的一篇文章《圖形資料庫Neo4J簡介》中,我們已經對其內部所使用的各種機制進行了簡單地介紹。而在我們嘗試對Neo4J進行大版本升級時,我發現網路上並沒有任何成型的樣例程式碼以及簡介,而其自身的文件也對如何使用Spring Data Neo4J介紹得語焉不詳。因此在本文

SpringBoot學習筆記10——spring-data-jpa之分頁查詢

今天我們來學習一下spring-data-jpa的分頁查詢的實現 在上次初探JPA之後我們接下來學習分頁查詢,本篇部落格是接上一篇的,如果有需要了解jpa配置的話可以看上一篇部落格https://blog.csdn.net/lp840312696/article/details/83549937

SpringBoot學習筆記09——spring-data-jpa初探

大家對JPA的褒貶不一,如果想弄清楚JPA是什麼、值不值得用大家可以自行百度,博主這裡就不再多說,因為說可能也說不明白,所以話不多說直接講乾貨! 1.引入依賴 下邊是整個dao曾模組的pom檔案,世界上JPA的以來只有一個,已經添加了註釋 <?xml version="1.0" e

Spring-data-jpa:學習筆記(二)

       通過上一篇筆記的,我們掌握了SpringData的相關概念及簡單的用法。但上一篇筆記主要講的是Dao層介面直接繼承Repository介面,然後再自己定義方法。主要闡述了自定義方法時的一些規則及SpringData是如何

Spring-data-jpa:學習筆記(一)

一、spring-data-jpa的簡單介紹 SpringData : Spring 的一個子專案。用於簡化資料庫訪問,支援NoSQL 和 關係資料儲存。其主要目標是使資料庫的訪問變得方便快捷。 SpringData 專案所支援 NoSQL 儲存:  MongoD

spring boot 學習筆記 (9) Spring Data JPA

Spring Data JPA 是 Spring Boot 體系中約定優於配置的最佳實現,大大簡化了專案中資料庫的操作 JPA 是什麼 JPA(Java Persistence API)是 Sun 官方提出的 Java 持久化規範。它為 Java 開發人員提供了一種物件 / 關聯對映工具來管

Spring Data JPA筆記

       最近在研究Spring Data JPA。http://docs.spring.io/spring-data/jpa/docs/current/reference/html/ JPA是

Spring Data Redis ----Redis倉庫----筆記6

繼續。。。。。 官方文件:http://docs.spring.io/spring-data/data-redis/docs/current/reference/html/ 7.Redis Repositories(Redis 倉庫) Redis 倉庫允許你無縫轉換和儲存域

spring mvc 全部整合約束(個人筆記

<beans xmlns="http://www.springframework.org/schema/beans"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xmlns:aop="http://www.springfra

Spring-data-jpa 筆記(二) Repository 詳解

方法參數 count 有一個 long 合規 page byname mirror id屬性    基礎的 Repository 提供了最基本的數據訪問功能,其幾個子接口則擴展了一些功能。它們的繼承關系如下: Repository: 是 spring Dat

Spring Data JPA 實例查詢

customer 數據庫表 查詢方式 記錄 如何 三、認識“實例查詢” 1、概念定義: 上面例子中,是這樣創建“實例”的:Example<Customer> ex = Example.of(customer, matcher);我們看到,Example對象,由custom

Spring Data Jpa緩存介紹

級別 instance osc vid group 進程 config 詳細配置 oca 一級緩存: 會話session、事務級別的,事務退出,緩存就失效了。以id為標識 實體管理器-數據源 操作數據拷貝而非數據源。 二級緩存: 線程級或集群級,以id為標識放到緩存(針