Java操作Neo4J就是这么简单

使用 Java 操作 Neo4J

首先我们先使用原生的这种方式,导入 jar 包,然后:

public class TestController {  
  public static void main(String[] args) {    
    Driver driver = GraphDatabase.driver("bolt://localhost:7687", AuthTokens.basic("neo4j", "Yinlidong1995."));
    Session session = driver.session();      
    session.run("CREATE (n:Part {name: {name},title: {title}})",                
                parameters( "name", "Arthur001", "title", "King001" ));     
    StatementResult result = session.run( "MATCH (a:Part) WHERE a.name = {name} " +                       
                                         "RETURN a.name AS name, a.title AS title",       
    parameters( "name", "Arthur001"));      
    while (result.hasNext()) {          
      Record record = result.next();           
      System.out.println( record.get( "title" ).asString() + "
                         " + record.get( "name" ).asString() );      
     }       
     session.close();
     driver.close();  
   }
}

这是一种比较古老的方式,来实现的,而且还是需要些 CQL 语句来进行实现。但是胜在非常好理解,这个时候,我们需要再来看看图,看看在 Neo4J 中他是怎么展现的。

Java操作Neo4J就是这么简单

通过这个,我们至少证明我们成功连上了,并且创建也成功了。

这时候有细心的读者就会问,为啥我之前在 GraphDatabase.driver 的地方,连接的是

bolt://localhost:7687 .

这是因为,你启动的Neo4J 是7474,也就是说,Neo4J 服务里面可不是这个来连接,

Java操作Neo4J就是这么简单

SpringBoot 整合 Neo4j

1.创建SpringBoot项目

常规的创建SpringBoot项目,

Java操作Neo4J就是这么简单

创建完成之后,习惯性的要改一下 SpringBoot 的版本号,最好别用最新的,因为阿粉亲身经历,使用最新版的,出现了错误你都不知道怎么出现的,就是这么神奇,你永远都发现不了的bug。

我们把版本号改成2.1.0,这样的话,我们在 pom 文件中加入依赖 jar

<dependency> 
  <groupId>org.springframework.boot</groupId> 
  <artifactId>spring-boot-starter-data-neo4j</artifactId>
</dependency>

<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <version>1.16.10</version>
</dependency>

2.增加配置

spring:  
  data:    
  neo4j:     
  url: bolt://localhost:7687    
  username: neo4j   
  password: Yinlidong1995\.  
  main:   
   allow-bean-definition-overriding: true

3.Neo4JConfig

package com.example.neo4j.config;
import org.neo4j.driver.v1.AuthTokens;
import org.neo4j.driver.v1.Driver;
import org.neo4j.driver.v1.GraphDatabase;
import org.neo4j.driver.v1.Session;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration@EnableNeo4jRepositories("com.example.neo4j.repository")
@EnableTransactionManagement
public class Neo4jConfig {    
  @Value("${spring.data.neo4j.url}")    
  private String url;    
  @Value("${spring.data.neo4j.username}")  
  private String userName;  
  @Value("${spring.data.neo4j.password}")  
  private String password;   
  @Bean(name = "session") 
  public Session neo4jSession() {  
    Driver driver = GraphDatabase.driver(url, AuthTokens.basic(userName, password));     
    return driver.session();  
  }
}

4.编写实体类

package com.example.neo4j.entry;
import org.neo4j.ogm.annotation.*;
import java.util.HashSet;
import java.util.Set;
@NodeEntity("group")
@Datapublic class GroupNode {   
  @Id    
  @GeneratedValue   
  private Long id;  
  /**     
  * 班级名称     
  */   
  @Property(name = "name")   
  private String name;    
  /**     
  * 编号    
  */   
  private String num;   
  @Relationship(type = "RelationEdge")  
  private Set<RelationEdge> sets = new HashSet<>(); 
  public void addRelation(StudentNode sonNode, String name) { 
    RelationEdge relationNode = new RelationEdge(this, sonNode, name);       
    sets.add(relationNode);  
    sonNode.getSets().add(relationNode);  
  }
}

学生实体类:

package com.example.neo4j.entry;
import org.neo4j.ogm.annotation.GeneratedValue;
import org.neo4j.ogm.annotation.Id;
import org.neo4j.ogm.annotation.NodeEntity;
import org.neo4j.ogm.annotation.Relationship;
import java.util.HashSet;
import java.util.Set;
/** 
* 有点类似于Mysql中的table 映射的对象类,mysql中叫做ORM,neo4j中叫做OGM [object graph mapping] 
*/
@NodeEntity("student")
@Datapublic class StudentNode {    
  @Id    
  @GeneratedValue    
  private Long id;    
  /**     
  * 学生名称    
  */    
  private String name; 
  /**     
  * 性别    
  */    
  private String sex;    
  @Relationship(type = "RelationEdge", direction = "INCOMING")  
  private Set<RelationEdge> sets = new HashSet<>();  
}

package com.example.neo4j.entry;
import lombok.Data;
import org.neo4j.ogm.annotation.*;
@RelationshipEntity(type = "RelationEdge")
@Datapublic class RelationEdge {    
  @Id    
  @GeneratedValue   
  private Long id;    
  // 关系名    
  private String name;   
  @StartNode    
  private GroupNode groupNode;   
  @EndNode    
  private StudentNode studentNode;   
  public RelationEdge(GroupNode parentNode, StudentNode sonNode, String name) {
    this.groupNode = parentNode;       
    this.studentNode = sonNode;    
    this.name = name;   
  }
}

5.Repository接口

对应的学生接口:

package com.example.neo4j.repository;
import com.example.neo4j.entry.StudentNode;
import org.springframework.data.neo4j.repository.Neo4jRepository;
public interface StudentRepository extends Neo4jRepository<StudentNode,Long> {
}

对应的班级接口

package com.example.neo4j.repository;
import com.example.neo4j.entry.GroupNode;
import org.springframework.data.neo4j.repository.Neo4jRepository;
public interface GroupRepository extends Neo4jRepository<GroupNode,Long> {
}

最后完成编写我们的 Controller

package com.example.neo4j.controller;
import com.example.neo4j.entry.*;
import com.example.neo4j.repository.GroupRepository;
import com.example.neo4j.repository.StudentRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/node")
@Slf4jpublic class GroupController { 
  @Autowired   
  private StudentRepository studentRepository;  
  @Autowired   
  private GroupRepository groupRepository;  
  @GetMapping(value = "/create")  
  public void createNodeRelation() {  
    StudentNode studentNode1 = new StudentNode(); 
    studentNode1.setName("Alen");    
    studentNode1.setSex("男");      
    StudentNode studentNode2 = new StudentNode();
    studentNode2.setName("Kai");     
    studentNode2.setSex("女");    
    studentRepository.save(studentNode1);     
    studentRepository.save(studentNode2);    
    GroupNode groupNode = new GroupNode();   
    groupNode.setName("火箭班");   
    groupNode.setNum("298");       
    // 增加关系       
    groupNode.addRelation(studentNode1, "includes");    
    groupNode.addRelation(studentNode2, "includes"); 
    groupRepository.save(groupNode);   
  }
}

启动之后,访问
http://localhost:8080/node/create

我们再去图谱数据库看看。

Java操作Neo4J就是这么简单
Java操作Neo4J就是这么简单

怎么样,使用Java 操作是不是也是非常简单的呢?这样的图谱数据库你会选择么?

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352

推荐阅读更多精彩内容