MarkHuang 6 rokov pred
rodič
commit
d00aee624b

+ 92 - 0
graphdb/pom.xml

@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.diagbot</groupId>
+    <artifactId>graphdb</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <packaging>jar</packaging>
+
+    <name>graphdb</name>
+    <description>Demo project for Spring Boot</description>
+
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.0.5.RELEASE</version>
+        <relativePath/> <!-- lookup parent from com.diagbot.repository -->
+    </parent>
+
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <java.version>1.8</java.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-neo4j</artifactId>
+        </dependency>
+
+        <!-- 开启web-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-tomcat</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-undertow</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+
+        <dependency>
+            <groupId>org.neo4j</groupId>
+            <artifactId>neo4j-jdbc-driver</artifactId>
+            <version>3.4.0</version>
+        </dependency>
+
+        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 -->
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-collections4</artifactId>
+            <version>4.1</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>org.mybatis.spring.boot</groupId>
+            <artifactId>mybatis-spring-boot-starter</artifactId>
+            <version>1.3.3</version>
+        </dependency>
+
+        <dependency>
+            <groupId>net.logstash.logback</groupId>
+            <artifactId>logstash-logback-encoder</artifactId>
+            <version>5.2</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+
+</project>

+ 15 - 0
graphdb/src/main/java/org/diagbot/Neo4jApplication.java

@@ -0,0 +1,15 @@
+package org.diagbot;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories;
+
+@SpringBootApplication
+@EnableNeo4jRepositories
+@MapperScan("org.diagbot.mapper")
+public class Neo4jApplication {
+    public static void main(String[] args) {
+        SpringApplication.run(Neo4jApplication.class, args);
+    }
+}

+ 29 - 0
graphdb/src/main/java/org/diagbot/entity/node/Disease.java

@@ -0,0 +1,29 @@
+package org.diagbot.entity.node;
+
+import org.diagbot.entity.node.base.BaseNode;
+import lombok.Getter;
+import lombok.Setter;
+import org.neo4j.ogm.annotation.NodeEntity;
+import org.neo4j.ogm.annotation.Property;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@NodeEntity(label = "Disease")
+@Getter
+@Setter
+public class Disease extends BaseNode {
+
+    @Property(name = "name")
+    private String name;
+
+    public static List<Disease> DiseaseList(List<BaseNode> basenodes) {
+        List<Disease> nodes = new ArrayList<>();
+
+        for (BaseNode bnode : basenodes) {
+            nodes.add((Disease)bnode);
+        }
+        return nodes;
+    }
+
+}

+ 23 - 0
graphdb/src/main/java/org/diagbot/entity/node/base/BaseNode.java

@@ -0,0 +1,23 @@
+package org.diagbot.entity.node.base;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.neo4j.ogm.annotation.GeneratedValue;
+import org.neo4j.ogm.annotation.Id;
+import org.neo4j.ogm.annotation.Property;
+
+/**
+ * @Description: 节点基础类
+ * @author: gaodm
+ * @time: 2019/3/27 15:30
+ */
+@Getter
+@Setter
+public class BaseNode {
+    @Id
+    @GeneratedValue
+    private Long nodeId;
+
+    @Property(name = "name")
+    private String name;
+}

+ 13 - 0
graphdb/src/main/java/org/diagbot/mapper/KnowledgeMapper.java

@@ -0,0 +1,13 @@
+package org.diagbot.mapper;
+
+
+import org.diagbot.vo.AmendRelationVo;
+
+import java.util.Map;
+
+public interface KnowledgeMapper {
+
+//    List<Disease> selectAllDisease();
+//    List<BaseNode> findNodebyName(String name);
+    Iterable<Map<String, Object>> updateRelation(AmendRelationVo amendRelationVo);
+}

+ 16 - 0
graphdb/src/main/java/org/diagbot/repository/DiseaseRepository.java

@@ -0,0 +1,16 @@
+package org.diagbot.repository;
+
+import org.diagbot.entity.node.Disease;
+import org.springframework.data.neo4j.annotation.Query;
+import org.springframework.data.neo4j.repository.Neo4jRepository;
+
+import java.util.List;
+import java.util.Map;
+
+public interface DiseaseRepository extends Neo4jRepository<Disease, Long> {
+    List<Disease> findByNameContaining(String token);
+
+    // find High Risk Disease
+    @Query("MATCH (d:Disease) WHERE d.name in {0} RETURN d.name as name, d.high_risk as risk")
+    List<Map<String, Object>> findHighRiskDisease(List<String> diseaselist);
+}

