浏览代码

Merge remote-tracking branch 'origin/dev/ltkg20200312_init' into dev/ltkg20200312_init

# Conflicts:
#	ltkg-service/src/main/java/com/diagbot/facade/KgFacade.java
gaodm 5 年之前
父节点
当前提交
57ce04de4e

+ 22 - 0
ltkg-service/src/main/java/com/diagbot/dto/Categories.java

@@ -0,0 +1,22 @@
+package com.diagbot.dto;
+
+import lombok.Data;
+
+/**
+ * @description:
+ * @author: zhoutg
+ * @time: 2020/3/16 17:06
+ */
+@Data
+public class Categories {
+    private String name;
+    private String symbol = "circle";
+    private Integer symbolSize = 28;
+
+    public Categories() {
+    }
+
+    public Categories(String name) {
+        this.name = name;
+    }
+}

+ 16 - 0
ltkg-service/src/main/java/com/diagbot/dto/GraDTO.java

@@ -0,0 +1,16 @@
+package com.diagbot.dto;
+
+import lombok.Data;
+import java.util.List;
+
+/**
+ * @description:
+ * @author: zhoutg
+ * @time: 2020/3/16 17:06
+ */
+@Data
+public class GraDTO {
+    private List<Categories> categoriesList;
+    private List<Node> nodeList;
+    private List<Link> linksList;
+}

+ 24 - 0
ltkg-service/src/main/java/com/diagbot/dto/Link.java

@@ -0,0 +1,24 @@
+package com.diagbot.dto;
+
+import lombok.Data;
+
+/**
+ * @description:
+ * @author: zhoutg
+ * @time: 2020/3/17 9:49
+ */
+@Data
+public class Link {
+    private Long source;
+    private Long target;
+    private String value = "";
+
+    public Link() {
+    }
+
+    public Link(Long source, Long target, String value) {
+        this.source = source;
+        this.target = target;
+        this.value = value;
+    }
+}

+ 26 - 0
ltkg-service/src/main/java/com/diagbot/dto/Node.java

@@ -0,0 +1,26 @@
+package com.diagbot.dto;
+
+import lombok.Data;
+
+/**
+ * @description:
+ * @author: zhoutg
+ * @time: 2020/3/17 9:49
+ */
+@Data
+public class Node {
+    private Integer category; // 所属列
+    private String label = ""; // 显示名称
+    private Long name;  // 主键
+    private Integer symbolSize = 0;
+
+    public Node() {
+    }
+
+    public Node(Integer category, String lalel, Long name, Integer symbolSize) {
+        this.category = category;
+        this.label = lalel;
+        this.name = name;
+        this.symbolSize = symbolSize;
+    }
+}

+ 14 - 0
ltkg-service/src/main/java/com/diagbot/dto/Tu.java

@@ -0,0 +1,14 @@
+package com.diagbot.dto;
+
+import lombok.Data;
+
+/**
+ * @description:
+ * @author: zhoutg
+ * @time: 2020/3/16 17:06
+ */
+@Data
+public class Tu {
+    private String rel;
+    private String subName;
+}

+ 66 - 0
ltkg-service/src/main/java/com/diagbot/facade/KgFacade.java

@@ -4,13 +4,19 @@ import com.diagbot.dto.BaseNodeDTO;
 import com.diagbot.dto.BaseNodeRSDTO;
 import com.diagbot.dto.CategorieDTO;
 import com.diagbot.dto.GNodeDTO;
+import com.diagbot.dto.Categories;
+import com.diagbot.dto.GraDTO;
 import com.diagbot.dto.GraphDTO;
 import com.diagbot.dto.GraphLabelDTO;
 import com.diagbot.dto.LinkDTO;
+import com.diagbot.dto.Link;
+import com.diagbot.dto.Node;
 import com.diagbot.dto.TreeDTO;
+import com.diagbot.dto.Tu;
 import com.diagbot.exception.CommonErrorCode;
 import com.diagbot.exception.CommonException;
 import com.diagbot.service.impl.KgServiceImpl;
+import com.diagbot.util.EntityUtil;
 import com.diagbot.util.FastJsonUtils;
 import com.diagbot.util.ListUtil;
 import com.diagbot.vo.KgQueryVO;
