浏览代码

Merge branch 'master' into innerDevelop

gaodm 4 年之前
父节点
当前提交
4e393ce749

+ 4 - 0
src/main/java/com/diagbot/dto/RetrievalDTO.java

@@ -45,4 +45,8 @@ public class RetrievalDTO {
      * 输血
      */
     private List<String> transfusionNames;
+    /**
+     * 症状
+     */
+    private List<String> symptomNames;
 }

+ 3 - 1
src/main/java/com/diagbot/entity/node/base/BaseNode.java

@@ -7,6 +7,8 @@ import org.neo4j.ogm.annotation.*;
 import org.springframework.data.repository.query.Param;
 
 import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Set;
 
 /**
@@ -20,7 +22,7 @@ import java.util.Set;
 public class BaseNode implements Serializable {
     @Id
     @GeneratedValue
-    private Long nodeId;
+    private Long id;
 
     @Labels
     private Set<String> labels;

+ 59 - 2
src/main/java/com/diagbot/facade/EntityFacade.java

@@ -1,9 +1,14 @@
 package com.diagbot.facade;
 
 import com.diagbot.dto.NeoEntityDTO;
+import com.diagbot.entity.node.Symptom;
+import com.diagbot.entity.node.base.BaseNode;
 import com.diagbot.repository.*;
+//import com.diagbot.util.GenericNode;
+import com.diagbot.util.StringUtil;
 import com.diagbot.vo.*;
 
+import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.io.ClassPathResource;
 import org.springframework.stereotype.Component;
@@ -25,6 +30,9 @@ public class EntityFacade {
     @Autowired
     BaseNodeRepository baseNodeRepository;
 
+    @Autowired
+    SymptomNameRepository symptomNameRepository;
+
     @Autowired
     LisNameRepository lisRepository;
 
@@ -39,11 +47,37 @@ public class EntityFacade {
     }
 
 
-    public void initEntity() {
-        List<String> labels = getLabels();
+    public List<BaseNode> getNodes(KgQueryVO kgQueryVO) {
+
+        List<BaseNode> baseNodes = new ArrayList<>();
+
+        String label = kgQueryVO.getStartLabel().trim();
+        String name = kgQueryVO.getStartName();
+
+        try {
+            if (StringUtil.isNotBlank(label) && StringUtil.isNotBlank(name)) {
+                if (Constants.node_Labels.contains(label)) {
+                    switch (label) {
+                        case "症状":
+                            List<Symptom> symptoms = symptomNameRepository.findByNameIs(name);
+//                            GenericNode<Symptom> sNodes = new GenericNode<>();
+//                            baseNodes = sNodes.fillNodeTree(symptoms);
+                            break;
+                    }
 
+                }
+            }
+        }
+        catch (Exception ex) {
+            ex.printStackTrace();
+        }
+        finally {
+            return baseNodes;
+        }
     }
 
+
+
     public NeoEntityDTO updateNeoNode(NeoEntityVO neoEntityVO) {
 
         List<String> keys;
@@ -130,4 +164,27 @@ public class EntityFacade {
     }
 
 
+    /**
+     * 删除节点
+     * @param neoEntityVO
+     * @return
+     */
+    public int deleteNeoNode(NeoEntityVO neoEntityVO) {
+        int cnt = 0;
+
+        try {
+            if (null != neoEntityVO.getID()) {
+                long id = neoEntityVO.getID();
+                BaseNode node = baseNodeRepository.findById(id);
+                cnt = 1;
+//                baseNodeRepository.delete(node);
+            }
+        }
+        catch (Exception ex) {
+            ex.printStackTrace();
+        }
+        finally {
+            return cnt;
+        }
+    }
 }

+ 19 - 17
src/main/java/com/diagbot/facade/RetrievalFacade.java

@@ -14,23 +14,7 @@ import com.diagbot.entity.node.YiBaoDiseaseName;
 import com.diagbot.entity.node.YiBaoOperationName;
 import com.diagbot.entity.relationship.LisNameLisSet;
 import com.diagbot.enums.StaticTypeEnum;