+ 27 - 0
graphdb/src/main/java/org/diagbot/repository/RelationRepository.java

@@ -0,0 +1,27 @@
+package org.diagbot.repository;
+
+import org.diagbot.entity.relation.base.BaseRelation;
+import org.springframework.data.neo4j.annotation.Query;
+import org.springframework.data.neo4j.repository.Neo4jRepository;
+
+import java.util.List;
+import java.util.Map;
+
+public interface RelationRepository extends Neo4jRepository<BaseRelation, Long> {
+
+    // get Relation by Nodes
+    @Query("MATCH P=((s{name:{0}})-[*..1]-(e{name:{2}})) RETURN P")
+    Iterable<Map<String, Object>> getRelationByNodes(String start_name, String start_type, String end_name, String end_type);
+
+    // get Relation by EndNode
+    @Query("MATCH P=((e{name:{0}})<-[*..1]-(s)) RETURN P")
+    Iterable<Map<String, Object>> getOneLevelRelationByEndNode(String end_name, String end_type);
+
+    // get Node by Relation
+    @Query("MATCH (s{name:{0}})-[r]->(e) WHERE type(r)={2} RETURN s,e")
+    Iterable<Map<String, Object>> getNodeByRelation(String start_name, String start_type, String relation);
+
+    // 获取推荐项目
+    @Query("MATCH (d:Disease)-[r:推荐]->(lp) where d.name in {0} RETURN DISTINCT d.name as name, labels(lp)[0] as type, lp.name as item")
+    List<Map<String, Object>> getRecommendItem(List<String> DiseaseList);
+}

+ 10 - 0
graphdb/src/main/java/org/diagbot/repository/SymptomRepository.java

@@ -0,0 +1,10 @@
+package org.diagbot.repository;
+
+import org.diagbot.entity.node.Symptom;
+import org.springframework.data.neo4j.repository.Neo4jRepository;
+
+import java.util.List;
+
+public interface SymptomRepository extends Neo4jRepository<Symptom, Long> {
+    List<Symptom> findByNameContaining(String token);
+}

+ 48 - 0
graphdb/src/main/java/org/diagbot/service/KnowledgeService.java

@@ -0,0 +1,48 @@
+package org.diagbot.service;
+
+import org.diagbot.entity.node.LIS;
+import org.diagbot.entity.node.Symptom;
+import org.diagbot.vo.AmendRelationVo;
+import org.diagbot.vo.PageVo;
+import org.diagbot.vo.QueryVo;
+import org.diagbot.vo.RelationVo;
+import org.diagbot.entity.node.Disease;
+import org.diagbot.entity.node.base.BaseNode;
+
+import java.util.List;
+import java.util.Map;
+
+public interface KnowledgeService {
+    Disease addDisease(Disease disease);
+    List<Disease> findDisease(String name);
+    Disease findOneDisease(long id);
+    void deleteOneDisease(long id);
+
+    Symptom addSymptom(Symptom symptom);
+    List<Symptom> findSymptoms(String name);
+    Symptom findOneSymptom(long id);
+    void deleteOneSymptom(long id);
+
+    LIS addLIS(LIS lis);
+    List<LIS> findLIS(String name);
+    LIS findOneLIS(long id);
+    void deleteOneLIS(long id);
+
+    Iterable<Map<String, Object>> getNodeByRelation(RelationVo relationVo);
+    List<Map<String, Object>> getRelationByNodes(RelationVo relationVo);
+    List<Map<String, Object>> getOneLevelRelationByEndNode(RelationVo relationVo);
+
+    BaseNode updateNodeByName(AmendRelationVo amendRelationVo);
+    List<Map<String, Object>> updateRelation(AmendRelationVo amendRelationVo);
+
+    // 获取高危疾病列表
+    List<Map<String, Object>> findHighRiskDisease(QueryVo queryVo);
+
+    // 获取推荐项目
+    List<Map<String, Object>> getRecommendItem(QueryVo queryVo);
+
+    List<Disease> selectAllDisease(PageVo pageVo);
+    List<Symptom> selectAllSymptom(PageVo pageVo);
+    List<LIS> selectAllLIS(PageVo pageVo);
+
+}

+ 253 - 0
graphdb/src/main/java/org/diagbot/service/impl/KnowledgeServiceImpl.java

