天天看點

spring-data-neo4j了解

本項目demo位址【請閱讀readme檔案】:

https://gitee.com/LiuDaiHua/project-neo4j

最近項目上要搭建一個關系圖譜的東西,上司給了neo4j和d3兩個概念讓我去做,最終目的是使用d3.js去完成關系圖譜【力導向圖】的建立。我們先看幾張demo的截圖吧!

neo4j:

spring-data-neo4j了解

 圖1

背景查詢傳回給前台的資料:

spring-data-neo4j了解

圖2

目前,資料已經傳回給前台,基本封裝好了,後期我在處理,将最終做的效果展現給大家。

目前切先看一下前台d3.js制作力導向圖的模拟案例:

spring-data-neo4j了解

圖3

在看一下圖3模拟案例圖中所需資料data.json格式:

spring-data-neo4j了解

{
  "nodes":[
    {"id":0,"name":"安徽阜陽"},
    {"id":1,"name":"安徽淮南"},
    {"id":2,"name":"江蘇江陰"},
    {"id":3,"name":"安徽安慶"},
    {"id":4,"name":"毛毛"},
    {"id":5,"name":"吉吉"},
    {"id":6,"name":"可可"},
    {"id":7,"name":"咪咪"},
    {"id":1993,"name":"德馬"},
    {"id":9,"name":"蓋蓋"},
    {"id":10,"name":"寝室長"}
  ],
  "links":[
    {"source":6,"target":1,"type":"籍貫"},
    {"source":7,"target":1,"type":"籍貫"},
    {"source":5,"target":2,"type":"籍貫"},
    {"source":4,"target":3,"type":"籍貫"},
    {"source":9,"target":3,"type":"籍貫"},
    {"source":1993,"target":0,"type":"籍貫"},
    {"source":1993,"target":4,"type":"室友"},
    {"source":1993,"target":5,"type":"室友"},
    {"source":1993,"target":6,"type":"室友"},
    {"source":1993,"target":7,"type":"室友"},
    {"source":1993,"target":9,"type":"室友"},
    {"source":1993,"target":10,"type":"職位"}
  ]
}      
spring-data-neo4j了解

圖2背景傳回的資料,就是以data.json的樣式封裝的。

到此,介紹完畢,該進入正題了:

 首先在原demo的基礎上我參考網上大牛的代碼,搭建了自己的demo:

BaseNode:

package com.dbs.common.model;

public class BaseNode {


}
      

三個節點實體類:

Coder:

spring-data-neo4j了解
package com.dbs.neo4j.entity.node;

import java.util.List;


import javax.persistence.GeneratedValue;

import javax.persistence.Id;

import org.neo4j.ogm.annotation.NodeEntity;

import org.neo4j.ogm.annotation.Property;

import org.neo4j.ogm.annotation.Relationship;

import com.dbs.common.model.BaseNode;

import com.dbs.neo4j.entity.relation.Have;

import com.dbs.neo4j.entity.relation.Like;


@NodeEntity(label="Coder")

public class Coder extends BaseNode {

@Id

@GeneratedValue

private Long id;

       
@Property(name</span>="flagId"<span style="color: #000000;">) 
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> String flagId;

@Property(name</span>="name"<span style="color: #000000;">) 
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> String name;

@Property(name</span>="sex"<span style="color: #000000;">) 
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> String sex;

@Relationship(type</span>="like"<span style="color: #000000;">) 
</span><span style="color: #0000ff;">private</span> List&lt;Like&gt;<span style="color: #000000;"> like;

@Relationship(type</span>="have"<span style="color: #000000;">)
</span><span style="color: #0000ff;">private</span> List&lt;Have&gt;<span style="color: #000000;"> have;

</span><span style="color: #008000;">// getters and setters</span><span style="color: #000000;">
           
}
spring-data-neo4j了解

Cat:

spring-data-neo4j了解
package com.dbs.neo4j.entity.node;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;


import org.neo4j.ogm.annotation.NodeEntity;

import org.neo4j.ogm.annotation.Property;

import com.dbs.common.model.BaseNode;


@NodeEntity(label="Cat")