-import com.diagbot.repository.BaseNodeRepository;
-import com.diagbot.repository.DeptNode;
-import com.diagbot.repository.DeptRepository;
-import com.diagbot.repository.LisNameNode;
-import com.diagbot.repository.LisNameRepository;
-import com.diagbot.repository.LisSetNode;
-import com.diagbot.repository.LisSetRepository;
-import com.diagbot.repository.MedicineNode;
-import com.diagbot.repository.MedicineRepository;
-import com.diagbot.repository.PacsNameNode;
-import com.diagbot.repository.PacsNameRepository;
-import com.diagbot.repository.PacsSubNameRepository;
-import com.diagbot.repository.TransfusionRemindRepository;
-import com.diagbot.repository.YiBaoDiseaseNode;
-import com.diagbot.repository.YiBaoDiseaseNameRepository;
-import com.diagbot.repository.YiBaoOperationNameNode;
-import com.diagbot.repository.YiBaoOperationNameRepository;
+import com.diagbot.repository.*;
 import com.diagbot.util.EntityUtil;
 import com.diagbot.util.ListUtil;
 import com.diagbot.util.NeoUtil;
@@ -75,6 +59,9 @@ public class RetrievalFacade {
     @Autowired
     TransfusionRemindRepository transfusionRemindRepository;
 
+    @Autowired
+    SymptomNameRepository symptomNameRepository;
+
     @Autowired
     BaseNodeRepository baseNodeRepository;
 
@@ -114,6 +101,9 @@ public class RetrievalFacade {
             case 8:
                 retrievalDTO.setTransfusionNames(getTransfusion(retrievalVO.getInputStr()));
                 break;
+            case 9:
+                retrievalDTO.setSymptomNames(getSymptoms(retrievalVO.getInputStr(), retrievalVO.getSize()));
+                break;
         }
 
         return retrievalDTO;
@@ -214,6 +204,18 @@ public class RetrievalFacade {
     }
 
 
+    /**
+     * 获取症状列表
+     */
+    public List<String> getSymptoms(String name, Integer size) {
+
+        SymptomNameNode symptomNameNode = new SymptomNameNode();
+        List<String> symplist = symptomNameNode.getSymptomList(name, size, symptomNameRepository, baseNodeRepository);
+
+        return symplist;
+    }
+
+
     /**
      * 医学知识(静态信息)检索
      *

+ 4 - 0
src/main/java/com/diagbot/repository/BaseNodeRepository.java

@@ -13,6 +13,10 @@ import java.util.List;
 
 public interface BaseNodeRepository extends Neo4jRepository<BaseNode, Long> {
 
+    void delete(BaseNode baseNode);
+
+    <Optional>BaseNode findById(long id);
+
     List<BaseNode> findByNameIs(String name);
 
     @Query("MATCH (n) WHERE n.name={name} RETURN n, LABELS(n) as Label")

+ 8 - 0
src/main/java/com/diagbot/repository/Constants.java

@@ -1,5 +1,8 @@
 package com.diagbot.repository;
 
+import java.util.Arrays;
+import java.util.List;
+
 public class Constants {
 
     public static String yaoping = "药品";
@@ -81,4 +84,9 @@ public class Constants {
     public static String combioperation = "联合项目";
     public static String allergen = "过敏原";
     public static String yibaooperation = "医保手术和操作";
+
+    public static List<String> node_Labels = Arrays.asList("症状","体征","临床表现","过敏原","药物过敏原",
+            "实验室检查套餐名","实验室检查名称","实验室检查一级分类","实验室检查二级分类","辅助检查名称",
+            "辅助检查子项目名称","医保疾病名称","医保手术和操作名称","联合项目","科室","药品代码通用名",
+            "药品通用名称","药品注册名称");
 }

+ 32 - 0
src/main/java/com/diagbot/repository/SymptomNameNode.java

@@ -0,0 +1,32 @@
+package com.diagbot.repository;
+
+import com.diagbot.entity.node.Symptom;
+import com.diagbot.util.ListUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SymptomNameNode {
+
+    /**
+     * 获取症状名称列表
+     */
+    public List<String> getSymptomList(String name, Integer size, SymptomNameRepository symptomNameRepository, BaseNodeRepository baseNodeRepository) {
+        List<String> symplt = new ArrayList<>();
+        if (null == size) {
+            size = 100;
+        }
+
+        List<Symptom> symplist = symptomNameRepository.index(name, name, size);
+
+        if (ListUtil.isNotEmpty(symplist) && symplist.size() > size) {
+            symplist = symplist.subList(0, size);
+        }
+
+        for (Symptom symptom : symplist) {
+            symplt.add(symptom.getName());
+        }
+        return symplt;
+    }
+}
+