@@ -19,6 +25,7 @@ import org.springframework.stereotype.Component;
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -140,4 +147,63 @@ public class KgFacade extends KgServiceImpl {
             "\t  }\n" +
             "    ]\n" +
             "}";
+    private void addNode(TreeDTO treeDTO) {
+
+    }
+
+    public GraDTO getTuFac(KgQueryVO kgQueryVO) {
+        GraDTO graDTO = new GraDTO();
+        List<Tu> tu = this.getTu(kgQueryVO);
+        Map<String, List<Tu>> map = EntityUtil.makeEntityListMap(tu, "rel");
+
+        List<Categories> categoriesList = new ArrayList<>();
+        List<Node> nodeList = new ArrayList<>();
+        List<Link> linksList = new ArrayList<>();
+
+        // 添加第一个节点:中心节点
+        Node node = new Node(0, kgQueryVO.getInputStr(), 0L, 50);
+        nodeList.add(node);
+
+        // 设置categories
+        Map<String, Integer> relMap = new LinkedHashMap<>();
+        int i = 0; // 设置category
+        Categories c1 = new Categories("中心词");
+        categoriesList.add(c1);
+        relMap.put("中心词", i++);
+        Categories c2 = new Categories("关系");
+        categoriesList.add(c2);
+        relMap.put("关系", i++);
+        Long j = 1L; // 设置节点编号
+        for (String key : map.keySet()) {
+            Categories bean = new Categories(key);
+            categoriesList.add(bean);
+            relMap.put(key, i);
+
+            // 添加关系节点
+            Node nodeRel = new Node(1, "", j, 10);
+            nodeList.add(nodeRel);
+
+            // 添加中心节点与关系的关联
+            Link linkRel = new Link(0L, j, key);
+            linksList.add(linkRel);
+
+            List<Tu> inner = map.get(key);
+            for (Tu t : inner) {
+                // 添加关系下的节点
+                Node nodeLabel = new Node(i, t.getSubName(), ++j, 28);
+                nodeList.add(nodeLabel);
+
+                // 添加关系和节点的关联
+                Link linkLabel = new Link(linkRel.getTarget(), j, "");
+                linksList.add(linkLabel);
+            }
+            i++;
+            j++;
+        }
+        graDTO.setCategoriesList(categoriesList);
+        graDTO.setNodeList(nodeList);
+        graDTO.setLinksList(linksList);
+
+        return graDTO;
+    }
 }

+ 5 - 0
ltkg-service/src/main/java/com/diagbot/mapper/KgMapper.java

@@ -1,7 +1,9 @@
 package com.diagbot.mapper;
 
+import com.diagbot.dto.Categories;
 import com.diagbot.dto.GraphDTO;
 import com.diagbot.dto.NodeDTO;
+import com.diagbot.dto.Tu;
 import com.diagbot.dto.SchemaDTO;
 import com.diagbot.vo.KgQueryVO;
 import com.diagbot.vo.SchemaVO;