public class Cat extends BaseNode {

@Id

@GeneratedValue

private Long id;

       
@Property(name</span>="flagId"<span style="color: #000000;">) 
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> String flagId;

@Property(name</span>="name"<span style="color: #000000;">) 
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> String name;

@Property(name</span>="color"<span style="color: #000000;">) 
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> String color;

</span><span style="color: #008000;">// getters and setters</span><span style="color: #000000;">
           
}
spring-data-neo4j了解

Player:

spring-data-neo4j了解
package com.dbs.neo4j.entity.node;

import java.util.List;


import javax.persistence.GeneratedValue;

import javax.persistence.Id;


import org.neo4j.ogm.annotation.NodeEntity;

import org.neo4j.ogm.annotation.Property;

import org.neo4j.ogm.annotation.Relationship;

import com.dbs.common.model.BaseNode;

import com.dbs.neo4j.entity.relation.Have;


@NodeEntity(label="Player")

public class Player extends BaseNode{

@Id

@GeneratedValue

private Long id;

       
@Property(name</span>="flagId"<span style="color: #000000;">) 
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> String flagId;

@Property(name</span>="name"<span style="color: #000000;">) 
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> String name;

@Property(name</span>="身高"<span style="color: #000000;">) 
</span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">double</span><span style="color: #000000;"> height;

@Property(name</span>="職位"<span style="color: #000000;">) 
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> String location;

@Relationship(type</span>="have"<span style="color: #000000;">) 
</span><span style="color: #0000ff;">private</span> List&lt;Have&gt;<span style="color: #000000;"> have;

</span><span style="color: #008000;">// getters and setters</span><span style="color: #000000;">
           
}
spring-data-neo4j了解

兩個關系實體類:

Hava:

spring-data-neo4j了解
package com.dbs.neo4j.entity.relation;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;


import org.neo4j.ogm.annotation.EndNode;

import org.neo4j.ogm.annotation.Property;

import org.neo4j.ogm.annotation.RelationshipEntity;

import org.neo4j.ogm.annotation.StartNode;

import com.dbs.common.model.BaseNode;

import com.fasterxml.jackson.annotation.JsonIgnore;


@RelationshipEntity(type="have")

public class Have {

@Id

@GeneratedValue

private Long id;

       
@Property(name</span>="領養時間"<span style="color: #000000;">) 
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> String date;

@JsonIgnore 
@StartNode 
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> BaseNode startNode;

@Property(name</span>="sourceId"<span style="color: #000000;">) 
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> String sourceId;

@JsonIgnore 
@EndNode 
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> BaseNode endNode;

@Property(name</span>="targetId"<span style="color: #000000;">) 
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> String targetId;

</span><span style="color: #008000;">// getters and setters</span><span style="color: #000000;">
           
}
spring-data-neo4j了解

Like:

spring-data-neo4j了解
package com.dbs.neo4j.entity.relation;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;

import org.neo4j.ogm.annotation.EndNode;

import org.neo4j.ogm.annotation.Property;

import org.neo4j.ogm.annotation.RelationshipEntity;

import org.neo4j.ogm.annotation.StartNode;

import com.dbs.common.model.BaseNode;

import com.fasterxml.jackson.annotation.JsonIgnore;


@RelationshipEntity(type="like")

public class Like {

@Id

@GeneratedValue

private Long id;

       
@Property(name</span>="層度"<span style="color: #000000;">)  
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> String degree;

@JsonIgnore 
@StartNode 
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> BaseNode startNode;

@Property(name</span>="sourceId"<span style="color: #000000;">) 
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> String sourceId;

@JsonIgnore 
@EndNode   
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> BaseNode endNode;

@Property(name</span>="targetId"<span style="color: #000000;">) 
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> String targetId;

</span><span style="color: #008000;">// getters and setters</span><span style="color: #000000;">
           
}
spring-data-neo4j了解

有注解不了解的請參見官方文檔。

在此我豐富了人際關系(@RelationshipEntity),上面前端需要的資料data.json你也看到了,其links數組即為這裡所謂的人際關系。在原大牛的demo中并沒有這些,僅僅因為我前端需要links關系,是以我建立了兩個關系實體類。