+ 16 - 0
src/main/java/com/diagbot/repository/SymptomNameRepository.java

@@ -16,6 +16,22 @@ public interface SymptomNameRepository extends Neo4jRepository<Symptom, Long> {
 
     List<Symptom> findByNameContaining(String name);
 
+    @Query("MATCH (n:`症状`) WHERE toLower(n.`name`) = toLower($name) \n" +
+            "OR toLower(n.`拼音编码`) = toLower($pycode)  \n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n" +
+            "union\n" +
+            "MATCH (n:`症状`) WHERE toLower(n.`name`) starts with toLower($name) \n" +
+            "OR toLower(n.`拼音编码`) starts with toLower($pycode)  \n" +
+            "WITH n SKIP 0 LIMIT $size\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n" +
+            "union\n" +
+            "MATCH (n:`症状`) WHERE toLower(n.`name`) CONTAINS toLower($name) \n" +
+            "OR toLower(n.`拼音编码`) CONTAINS toLower($pycode)  \n" +
+            "WITH n SKIP 0 LIMIT $size\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n")
+    List<Symptom> index(@Param("name") String name, @Param("pycode") String pycode, @Param("size") Integer size);
+
+
     @Query("match(d:医保疾病名称)-[r{典型:1}]->(s) where any(label in labels(s) WHERE label in ['症状', '体征']) and s.name in {py} return d.name")
 //    @Query("match(d:医保疾病名称)-[r]->(s) where any(label in labels(s) WHERE label in ['症状', '体征']) and s.name in {py} return d.name")
     List<String> getDisBySymptoms(@Param("py")List<String> symptoms);

+ 4 - 4
src/main/java/com/diagbot/repository/YiBaoDiseaseNode.java

@@ -30,19 +30,19 @@ public class YiBaoDiseaseNode {
 			pushBaseDTO = new PushBaseDTO();
 			pushBaseDTO.setName(disease.getName());
 			pushDTO.setDisease(pushBaseDTO);
-			pushDTO.setSymptoms(disease.getSymptoms().stream().collect(Collectors.toMap(Symptom::getName,Symptom::getNodeId,(e1, e2) -> e2))
+			pushDTO.setSymptoms(disease.getSymptoms().stream().collect(Collectors.toMap(Symptom::getName,Symptom::getId,(e1, e2) -> e2))
 					.entrySet().stream().sorted(Collections.reverseOrder(Map.Entry.comparingByValue()))
 					.map(x ->NeoUtil.updatePushInfo(x.getKey())).collect(Collectors.toList()));
 
-			pushDTO.setVitals(disease.getVitals().stream().collect(Collectors.toMap(Vital::getName,Vital::getNodeId,(e1, e2) -> e2))
+			pushDTO.setVitals(disease.getVitals().stream().collect(Collectors.toMap(Vital::getName,Vital::getId,(e1, e2) -> e2))
 					.entrySet().stream().sorted(Collections.reverseOrder(Map.Entry.comparingByValue()))
 					.map(x ->NeoUtil.updatePushInfo(x.getKey())).collect(Collectors.toList()));
 
-			pushDTO.setLis(disease.getLisnames().stream().collect(Collectors.toMap(LisBigName::getName,LisBigName::getNodeId,(e1, e2) -> e2))
+			pushDTO.setLis(disease.getLisnames().stream().collect(Collectors.toMap(LisBigName::getName,LisBigName::getId,(e1, e2) -> e2))
 					.entrySet().stream().sorted(Collections.reverseOrder(Map.Entry.comparingByValue()))
 					.map(x ->NeoUtil.updatePushInfo(x.getKey())).collect(Collectors.toList()));
 
-			pushDTO.setPacs(disease.getPacsnames().stream().collect(Collectors.toMap(PacsName::getName,PacsName::getNodeId,(e1, e2) -> e2))
+			pushDTO.setPacs(disease.getPacsnames().stream().collect(Collectors.toMap(PacsName::getName,PacsName::getId,(e1, e2) -> e2))
 					.entrySet().stream().sorted(Collections.reverseOrder(Map.Entry.comparingByValue()))
 					.map(x ->NeoUtil.updatePushInfo(x.getKey())).collect(Collectors.toList()));
 

+ 11 - 4
src/main/java/com/diagbot/vo/KgQueryVO.java

@@ -14,10 +14,17 @@ import javax.validation.constraints.NotBlank;
 @Getter
 @Setter
 public class KgQueryVO {
-    @ApiModelProperty(value = "标签名")
+
+    @ApiModelProperty(value = "起始节点标签名")
     @NotBlank(message = "标签名不能为空")
-    private String labelName;
-    @ApiModelProperty(value = "搜索内容")
+    private String startLabel;
+    @ApiModelProperty(value = "起始节点名")
     @NotBlank(message = "搜索内容不能为空")
-    private String inputStr;
+    private String startName;
+    @ApiModelProperty(value = "关系名")
+    private String relName;
+    @ApiModelProperty(value = "终结节点标签名")
+    private String endLabel;
+    @ApiModelProperty(value = "终结节点名")
+    private String endName;
 }

+ 2 - 0
src/main/java/com/diagbot/vo/NeoEntityVO.java

@@ -14,6 +14,8 @@ import java.util.Map;
  */
 @Data
 public class NeoEntityVO {
+    // 节点ID
+    private Integer ID;
     // 节点名称
     private String name;
     // 节点标签

+ 4 - 0
src/main/java/com/diagbot/vo/RetrievalVO.java

@@ -27,4 +27,8 @@ public class RetrievalVO {
 //     * 年龄
 //     */
 //    private Integer age;
+    /**
+     * 术语返回数量
+     */
+    private Integer size;
 }

+ 15 - 6
src/main/java/com/diagbot/web/EntityController.java

@@ -1,7 +1,9 @@
 package com.diagbot.web;
 
 import com.diagbot.dto.NeoEntityDTO;
+import com.diagbot.entity.node.base.BaseNode;
 import com.diagbot.facade.EntityFacade;
+import com.diagbot.vo.KgQueryVO;
 import com.diagbot.vo.NeoEntityVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -10,7 +12,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
-import java.util.Map;
+
 
 /**
  * @Description: 图谱实体API控制层
@@ -26,11 +28,6 @@ public class EntityController {
     @Autowired
     private EntityFacade entityFacade;
 
-    @ApiOperation(value = "实体API", notes = "")
-    @PostMapping("/initEntity")
-    public void initEntity() {
-        entityFacade.initEntity();
-    }
 
     @ApiOperation(value = "实体标签API", notes = "")
     @GetMapping("/getLabels")
@@ -39,6 +36,12 @@ public class EntityController {
     }
 
 
+    @ApiOperation(value = "实体查询API", notes = "")
+    @PostMapping("/getNode")
+    public List<BaseNode> getNodes(@RequestBody KgQueryVO kgQueryVO) {
+        return entityFacade.getNodes(kgQueryVO);
+    }
+
     @ApiOperation(value = "实体更新API", notes = "")
     @PostMapping("/updateNode")
     public NeoEntityDTO updateNode(@RequestBody NeoEntityVO neoEntityVO) {
@@ -46,5 +49,11 @@ public class EntityController {
         return entityFacade.updateNeoNode(neoEntityVO);
     }
 
+    @ApiOperation(value = "实体删除API", notes = "")
+    @PostMapping("/deleteNode")
+    public int deleteNode(@RequestBody NeoEntityVO neoEntityVO) {
+        return entityFacade.deleteNeoNode(neoEntityVO);
+    }
+
 }
 

+ 1 - 1
src/main/java/com/diagbot/web/RetrievalController.java

@@ -35,7 +35,7 @@ public class RetrievalController {
     private ConceptFacade conceptFacade;
 
     @ApiOperation(value = "术语检索[zhaops]",
-            notes = "type: 类型:1-化验大项、2-化验小项、3-辅检、4-诊断、5-药品、6-手术和操作、7-科室、8-输血 <br>" +
+            notes = "type: 类型:1-化验大项、2-化验小项、3-辅检、4-诊断、5-药品、6-手术和操作、7-科室、8-输血、9-症状 <br>" +
                     "inputStr: 检索内容<br>" +
                     "sex: 性别:1-男、2-女、3-通用 <br>" +
                     "age: 年龄<br>")