@@ -9,6 +11,7 @@ import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 /**
  * <p>
@@ -27,4 +30,6 @@ public interface KgMapper {
     List<Map> getTree();
 
     List<SchemaDTO> getSchema(SchemaVO schemaVO);
+
+    List<Tu> getTu(KgQueryVO kgQueryVO);
 }

+ 4 - 0
ltkg-service/src/main/java/com/diagbot/service/KgService.java

@@ -1,7 +1,9 @@
 package com.diagbot.service;
 
+import com.diagbot.dto.GraDTO;
 import com.diagbot.dto.GraphDTO;
 import com.diagbot.dto.NodeDTO;
+import com.diagbot.dto.Tu;
 import com.diagbot.dto.SchemaDTO;
 import com.diagbot.vo.KgQueryVO;
 import com.diagbot.vo.SchemaVO;
@@ -26,4 +28,6 @@ public interface KgService {
     List<Map> getTree();
 
     List<SchemaDTO> getSchema(SchemaVO schemaVO);
+
+    List<Tu> getTu(KgQueryVO kgQueryVO);
 }

+ 13 - 0
ltkg-service/src/main/java/com/diagbot/service/impl/KgServiceImpl.java

@@ -1,16 +1,24 @@
 package com.diagbot.service.impl;
 
+import com.diagbot.dto.Categories;
+import com.diagbot.dto.GraDTO;
 import com.diagbot.dto.GraphDTO;
+import com.diagbot.dto.Link;
+import com.diagbot.dto.Node;
 import com.diagbot.dto.NodeDTO;
+import com.diagbot.dto.Tu;
 import com.diagbot.dto.SchemaDTO;
 import com.diagbot.mapper.KgMapper;
 import com.diagbot.service.KgService;
+import com.diagbot.util.EntityUtil;
 import com.diagbot.vo.KgQueryVO;
 import com.diagbot.vo.SchemaVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -46,4 +54,9 @@ public class KgServiceImpl implements KgService {
     public List<SchemaDTO> getSchema(SchemaVO schemaVO){
         return kgMapper.getSchema( schemaVO);
     }
+
+    @Override
+    public List<Tu> getTu(KgQueryVO kgQueryVO) {
+        return kgMapper.getTu(kgQueryVO);
+    }
 }

+ 9 - 0
ltkg-service/src/main/java/com/diagbot/web/KgController.java

@@ -1,6 +1,7 @@
 package com.diagbot.web;
 
 import com.diagbot.annotation.SysLogger;
+import com.diagbot.dto.GraDTO;
 import com.diagbot.dto.GraphDTO;
 import com.diagbot.dto.GraphLabelDTO;
 import com.diagbot.dto.NodeDTO;
@@ -64,5 +65,13 @@ public class KgController {
     public RespDTO<List<SchemaDTO>> getSchema(@RequestBody SchemaVO schemaVO) {
         return RespDTO.onSuc(kgFacade.getSchema(schemaVO));
     }
+
+
+    @ApiOperation(value = "获取图", notes = "获取图")
+    @PostMapping("/getTu")
+    @SysLogger("getTu")
+    public RespDTO<GraDTO> getTu(@RequestBody KgQueryVO kgQueryVO) {
+        return RespDTO.onSuc(kgFacade.getTuFac(kgQueryVO));
+    }
 }
 

+ 4 - 0
ltkg-service/src/main/resources/mapper/KgMapper.xml

@@ -56,4 +56,8 @@
       h.name as node
     </select>
 
+    <select id="getTu" resultType="com.diagbot.dto.Tu">
+      match (n:${labelName})-[r]-(m) where n.name=#{inputStr} return type(r) as rel,m.name as subName order by rel
+    </select>
+
 </mapper>

+ 442 - 0
ltkg-service/src/main/resources/static/index.html

@@ -0,0 +1,442 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <title>ECharts 关系图</title>
+    <script src="js/jquery-1.8.3.min.js"></script>
+    <script src="js/echarts.js"></script>
+</head>
+
+<body>
+<h1><select id="sel" style="height: 26px;margin-right: 10px;"><option value="Disease">诊断</option><option value="Symptom">症状</option><option value="Treat">治疗</option></select><input id="inputStr" style="height: 20px;"><input type="button" id="search" value="搜索" style="margin-left: 10px;"></h1>
+<div id="main" style="width:1000px;height:800px"></div>
+<script type="text/javascript">
+    var myChart = echarts.init(document.getElementById('main'));
+    var categories = [
+        // {
+        //     "name":"中心词"
+        // },
+        // {
+        //     "name":"关系"
+        // },
+        // {
+        //     "name":"相关症状",
+        //     "symbol":"circle",
+        //     "symbolSize":28
+        // },
+        // {
+        //     "name":"发病部位",
+        //     "symbol":"circle",
+        //     "symbolSize":28
+        // },
+        // {
+        //     "name":"所属科室",
+        //     "symbol":"circle",
+        //     "symbolSize":28
+        // },
+        // {
+        //     "name":"检查",
+        //     "symbol":"circle",
+        //     "symbolSize":28
+        // },
+        // {
+        //     "name":"相关疾病",
+        //     "symbol":"circle",
+        //     "symbolSize":28
+        // }
+    ];
+    var data = {"labelName":"Disease", "inputStr": "糖尿病"};
+    $.ajax({
+        type: "post",
+        url: "http://localhost:5050/api/ltkg/kg/getTu",
+        data: JSON.stringify(data),
+        contentType: "application/json;charset=UTF-8",
+        dataType: "json",
+        success: function(res){
+            console.log(res);
+            var data = res.data;
+            option.series[0].data = data.nodeList;
+            option.series[0].links = data.linksList;
+            option.series[0].categories = data.categoriesList;
+            option.legend[0].data = data.categoriesList.slice(2, data.categoriesList.length);
+            myChart.setOption(option);
+        }
+    });
+
+    option = {
+        // 图的标题
+        title: {
+            text: 'ECharts 关系图'
+        },
+        // 提示框的配置
+        tooltip: {
+            formatter: function (x) {
+                return x.data.des;
+            }
+        },
+        // 工具箱
+        toolbox: {
+            // 显示工具箱
+            show: true,
+            feature: {
+                mark: {
+                    show: true
+                },
+                // 还原
+                restore: {
+                    show: true
+                },
+                // 保存为图片
+                saveAsImage: {
+                    show: true
+                }
+            }
+        },
+        legend: [{
+            // selectedMode: 'single',
+            data: categories.map(function (a) {
+                return a.name;
+            })
+        }],
+        series: [{
+            type: 'graph', // 类型:关系图
+            layout: 'force', //图的布局,类型为力导图
+            symbolSize: 40, // 调整节点的大小
+            roam: true, // 是否开启鼠标缩放和平移漫游。默认不开启。如果只想要开启缩放或者平移,可以设置成 'scale' 或者 'move'。设置成 true 为都开启
+            edgeSymbol: ['circle', 'arrow'],
+            edgeSymbolSize: [2, 10],
+            edgeLabel: {
+                normal: {
+                    textStyle: {
+                        fontSize: 20
+                    }
+                }
+            },
+            force: {
+                repulsion: 200,
+                edgeLength: [10,50],
+                layoutAnimation: false
+            },
+            draggable: true,
+            lineStyle: {
+                normal: {
+                    width: 2,
+                    color: '#4b565b'
+                }
+            },
+            edgeLabel: {
+                normal: {
+                    show: true,
+                    formatter: function (x) {
+                        return x.data.value;
+                    }
+                }
+            },
+            label: {
+                normal: {
+                    show: true,
+                    formatter: function (x) {
+                        return x.data.label;
+                    },
+                    textStyle: {}
+                }
+            },
+
+            // 数据
+            data: [
+                {
+                    "category":0,
+                    "label":"咳嗽",
+                    "name":0,
+                    "symbolSize":50
+                },
+                {
+                    "category":1,
+                    "label":"",
+                    "name":1,
+                    "symbol":"diamond",
+                    "symbolSize":10
+                },
+                {
+                    "category":2,
+                    "label":"点滴状便血",
+                    "name":2,
+                    "symbolSize":28
+                },
+                {
+                    "category":2,
+                    "label":"膀胱蓄热小便失禁",
+                    "name":3,
+                    "symbolSize":28
+                },
+                {
+                    "category":2,
+                    "label":"百日咳",
+                    "name":4,
+                    "symbolSize":28
+                },
+                {
+                    "category":2,
+                    "label":"大量胸水",
+                    "name":5,
+                    "symbolSize":28
+                },
+                {
+                    "category":1,
+                    "label":"",
+                    "name":6,
+                    "symbol":"diamond",
+                    "symbolSize":10
+                },
+                {
+                    "category":3,
+                    "label":"头部",
+                    "name":7,
+                    "symbol":"rect",
+                    "symbolSize":28
+                },
+                {
+                    "category":1,
+                    "label":"",
+                    "name":8,
+                    "symbol":"diamond",
+                    "symbolSize":10
+                },
+                {
+                    "category":4,
+                    "label":"五官科",
+                    "name":9,
+                    "symbol":"rect",
+                    "symbolSize":28
+                },
+                {
+                    "category":4,
+                    "label":"中西医结合科",
+                    "name":10,
+                    "symbol":"rect",
+                    "symbolSize":28
+                },
+                {
+                    "category":4,
+                    "label":"腹部损伤",
+                    "name":11,
+                    "symbolSize":28
+                },
+                {
+                    "category":4,
+                    "label":"内科",
+                    "name":12,
+                    "symbol":"rect",
+                    "symbolSize":28
+                },
+                {
+                    "category":1,
+                    "label":"",
+                    "name":13,
+                    "symbol":"diamond",
+                    "symbolSize":10
+                },
+                {
+                    "category":5,
+                    "label":"巨噬细胞或白细胞移动抑制试验mmit",
+                    "name":14,
+                    "symbolSize":28
+                },
+                {
+                    "category":5,
+                    "label":"浆膜腔积液",
+                    "name":15,
+                    "symbol":"rect",
+                    "symbolSize":28
+                },
+                {
+                    "category":5,
+                    "label":"浆膜腔积液葡萄糖",
+                    "name":16,
+                    "symbol":"rect",
+                    "symbolSize":28
+                },
+                {
+                    "category":5,
+                    "label":"结核菌素试验(OT,PPD)",
+                    "name":17,
+                    "symbol":"rect",
+                    "symbolSize":28
+                },
+                {
+                    "category":1,
+                    "label":"",
+                    "name":18,
+                    "symbol":"diamond",
+                    "symbolSize":10
+                },
+                {
+                    "category":6,
+                    "label":"HIV相关呼吸道感染",
+                    "name":19,
+                    "symbolSize":28
+                },
+                {
+                    "category":6,
+                    "label":"热带型肺嗜酸性粒细胞肺炎",
+                    "name":20,
+                    "symbolSize":28
+                }
+            ],
+            links: [
+                {
+                    "source":0,
+                    "target":1,
+                    "value":"相关症状"
+                },
+                {
+                    "source":1,
+                    "target":2,
+                    "value":""
+                },
+                {
+                    "source":1,
+                    "target":3,
+                    "value":""
+                },
+                {
+                    "source":1,
+                    "target":4,
+                    "value":""
+                },
+                {
+                    "source":1,
+                    "target":5,
+                    "value":""
+                },
+                {
+                    "source":0,
+                    "target":6,
+                    "value":"发病部位"
+                },
+                {
+                    "source":6,
+                    "target":7,
+                    "value":""
+                },
+                {
+                    "source":0,
+                    "target":8,
+                    "value":"所属科室"
+                },
+                {
+                    "source":8,
+                    "target":9,
+                    "value":""
+                },
+                {
+                    "source":8,
+                    "target":10,
+                    "value":""
+                },
+                {
+                    "source":8,
+                    "target":11,
+                    "value":""
+                },
+                {
+                    "source":8,
+                    "target":12,
+                    "value":""
+                },
+                {
+                    "source":0,
+                    "target":13,
+                    "value":"检查"
+                },
+                {
+                    "source":13,
+                    "target":14,
+                    "value":""
+                },
+                {
+                    "source":13,
+                    "target":15,
+                    "value":""
+                },
+                {
+                    "source":13,
+                    "target":16,
+                    "value":""
+                },
+                {
+                    "source":13,
+                    "target":17,
+                    "value":""
+                },
+                {
+                    "source":0,
+                    "target":18,
+                    "value":"相关疾病"
+                },
+                {
+                    "source":18,
+                    "target":19,
+                    "value":""
+                },
+                {
+                    "source":18,
+                    "target":20,
+                    "value":""
+                }
+            ],
+            categories: categories,
+        }]
+    };
+
+    $("#search").click(function() {
+        var data = {};
+        data.labelName = $("#sel").val();
+        data.inputStr = $("#inputStr").val().trim();
+        $.ajax({
+            type: "post",
+            url: "http://localhost:5050/api/ltkg/kg/getTu",
+            data: JSON.stringify(data),
+            contentType: "application/json;charset=UTF-8",
+            dataType: "json",
+            success: function(res){
+                console.log(res);
+                var data = res.data;
+                option.series[0].data = data.nodeList;
+                option.series[0].links = data.linksList;
+                option.series[0].categories = data.categoriesList;
+                option.legend[0].data = data.categoriesList.slice(2, data.categoriesList.length);
+                myChart.setOption(option);
+            }
+        });
+    });
+    myChart.on('click', function (param){
+        console.log('param---->', param);  // 打印出param, 可以看到里边有很多参数可以使用
+        //获取节点点击的数组序号
+        var arrayIndex = param.dataIndex;
+        if (param.dataType == 'node') {
+            var data = {};
+            data.labelName = $("#sel").val();
+            data.inputStr = param.data.label.trim();
+            $.ajax({
+                type: "post",
+                url: "http://localhost:5050/api/ltkg/kg/getTu",
+                data: JSON.stringify(data),
+                contentType: "application/json;charset=UTF-8",
+                dataType: "json",
+                success: function(res){
+                    console.log(res);
+                    var data = res.data;
+                    option.series[0].data = data.nodeList;
+                    option.series[0].links = data.linksList;
+                    option.series[0].categories = data.categoriesList;
+                    option.legend[0].data = data.categoriesList.slice(2, data.categoriesList.length);
+                    myChart.setOption(option);
+                }
+            });
+        }
+    });
+
+</script>
+</body>
+</html>

文件差异内容过多而无法显示
+ 90347 - 0
ltkg-service/src/main/resources/static/js/echarts.js


文件差异内容过多而无法显示
+ 2 - 0
ltkg-service/src/main/resources/static/js/jquery-1.8.3.min.js