測試類:

spring-data-neo4j了解
package com.dbs.test.mysql;

import java.util.ArrayList;

import java.util.Date;

import java.util.List;


import org.junit.Test;

import org.junit.runner.RunWith;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.boot.test.context.SpringBootTest;

import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;


import com.dbs.Neo4jApplication;

import com.dbs.neo4j.entity.node.Cat;

import com.dbs.neo4j.entity.node.Coder;

import com.dbs.neo4j.entity.node.Player;

import com.dbs.neo4j.entity.relation.Have;

import com.dbs.neo4j.entity.relation.Like;

import com.dbs.neo4j.repository.CoderRepository;

import com.dbs.utils.UUIDUtils;


@RunWith(SpringJUnit4ClassRunner.class)

@SpringBootTest(classes = Neo4jApplication.class)

public class CoderTest {

       
@Autowired
CoderRepository coderRepository;

@Test
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> save() {
    Coder coder </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Coder();
    String coderId </span>=<span style="color: #000000;"> UUIDUtils.getUUID();
    coder.setFlagId(coderId);
    coder.setName(</span>"appleyk"<span style="color: #000000;">);
    coder.setSex(</span>"男"<span style="color: #000000;">);
    
    Player sy </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Player();
    String syId </span>=<span style="color: #000000;"> UUIDUtils.getUUID();
    sy.setFlagId(syId);
    sy.setName(</span>"孫楊"<span style="color: #000000;">);
    sy.setHeight(</span>1.87<span style="color: #000000;">);
    sy.setLocation(</span>"800米自由泳"<span style="color: #000000;">);
    
    Player hd </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Player();
    String hdId </span>=<span style="color: #000000;"> UUIDUtils.getUUID();
    hd.setFlagId(hdId);
    hd.setName(</span>"哈登"<span style="color: #000000;">);
    hd.setHeight(</span>2.17<span style="color: #000000;">);
    hd.setLocation(</span>"中鋒"<span style="color: #000000;">);
    
    </span><span style="color: #008000;">//</span><span style="color: #008000;">碼農的藍貓</span>
    Cat coderlm = <span style="color: #0000ff;">new</span><span style="color: #000000;"> Cat();
    String coderlmId </span>=<span style="color: #000000;"> UUIDUtils.getUUID();
    coderlm.setFlagId(coderlmId);
    coderlm.setName(</span>"藍貓"<span style="color: #000000;">);
    coderlm.setColor(</span>"blue"<span style="color: #000000;">);
    
    </span><span style="color: #008000;">//</span><span style="color: #008000;">哈登的藍貓和波斯貓</span>
    Cat hdbsm = <span style="color: #0000ff;">new</span><span style="color: #000000;"> Cat();
    String hdbsmId </span>=<span style="color: #000000;"> UUIDUtils.getUUID();
    hdbsm.setFlagId(hdbsmId);
    hdbsm.setName(</span>"波斯貓"<span style="color: #000000;">);
    hdbsm.setColor(</span>"white"<span style="color: #000000;">);
    
    Cat hdlm </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Cat();
    String hdlmId </span>=<span style="color: #000000;"> UUIDUtils.getUUID();
    hdlm.setFlagId(hdlmId);
    hdlm.setName(</span>"藍貓"<span style="color: #000000;">);
    hdlm.setColor(</span>"blue"<span style="color: #000000;">);
    
    List</span>&lt;Like&gt; coderLikes = <span style="color: #0000ff;">new</span> ArrayList&lt;Like&gt;<span style="color: #000000;">();
    </span><span style="color: #008000;">//</span><span style="color: #008000;"> 喜歡孫楊</span>
    Like likesy = <span style="color: #0000ff;">new</span><span style="color: #000000;"> Like();
    likesy.setStartNode(coder);
    likesy.setEndNode(sy);
    likesy.setDegree(</span>"喜歡"<span style="color: #000000;">);
    likesy.setSourceId(coder.getFlagId());
    likesy.setTargetId(sy.getFlagId());
    coderLikes.add(likesy);
    </span><span style="color: #008000;">//</span><span style="color: #008000;"> 很喜歡哈登</span>
    Like likehd = <span style="color: #0000ff;">new</span><span style="color: #000000;"> Like();
    likehd.setStartNode(coder);
    likehd.setEndNode(hd);
    likehd.setDegree(</span>"超喜歡"<span style="color: #000000;">);
    likehd.setSourceId(coder.getFlagId());
    likehd.setTargetId(hd.getFlagId());
    coderLikes.add(likehd);
    </span><span style="color: #008000;">//</span><span style="color: #008000;"> 碼農喜歡的人</span>
           
coder.setLike(coderLikes);
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 碼農有一隻藍貓</span>
    List&lt;Have&gt; coderHave = <span style="color: #0000ff;">new</span> ArrayList&lt;Have&gt;<span style="color: #000000;">();
    Have havelm </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Have();
    havelm.setStartNode(coder); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 起始者是Coder</span>
           
havelm.setEndNode(coderlm); havelm.setDate(new Date().toString()); havelm.setSourceId(coder.getFlagId()); havelm.setTargetId(coderlm.getFlagId()); coderHave.add(havelm); coder.setHave(coderHave);
</span><span style="color: #008000;">//</span><span style="color: #008000;"> 哈登有一隻藍貓和一隻波斯貓</span>
    Have hdhavebs = <span style="color: #0000ff;">new</span><span style="color: #000000;"> Have();
    hdhavebs.setStartNode(hd); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 起始者是palyer</span>
           
hdhavebs.setEndNode(hdbsm); hdhavebs.setDate(new Date().toString()); hdhavebs.setSourceId(hd.getFlagId()); hdhavebs.setTargetId(hdbsm.getFlagId());
Have hdhavelm </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> Have();
    hdhavelm.setStartNode(hd); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 起始者是palyer</span>
           
hdhavelm.setEndNode(hdlm); hdhavelm.setDate(new Date().toString()); hdhavelm.setSourceId(hd.getFlagId()); hdhavelm.setTargetId(hdlm.getFlagId()); List<Have> hdHave = new ArrayList<Have>(); // 有兩隻貓 hdHave.add(hdhavebs);hdHave.add(hdhavelm); hd.setHave(hdHave);
coderRepository.save(coder);
}</span><span style="color: #000000;">
           
}
spring-data-neo4j了解