@@ -0,0 +1,253 @@
+package org.diagbot.service.impl;
+
+import org.diagbot.entity.node.LIS;
+import org.diagbot.entity.node.Symptom;
+import org.diagbot.mapper.KnowledgeMapper;
+import org.diagbot.service.KnowledgeService;
+import org.diagbot.vo.AmendRelationVo;
+import org.diagbot.vo.PageVo;
+import org.diagbot.vo.QueryVo;
+import org.diagbot.vo.RelationVo;
+import org.diagbot.entity.node.Disease;
+import org.diagbot.entity.node.base.BaseNode;
+import org.apache.commons.collections4.IteratorUtils;
+import org.diagbot.repository.*;
+import org.neo4j.driver.v1.types.Node;
+import org.neo4j.driver.v1.types.Path;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+
+@Service
+public class KnowledgeServiceImpl implements KnowledgeService {
+
+    @Autowired
+    private SymptomRepository symptomRepository;
+    @Autowired
+    private DiseaseRepository diseaseRepository;
+    @Autowired
+    private LISRepository lisRepository;
+    @Autowired
+    private BaseNodeRepository baseNodeRepository;
+    @Autowired
+    private RelationRepository relationRepository;
+    @Autowired
+    private KnowledgeMapper knowledgeMapper;
+
+    private List<BaseNode> baseNodes;
+
+    private Pageable pageable;
+    /**
+     * 处理症状节点相关的申请
+     */
+    @Override
+    public Symptom addSymptom(Symptom symptom) {
+        return symptomRepository.save(symptom);
+    }
+
+    @Override
+    public Symptom findOneSymptom(long id) {
+        return symptomRepository.findById(id).get();
+    }
+
+    @Override
+    public List<Symptom> findSymptoms(String name) { return symptomRepository.findByNameContaining(name); }
+
+    @Override
+    public void deleteOneSymptom(long id) {
+        symptomRepository.deleteById(id);
+    }
+
+    @Override
+    public List<Symptom> selectAllSymptom(PageVo pageVo) {
+        pageable = getPageable(pageVo);
+        return IteratorUtils.toList(symptomRepository.findAll().iterator());
+    }
+
+
+    /**
+     * 处理疾病节点相关的申请
+     */
+    @Override
+    public Disease addDisease(Disease disease) {
+        return diseaseRepository.save(disease);
+    }
+
+    @Override
+    public Disease findOneDisease(long id) {
+        return diseaseRepository.findById(id).get();
+    }
+
+    @Override
+    public List<Disease> findDisease(String name) {
+        return diseaseRepository.findByNameContaining(name);
+    }
+
+    @Override
+    public void deleteOneDisease(long id) {diseaseRepository.deleteById(id); }
+
+    @Override
+    public List<Disease> selectAllDisease(PageVo pageVo) {
+        pageable = getPageable(pageVo);
+        return IteratorUtils.toList(diseaseRepository.findAll(pageable).iterator());
+    }
+
+
+    /**
+     * 处理化验节点相关的申请
+     */
+    @Override
+    public LIS addLIS(LIS lis) {
+        return lisRepository.save(lis);
+    }
+
+    @Override
+    public LIS findOneLIS(long id) {
+        return lisRepository.findById(id).get();
+    }
+
+    @Override
+    public List<LIS> findLIS(String name) { return lisRepository.findByNameContaining(name); }
+
+    @Override
+    public void deleteOneLIS(long id) {lisRepository.deleteById(id); }
+
+    @Override
+    public List<LIS> selectAllLIS(PageVo pageVo) {
+        pageable = getPageable(pageVo);
+        return IteratorUtils.toList(lisRepository.findAll().iterator());
+    }
+
+
+    @Override
+    public List<Map<String, Object>> getRelationByNodes(RelationVo relationVo) {
+        String s_name = relationVo.getStart_name();
+        String s_type = relationVo.getStart_type();
+        String e_name = relationVo.getEnd_name();
+        String e_type = relationVo.getEnd_type();
+
+        List<Map<String, Object>> list = extractPath(relationRepository.getRelationByNodes(s_name, s_type, e_name, e_type));
+        return list;
+    }
+
+    @Override
+    public List<Map<String, Object>> getOneLevelRelationByEndNode(RelationVo relationVo) {
+        String e_name = relationVo.getEnd_name();
+        String e_type = relationVo.getEnd_type();
+
+        List<Map<String, Object>> list = extractPath(relationRepository.getOneLevelRelationByEndNode(e_name, e_type));
+        return list;
+    }
+
+    @Override
+    public Iterable<Map<String, Object>> getNodeByRelation(RelationVo relationVo) {
+        String s_name = relationVo.getStart_name();
+        String s_type = relationVo.getStart_type();
+        String rel = relationVo.getRel_name();
+
+        return relationRepository.getNodeByRelation(s_name, s_type, rel);
+    }
+
+    @Override
+    public BaseNode updateNodeByName(AmendRelationVo amendRelationVo) {
+        int id = amendRelationVo.getId();
+        String old_name = amendRelationVo.getOld_start_name();
+        String new_name = amendRelationVo.getNew_start_name();
+
+        return baseNodeRepository.updateNodeByName(id, old_name, new_name);
+    }
+
+    @Override
+    public List<Map<String, Object>> updateRelation(AmendRelationVo amendRelationVo) {
+        List<Map<String, Object>> path = extractPath(knowledgeMapper.updateRelation(amendRelationVo));
+        return path;
+    }
+
+    @Override
+    public List<Map<String, Object>> findHighRiskDisease(QueryVo queryVo) {
+        List<Map<String, Object>> hrlist = diseaseRepository.findHighRiskDisease(queryVo.getDiseaselist());
+        return hrlist;
+    }
+
+    @Override
+    public List<Map<String, Object>> getRecommendItem(QueryVo queryVo) {
+        List<Map<String, Object>> llist = relationRepository.getRecommendItem(queryVo.getDiseaselist());
+        return llist;
+    }
+
+
+    public Pageable getPageable(PageVo pageVo) {
+        if (pageVo.getSize() > 0) {
+            if (pageVo.getSort_key() != null && pageVo.getSort_direct() != null) {
+                if (pageVo.getSort_direct().toLowerCase().equals("asc")) {
+                    pageable = PageRequest.of(pageVo.getCurrent(), pageVo.getSize(),
+                            Sort.Direction.ASC, pageVo.getSort_key().trim());
+                }
+                else if (pageVo.getSort_direct().toLowerCase().equals("desc")) {
+                    pageable = PageRequest.of(pageVo.getCurrent(), pageVo.getSize(),
+                            Sort.Direction.DESC, pageVo.getSort_key().trim());
+                }
+                else {
+                    pageable = PageRequest.of(pageVo.getCurrent(), pageVo.getSize());
+                }
+            }
+            else {
+                pageable = PageRequest.of(pageVo.getCurrent(), pageVo.getSize());
+            }
+        }
+        else {
+            pageable = PageRequest.of(0, 100);
+        }
+        return pageable;
+    }
+
+    public List<Map<String, Object>> extractPath(Iterable<Map<String, Object>> path) {
+        Map<String, Object> item = new HashMap<>();
+        List<Map<String, Object>> pathlist = new ArrayList<>();
+        Map<String, Object> pathmap;
+
+        Iterator<Map<String, Object>> iterator = path.iterator();
+        while (iterator.hasNext()) {
+            item = iterator.next();
+            pathmap = new HashMap<>();
+            if (item.get("P") != null) {
+                Path p = (Path)item.get("P");
+                pathmap = parsePath(p);
+            }
+            pathlist.add(pathmap);
+        }
+
+        return pathlist;
+    }
+
+    public Map<String, Object> parsePath(Path p) {
+        Map<String, Object> path = new HashMap<>();
+        path.put("start", new HashMap<>());
+        path.put("end", new HashMap<>());
+        Map<String, String> s = (Map)path.get("start");
+        Map<String, String> e = (Map)path.get("end");
+        Node start = p.start();
+        Node end = p.end();
+        s.put("label", start.labels().iterator().next());
+        e.put("label", end.labels().iterator().next());
+        String relation = p.relationships().iterator().next().type();
+        path.put("relation", new HashMap<>());
+        ((Map)path.get("relation")).put("type", relation);
+
+        for (String prop:start.keys()) {
+            s.put(prop, start.get(prop).toString().replaceAll("\"",""));
+        }
+
+        for (String prop:end.keys()) {
+            e.put(prop, end.get(prop).toString().replaceAll("\"",""));
+        }
+
+        return path;
+    }
+
+}

