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為標識放到緩存(針