neo4j提供的資料查詢接口:

spring-data-neo4j了解
package com.dbs.neo4j.repository;

import java.util.List;


import org.springframework.data.neo4j.annotation.Query;

import org.springframework.data.neo4j.repository.GraphRepository;

import org.springframework.data.repository.query.Param;

import org.springframework.stereotype.Repository;


import com.dbs.neo4j.entity.node.Coder;


@Repository

public interface CoderRepository extends GraphRepository<Coder> {

       
@Query(</span>"MATCH (n:Coder) WHERE n.name = {name} RETURN n LIMIT 1"<span style="color: #000000;">)
Coder findByName(@Param(</span>"name"<span style="color: #000000;">) String name);

@Query(</span>"MATCH (a)-[m:like]-&gt;(b),(c)-[n:have]-&gt;(d) RETURN a,m,b,c,n,d"<span style="color: #000000;">)
List</span>&lt;Object&gt;<span style="color: #000000;"> searchAllNode();
           
}
spring-data-neo4j了解
spring-data-neo4j了解
package com.dbs.neo4j.repository;

import org.springframework.data.neo4j.repository.GraphRepository;

import org.springframework.stereotype.Repository;


import com.dbs.neo4j.entity.node.Player;


@Repository

public interface PlayerRespository extends GraphRepository<Player> {


}
      
spring-data-neo4j了解
spring-data-neo4j了解
package com.dbs.neo4j.repository;

import org.springframework.data.neo4j.repository.GraphRepository;

import org.springframework.stereotype.Repository;


import com.dbs.neo4j.entity.node.Cat;


@Repository

public interface CatRespository extends GraphRepository<Cat> {


}
      
spring-data-neo4j了解

生成uuid工具類:

spring-data-neo4j了解
package com.dbs.utils;

import java.util.UUID;