+ 162 - 0
graphdb/src/main/java/org/diagbot/web/KnowledgeController.java

@@ -0,0 +1,162 @@
+package org.diagbot.web;
+
+import org.diagbot.vo.AmendRelationVo;
+import org.diagbot.entity.node.LIS;
+import org.diagbot.entity.node.Disease;
+import org.diagbot.entity.node.Symptom;
+import org.diagbot.entity.node.base.BaseNode;
+import org.diagbot.service.KnowledgeService;
+import org.diagbot.vo.PageVo;
+import org.diagbot.vo.QueryVo;
+import org.diagbot.vo.RelationVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("knowledge")
+public class KnowledgeController {
+    @Autowired
+    private KnowledgeService knowledgeService;
+
+    @RequestMapping("addDisease")
+    public Disease addDisease(@Valid @RequestBody Disease disease) {
+        return knowledgeService.addDisease(disease);
+    }
+
+    @RequestMapping("/findOneDisease/{id}")
+    public Disease findOneDisease(@PathVariable("id")String id){
+        return knowledgeService.findOneDisease(Long.parseLong(id));
+    }
+
+    @RequestMapping("/findDiseases/{name}")
+    public List<Disease> findDiseases(@PathVariable("name")String name){
+        return knowledgeService.findDisease(name);
+    }
+
+    @RequestMapping("/deleteOneDisease/{id}")
+    public String deleteOneDisease(@PathVariable("id")String id){
+        knowledgeService.deleteOneDisease(Long.parseLong(id));
+        return "success";
+    }
+
+    @RequestMapping("/allDisease")
+    public List<Disease> selectAllDisease(@Valid @RequestBody PageVo pageVo){
+        return knowledgeService.selectAllDisease(pageVo);
+    }
+
+    @RequestMapping("/addSymptom")
+    public Symptom addSymptom(@Valid @RequestBody Symptom symptom) {
+        return knowledgeService.addSymptom(symptom);
+    }
+
+    @RequestMapping("/findOneSymptom/{id}")
+    public Symptom findOneSymptom(@PathVariable("id")String id){
+        return knowledgeService.findOneSymptom(Long.parseLong(id));
+    }
+
+    @RequestMapping("/findSymptom/{name}")
+    public List<Symptom> findSymptom(@PathVariable("name")String name){
+        return knowledgeService.findSymptoms(name);
+    }
+
+    @RequestMapping("/deleteOneSymptom/{id}")
+    public String deleteOneSymptom(@PathVariable("id")String id){
+        knowledgeService.deleteOneSymptom(Long.parseLong(id));
+        return "success";
+    }
+
+    @RequestMapping("/allSymptom")
+    public List<Symptom> selectAllSymptom(@Valid @RequestBody PageVo pageVo) {
+        return knowledgeService.selectAllSymptom(pageVo);
+    }
+
+    @RequestMapping("addLIS")
+    public LIS addLIS(@Valid @RequestBody LIS lis) {
+        return knowledgeService.addLIS(lis);
+    }
+
+    @RequestMapping("/findOneLIS/{id}")
+    public LIS findOneLIS(@PathVariable("id")String id){
+        return knowledgeService.findOneLIS(Long.parseLong(id));
+    }
+
+    @RequestMapping("/findLIS/{name}")
+    public List<LIS> findLIS(@PathVariable("name")String name){
+        return knowledgeService.findLIS(name);
+    }
+
+    @RequestMapping("/deleteOneLIS/{id}")
+    public String deleteOneLIS(@PathVariable("id")String id){
+        knowledgeService.deleteOneLIS(Long.parseLong(id));
+        return "success";
+    }
+
+
+    @RequestMapping("/allLIS")
+    public List<LIS> selectAllLIS(@Valid @RequestBody PageVo pageVo) {
+        return knowledgeService.selectAllLIS(pageVo);
+    }
+
+
+    @RequestMapping("/getRelationByNodes")
+    public List<Map<String, Object>> getRelationByNodes(@Valid @RequestBody RelationVo relationVo){
+        return knowledgeService.getRelationByNodes(relationVo);
+    }
+
+    @RequestMapping("/getRelationByEndNode")
+    public List<Map<String, Object>> getRelationByEndNode(@Valid @RequestBody RelationVo relationVo) {
+        return knowledgeService.getOneLevelRelationByEndNode(relationVo);
+    }
+
+    @RequestMapping("/getNodeByRelation")
+    public Iterable<Map<String, Object>> getNodeByRelation(@Valid @RequestBody RelationVo relationVo) {
+        return knowledgeService.getNodeByRelation(relationVo);
+    }
+
+    @RequestMapping("/updateNodeByName")
+    public BaseNode updateNodeByName(@Valid @RequestBody AmendRelationVo amendRelationVo) {
+        return knowledgeService.updateNodeByName(amendRelationVo);
+    }
+
+    @RequestMapping("/updateRelation")
+    public List<Map<String, Object>> updateRelation(@Valid @RequestBody AmendRelationVo amendRelationVo) {
+        return knowledgeService.updateRelation(amendRelationVo);
+    }
+
+    /**
+     * 获取高危疾病列表
+     **/
+    @RequestMapping("/getHighRiskDisease")
+    public List<Map<String, Object>> getHighRiskDisease(@Valid @RequestBody QueryVo queryVo) {
+        return knowledgeService.findHighRiskDisease(queryVo);
+    }
+
+    /**
+     * 给定疾病,获取推荐的化验或辅检项目
+     */
+    @RequestMapping("/getRecommendItem")
+    public List<Map<String, Object>> getRecommendItem(@Valid @RequestBody QueryVo queryVo) {
+        return knowledgeService.getRecommendItem(queryVo);
+    }
+
+    /*
+    @RequestMapping("/actedIn/{personId}/{movieId}")
+    public TJ actedIn(@PathVariable("personId")String personId, @PathVariable("movieId")String movieId){
+        Person person=diseaseServer.findOnePerson(Long.parseLong(personId));
+        Disease disease =diseaseServer.findOneMovie(Long.parseLong(movieId));
+        TJ TJ =new TJ();
+        TJ.setRoles("龙套");
+        TJ.setStartNode(person);
+        TJ.setEndNode(disease);
+        return diseaseServer.actedIn(TJ);
+    }
+    */
+
+}