public class UUIDUtils {

       
</span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span><span style="color: #000000;"> String getUUID() {
    String uuid </span>= UUID.randomUUID().toString().replaceAll("-", ""<span style="color: #000000;">);
    </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> uuid;
}
           
}
spring-data-neo4j了解

web端控制器:

spring-data-neo4j了解
package com.dbs.neo4j.controller;

import java.util.List;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Controller;

import org.springframework.transaction.annotation.Transactional;

import org.springframework.web.bind.annotation.PostMapping;

import org.springframework.web.bind.annotation.RequestBody;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.bind.annotation.ResponseBody;


import com.dbs.common.model.ResponseResult;

import com.dbs.config.MysqlDataSourceConfig;

import com.dbs.neo4j.entity.node.Coder;

import com.dbs.neo4j.repository.CoderRepository;


/**

      
  • 包名:com.dbs.neo4j.controller
  • 功能:TODO(功能描述)
  • 作者:hualn
  • 日期:2018年1月23日 下午3:02:34

    */

    @Controller

    @RequestMapping("/coder")

    public class CoderController {

    private Logger logger = LoggerFactory.getLogger(MysqlDataSourceConfig.class);

    @Autowired

    CoderRepository coderRepositiory;

    @RequestMapping("/get")

    public Coder GetCoderByName(@RequestParam(value="name") String name){

    return coderRepositiory.findByName(name);

    }

    @RequestMapping("/all")

    @ResponseBody

    public List<Object> searchAllNode(){

    logger.debug("access all");

    List<Object> nodes = coderRepositiory.searchAllNode();

    if(nodes != null) {

    return nodes;

    logger.info("error,nodes is null");

    return null;

    @SuppressWarnings("rawtypes")

    @PostMapping("/save")

    @Transactional

    public ResponseResult Create(@RequestBody Coder coder) throws Exception{

    Coder result </span>=<span style="color: #000000;"> coderRepositiory.save(coder);
     </span><span style="color: #0000ff;">if</span>(result!=<span style="color: #0000ff;">null</span><span style="color: #000000;">){                       
         </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span> ResponseResult(200,result.getName()+"節點建立成功"<span style="color: #000000;">);
     }
     logger.debug(</span>"未查詢到資料!"<span style="color: #000000;">);
     </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span> ResponseResult(500,coder.getName()+"節點建立失敗!"<span style="color: #000000;">);
               
spring-data-neo4j了解

前端:

spring-data-neo4j了解
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8" />
<title>首頁</title>
<link th:href="@{plugins/layui/css/layui.css}" rel="stylesheet"/>
</head>
<body>
<form>
    <input id="getAll_btn" type="button" value="擷取所有節點" />
</form>
123
<script th:src="@{plugins/jquery-2.1.1.min.js}" type="text/javascript"></script>
<!-- <script th:src="@{plugins/d3/4.12.2/d3.js}" type="text/javascript"></script> -->
<script src="https://d3js.org/d3.v5.min.js"></script>
<script>
    $(function() {
        $("#getAll_btn").on("click",function() {
            $.ajax({
                type:"post",
                url:"coder/all",
                data:{},
                dataType:"json",
                success:function(result) {
                    console.log(result);
                }
            });
        });
    });
  </script>
</body>
</html>      
spring-data-neo4j了解

邏輯很簡單:測試類執行save方法,将資料插入到neo4j資料庫,即可在浏覽器http://127.0.0.1:7474中看到圖1的效果。啟動spring-boot,在浏覽器中輸入http://127.0.0.1:8080即可點選擷取所有節點即可在浏覽器端控制台看到背景封裝的資料。

這是一個完整的demo了,一路踏過的坑,我在此記錄一下:

bug1:

No identity field found for class: com.dbs.neo4j.entity.node.Coder; 
原因:id不能聲明為long,要聲明為Long      

bug2:

org.springframework.dao.InvalidDataAccessApiUsageException: Error executing Cypher "Neo.ClientError.Statement.ParameterMissing"; Code: Neo.ClientError.Statement.ParameterMissing; Description: Expected parameter(s): name;
原因:使用@Param注解時導入包出錯:應該導入import org.springframework.data.repository.query.Param;      

bug3:

java.lang.RuntimeException: @StartNode of a relationship entity may not be null
原因:關聯的實體類要有明确類型【不能使用object,如果使用公共父類也會導緻一個問題就是:展示的圖形節點的内容為空】      

bug4:

Failed to write HTTP message: org.springframework.http.converter.HttpMessageNotWritableException: C
原因:springboot查詢資料庫,如果節點實體中關聯多個其它對象,則其會深度查詢這些對象。要解決這個問題,可以在關系類中要關聯的實體上加@JsonIgnore注解,或者在主實體上加@JsonIgnoreProperties("actor")      

bug5:

使用自定義uuid時,沒有加上@GraphId注解,導緻的問題:背景顯示操作成功,但是neo4j裡沒有插入的庫。
現在我即在屬性上添加@GraphId注解,又主動的去生成uuid【不讓neo4j幫我生成id】,結果還是一樣,背景執行是成功了,但是neo4j裡還是沒有庫。
使用@id或@id @GeneratedValue一樣,都不能在自己添加id字段      

在此着重說一下bug5,原因由來:其實我不想使用官方提供的方式,使用neo4j為我自動生成主鍵id,我想自定義主鍵或使用uuid的方式,上午我确實實作了(建立實體類的時候給它一個Long類型的id,比如3L),但是飯後我回來清空了一下neo4j所有庫後就不能行了,查閱了并折騰了一下午,官方雖然推薦說讓使用uuid,但是并沒給出具體使用方式(官方描述):

Do not rely on this ID for long running applications. Neo4j will reuse deleted node ID’s. It is recommended users come up with their own unique identifier for their domain objects (or use a UUID).      

網上也鮮曾有人提到過這個問題,但是并無人回應。正如bug5中所說:如果我使用了提供注解的方式在主動去建立uuid,測試雖然執行成功,但是neo4j中并沒有資料。如果我不使用任何注解,也是一樣的結果。兩種注解方式,各種搭配折騰都不行,搞了一下午,網上也沒個解決辦法,最後我隻好放棄了這種方式,如果有哪位大牛會并實作了,請告知在下,在下不勝感激。在此我使用了一種非常low的方式,就是給節點實體類加了一個flagId,其實就是因為我沒辦法擷取neo4j自動生成的id又沒辦法使用自定義主鍵uuid,而采取的一種使用屬性去記錄uuid的方式。在測試類裡,你可以看到,我在建立關系時是使用開始節點的flagId與結束節點的flagId進行關聯的,這樣雖然也實作了我想要的東西,但是讓有代碼潔癖的我很不爽。後續有時間會繼續研究。

寫在最後,也是最重要的話:

neo4j的下載下傳安裝不在廢話,d3的下載下傳使用不在廢話。

學習neo4j文法的網站推薦:

https://blog.csdn.net/u010454030/article/details/53131229  【強烈推薦】

https://gitbook.cn/books/5a33782c5778440a9d906017/index.html 【推薦】

學習spring-data-neo4j官網:

https://docs.spring.io/spring-data/neo4j/docs/current/reference/html/#preface.additional-resources 【必讀】

學習d3.js:

https://blog.csdn.net/qq_34414916/article/details/80026029 (基礎教程)

https://blog.csdn.net/lcy132100/article/details/9722543?utm_source=blogxgwz0 (text svg擴充學習)

https://blog.csdn.net/lcy132100/article/details/9722543?utm_source=blogxgwz0 (比例尺 擴充學習)

d3.js制作力導向圖:

網上很多,我将在碼雲上上傳兩個力導向圖的demo

本案例參考大牛網址:

https://www.2cto.com/database/201801/713556.html 【感謝】

其他優秀案例推薦:

https://blog.csdn.net/appleyk/article/details/80290551 【贊】

 以上内容都是本人閱讀大量網站精選,也非常感謝網上的大牛提供的參考。

後續補充:

前端擷取資料使用d3搭建力導向圖:

spring-data-neo4j了解

原文位址:https://www.cnblogs.com/liudaihuablogs/p/9839267.html