+ 29 - 0
graphdb/src/main/resources/application.yml

@@ -0,0 +1,29 @@
+spring:
+  profiles:
+    active: local
+  data:
+    neo4j:
+      uri: bolt://192.168.2.232:7687
+      username: neo4j
+      password: root
+
+# 驱动配置信息
+  datasource:
+    driver-class-name: org.neo4j.jdbc.Driver
+    url: jdbc:neo4j:http://192.168.2.232:7474
+    username: neo4j
+    password: root
+    #定义初始连接数
+    initialSize: 0
+    #定义最大连接数
+    maxActive: 20
+    #定义最大空闲
+    maxIdle: 20
+    #定义最小空闲
+    minIdle: 1
+    #定义最长等待时间
+    maxWait: 60000
+
+mybatis:
+  type-aliases-package: org.diagbot.entity
+  mapper-locations: classpath:mapper/**/*.xml

+ 280 - 0
graphdb/src/main/resources/logback-spring.xml

@@ -0,0 +1,280 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+    <!-- 项目名称 -->
+    <property name="APPDIR" value="user-service"/>
+    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
+    <property name="LOG_PATH" value="../logs"/>
+
+    <!-- 彩色日志 -->
+    <!-- 彩色日志依赖的渲染类 -->
+    <conversionRule conversionWord="clr"
+                    converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
+    <conversionRule conversionWord="wex"
+                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
+    <conversionRule conversionWord="wEx"
+                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
+    <!-- 彩色日志格式 -->
+    <property name="CONSOLE_LOG_PATTERN"
+              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%logger){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
+    <!--包名输出缩进对齐-->
+    <property name="CONSOLE_LOG_PATTERN"
+              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
+
+    <!--  日志记录器,日期滚动记录
+            ERROR 级别
+     -->
+    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 正在记录的日志文件的路径及文件名 -->
+        <file>${LOG_PATH}/${APPDIR}/${APPDIR}_error.log</file>
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 归档的日志文件的路径,例如今天是1992-11-06日志,当前写的日志文件路径为file节点指定,
+            可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
+            而1992-11-06的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
+            <fileNamePattern>${LOG_PATH}/${APPDIR}/error/${APPDIR}-error-%d{yyyy-MM-dd}.%i.log
+            </fileNamePattern>
+            <!--  保留日志天数 -->
+            <maxHistory>30</maxHistory>
+            <!-- 除按日志记录之外,还配置了日志文件不能超过10MB,若超过10MB,日志文件会以索引0开始,
+            命名日志文件,例如log-error-1992-11-06.0.log -->
+            <timeBasedFileNamingAndTriggeringPolicy
+                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>10MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <!-- 追加方式记录日志 -->
+        <append>true</append>
+        <!-- 日志文件的格式 -->
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level --- [%thread] %logger Line:%-3L - %msg%n
+            </pattern>
+            <charset>utf-8</charset>
+        </encoder>
+        <!-- 此日志文件记录error级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>error</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+
+    <!-- 日志记录器,日期滚动记录
+            WARN  级别
+     -->
+    <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 正在记录的日志文件的路径及文件名 -->
+        <file>${LOG_PATH}/${APPDIR}/${APPDIR}_warn.log</file>
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 归档的日志文件的路径,例如今天1992-11-06日志,当前写的日志文件路径为file节点指定,
+            可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
+            而1992-11-06的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
+            <fileNamePattern>${LOG_PATH}/${APPDIR}/warn/${APPDIR}-warn-%d{yyyy-MM-dd}.%i.log
+            </fileNamePattern>
+            <!--  保留日志天数 -->
+            <maxHistory>15</maxHistory>
+            <!-- 除按日志记录之外,还配置了日志文件不能超过10MB,若超过10MB,日志文件会以索引0开始,
+            命名日志文件,例如log-warn-1992-11-06.0.log -->
+            <timeBasedFileNamingAndTriggeringPolicy
+                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>10MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <!-- 追加方式记录日志 -->
+        <append>true</append>
+        <!-- 日志文件的格式 -->
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level --- [%thread] %logger Line:%-3L - %msg%n
+            </pattern>
+            <charset>utf-8</charset>
+        </encoder>
+        <!-- 此日志文件只记录warn级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>warn</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+
+    <!-- 日志记录器,日期滚动记录
+            INFO  级别
+    -->
+    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 正在记录的日志文件的路径及文件名 -->
+        <file>${LOG_PATH}/${APPDIR}/${APPDIR}_info.log</file>
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 归档的日志文件的路径,例如今天是1992-11-06日志,当前写的日志文件路径为file节点指定,
+            可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
+            而1992-11-06的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
+            <fileNamePattern>${LOG_PATH}/${APPDIR}/info/${APPDIR}-info-%d{yyyy-MM-dd}.%i.log
+            </fileNamePattern>
+            <!--  保留日志天数 -->
+            <maxHistory>15</maxHistory>
+            <!-- 除按日志记录之外,还配置了日志文件不能超过10MB,若超过10MB,日志文件会以索引0开始,
+            命名日志文件,例如log-info-1992-11-06.0.log -->
+            <timeBasedFileNamingAndTriggeringPolicy
+                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>10MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <!-- 追加方式记录日志 -->
+        <append>true</append>
+        <!-- 日志文件的格式 -->
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level --- [%thread] %logger Line:%-3L - %msg%n
+            </pattern>
+            <charset>utf-8</charset>
+        </encoder>
+        <!-- 此日志文件只记录info级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>info</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+
+    <!-- 日志记录器,日期滚动记录
+            DEBUG  级别
+    -->
+    <appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <!-- 正在记录的日志文件的路径及文件名 -->
+        <file>${LOG_PATH}/${APPDIR}/${APPDIR}_debug.log</file>
+        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 归档的日志文件的路径,例如今天是1992-11-06日志,当前写的日志文件路径为file节点指定,
+            可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。
+            而1992-11-06的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 -->
+            <fileNamePattern>${LOG_PATH}/${APPDIR}/debug/${APPDIR}-debug-%d{yyyy-MM-dd}.%i.log
+            </fileNamePattern>
+            <!--  保留日志天数 -->
+            <maxHistory>15</maxHistory>
+            <!-- 除按日志记录之外,还配置了日志文件不能超过10MB,若超过10MB,日志文件会以索引0开始,
+            命名日志文件,例如log-debug-1992-11-06.0.log -->
+            <timeBasedFileNamingAndTriggeringPolicy
+                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>10MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+        </rollingPolicy>
+        <!-- 追加方式记录日志 -->
+        <append>true</append>
+        <!-- 日志文件的格式 -->
+        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
+            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level --- [%thread] %logger Line:%-3L - %msg%n
+            </pattern>
+            <charset>utf-8</charset>
+        </encoder>
+        <!-- 此日志文件只记录debug级别的 -->
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>debug</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- ConsoleAppender 控制台输出日志 -->
+    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+        <!--encoder 默认配置为PatternLayoutEncoder-->
+        <encoder>
+            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
+            <!--<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level -&#45;&#45; [%thread] %logger Line:%-3L - %msg%n</pattern>-->
+            <charset>utf-8</charset>
+        </encoder>
+        <!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
+        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+            <level>debug</level>
+        </filter>
+    </appender>
+
+
+    <!--&lt;!&ndash;输出到mysql数据库的appender配置     &ndash;&gt;-->
+    <!--<appender name="db" class="ch.qos.logback.classic.db.DBAppender">-->
+    <!--<connectionSource-->
+    <!--class="ch.qos.logback.core.db.DriverManagerConnectionSource">-->
+    <!--<driverClass>com.mysql.jdbc.Driver</driverClass>-->
+    <!--<url>jdbc:mysql://120.77.222.42:3306/logback_member?characterEncoding=utf8</url>-->
+    <!--<user>root</user>-->
+    <!--<password>a123456789</password>-->
+    <!--</connectionSource>-->
+    <!--</appender>-->
+
+    <!-- FrameworkServlet日志-->
+    <logger name="org.springframework" level="WARN"/>
+
+    <!-- mybatis日志打印-->
+    <logger name="org.apache.ibatis" level="DEBUG"/>
+    <logger name="java.sql" level="DEBUG"/>
+
+    <!--  项目 mapper 路径
+            console控制台显示sql语句:STDOUT.filter.level -> debug级别
+    -->
+    <logger name="com.diagbot.mapper" level="DEBUG"/>
+
+    <appender name="LOGSTASHDEV" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
+        <destination>192.168.2.236:5044</destination>
+        <!-- encoder必须配置,有多种可选 -->
+        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
+            <customFields>{"appname":"user-service"}</customFields>
+        </encoder>
+    </appender>
+
+    <appender name="LOGSTASHTEST" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
+        <destination>192.168.2.241:5044</destination>
+        <!-- encoder必须配置,有多种可选 -->
+        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
+            <customFields>{"appname":"user-service"}</customFields>
+        </encoder>
+    </appender>
+
+    <!-- 本地环境下的日志配置 -->
+    <springProfile name="local">
+        <root level="INFO">
+            <appender-ref ref="ERROR"/>
+            <appender-ref ref="WARN"/>
+            <appender-ref ref="INFO"/>
+            <appender-ref ref="DEBUG"/>
+            <!-- 生产环境将请stdout去掉 -->
+            <appender-ref ref="STDOUT"/>
+        </root>
+    </springProfile>
+
+    <!-- 开发环境下的日志配置 -->
+    <springProfile name="dev">
+        <root level="INFO">
+            <appender-ref ref="ERROR"/>
+            <appender-ref ref="WARN"/>
+            <appender-ref ref="INFO"/>
+            <appender-ref ref="DEBUG"/>
+            <!-- 生产环境将请stdout去掉 -->
+            <appender-ref ref="STDOUT"/>
+            <appender-ref ref="LOGSTASHDEV"/>
+        </root>
+    </springProfile>
+
+    <!-- 测试环境下的日志配置 -->
+    <springProfile name="test">
+        <root level="INFO">
+            <appender-ref ref="ERROR"/>
+            <appender-ref ref="WARN"/>
+            <appender-ref ref="INFO"/>
+            <appender-ref ref="DEBUG"/>
+            <!-- 生产环境将请stdout去掉 -->
+            <appender-ref ref="STDOUT"/>
+            <appender-ref ref="LOGSTASHTEST"/>
+        </root>
+    </springProfile>
+
+    <!-- 生产环境下的日志配置 -->
+    <springProfile name="pro">
+        <root level="INFO">
+            <appender-ref ref="ERROR"/>
+            <appender-ref ref="WARN"/>
+            <appender-ref ref="INFO"/>
+            <appender-ref ref="DEBUG"/>
+            <appender-ref ref="LOGSTASH"/>
+        </root>
+    </springProfile>
+</configuration>

+ 38 - 0
graphdb/src/main/resources/mapper/KnowledgeMapper.xml

@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.diagbot.mapper.KnowledgeMapper">
+  <resultMap id="BaseResultMap" type="org.diagbot.entity.node.base.BaseNode">
+    <id column="id" jdbcType="BIGINT" property="nodeId" />
+    <result column="name" jdbcType="VARCHAR" property="name" />
+  </resultMap>
+  <select id="findNodebyName" parameterType="java.lang.String" resultMap="BaseResultMap">
+    <!--MATCH (n:Movie) return id(n) as id, n.title as title, n.released as released limit 25-->
+    <!--MATCH (n) WHERE n.name =~ '.*#{name}.*' RETURN id(n) as id, n.name as name-->
+  </select>
+
+  <update id="updateRelation" parameterType="org.diagbot.vo.AmendRelationVo">
+    MATCH (s
+    <if test = "old_start_type != ''">
+      :#{old_start_type}
+    </if>
+    <if test = "old_start_name != ''">
+      {name:{#{old_start_name}}
+    </if>
+    -[r:#{old_rel_name}]->(e
+    <if test = "old_end_type != ''">
+      :#{old_end_type}
+    </if>
+    <if test = "old_end_name != ''">
+      {name:{#{old_end_name}}
+    </if>
+    ),
+    (e1
+    <if test = "new_end_type != ''">
+      :#{new_end_type}
+    </if>
+    <if test = "new_end_name != ''">
+      {name:{#{new_end_name}}
+    </if>
+    ) create (s)-[r1:#{new_rel_name}]->(e1) set r1=r with r delete r
+  </update>
+</mapper>