Przeglądaj źródła

加载词库,找标准词

kongwz 5 lat temu
rodzic
commit
e8f840de4b

+ 183 - 61
graphdb/src/main/java/org/diagbot/service/impl/KnowledgeServiceImpl.java

@@ -6,6 +6,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.diagbot.entity.node.LIS;
 import org.diagbot.entity.node.Symptom;
 import org.diagbot.mapper.KnowledgeMapper;
+import org.diagbot.pub.Ciku;
 import org.diagbot.pub.Label;
 import org.diagbot.pub.Type;
 import org.diagbot.pub.jdbc.MysqlJdbc;
@@ -1428,16 +1429,14 @@ public class    KnowledgeServiceImpl implements KnowledgeService {
         }else {
             respDTO = RespDTO.onError("在数据库中没有找到"+disId+"对应的疾病!!");
         }
+        //把数据库中的所有词读进map缓存
+        Map<String, Map<String, String>> ciKu = this.allStandWord2Map();
         //获取每个诊断依据的全部数据
         List<Map<String, String>> allData = this.getAllData(disId);
         //获取拟诊,确诊,警惕组合
         Map<String, List<String>> allNiQueZhenCollection = this.getAllNiQueZhenCollection(disId);
         this.saveNiQue2Neo(allData,allNiQueZhenCollection,disName,disId);
-        this.saveData2Neo4j(allData,disId,disName);
-        System.out.println();
-
-
-
+        this.saveData2Neo4j(allData,disId,disName,ciKu);
         return respDTO;
     }
 
@@ -1547,6 +1546,46 @@ public class    KnowledgeServiceImpl implements KnowledgeService {
         return queNiMap;
     }
 
+    /**
+     * 加载所有词库
+     * @return
+     */
+    public  Map<String,Map<String,String>> allStandWord2Map(){
+        Map<String,Map<String,String>> ciKu = new HashMap<>();
+        conn = this.getConn();
+        Statement st = null;
+        ResultSet rs = null;
+        try {
+            String tongName, type,  isConcept,stand;
+            String sql = "SELECT name, type_id,is_concept,IF(is_concept=1,a.name,(select lib_name from kl_concept b where b.id = a.concept_id) ) lib_name \n" +
+                    "from kl_library_info a where  a.is_deleted = 'N'\n" +
+                    "and type_id in (1,5,12,13,14,16,17,18,35,70)";
+            st = conn.createStatement();
+            rs = st.executeQuery(sql);
+            Map<String,String> detail =null;
+            while (rs.next()) {
+                tongName = rs.getString(1);
+                type = rs.getString(2);
+                isConcept = rs.getString(3);
+                stand = rs.getString(4);
+                detail = new HashMap<>();
+                detail.put("isConcept",isConcept);
+                detail.put("stand",stand);
+                ciKu.put(tongName+","+type,detail);
+            }
+        }catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                rs.close();
+                st.close();
+            } catch (SQLException e) {
+                e.printStackTrace();
+            }
+            return ciKu;
+        }
+    }
+
     /**
      * 获取疾病名
      * @param disId
@@ -1720,8 +1759,7 @@ public class    KnowledgeServiceImpl implements KnowledgeService {
      * @param disId
      * @param disName
      */
-    public void saveData2Neo4j(List<Map<String, String>> allData,Long disId,String disName){
-//        Map<String, Map<String, String>> standard_info_synonym_map = NlpCache.standard_info_synonym_map;
+    public void saveData2Neo4j(List<Map<String, String>> allData,Long disId,String disName,Map<String, Map<String, String>> ciKu){
         for (Map<String,String> row:allData) {
             String code = row.get("code");//编码
             String type = row.get("type");//类型
@@ -1733,107 +1771,145 @@ public class    KnowledgeServiceImpl implements KnowledgeService {
                 String[] split =null;
                 String[] lisResultSplit =null;
                 String[] pacsResultSplit =null;
+                String standWord = null;String lisResult = null,pacsResult=null;
                 if(!"3".equals(type) && !"4".equals(type) && !"5".equals(type)){
                     //添加词语之前,要找标准词
                     //添加standard
                     switch (type){
                         case "1": //症状
-                            diseaseRepository.mergeStandardSymptom(standard);
-                            diseaseRepository.mergeRelationStandard(disId,standard);
-                            diseaseRepository.mergeRelationStandardshuyu(disName+code,standard);
+                            standWord = searchStandWord(standard, type, ciKu);
+                            if(StringUtils.isNotEmpty(standWord)){
+                                diseaseRepository.mergeStandardSymptom(standWord);
+                                diseaseRepository.mergeRelationStandard(disId,standWord);
+                                diseaseRepository.mergeRelationStandardshuyu(disName+code,standWord);
+                            }
                             if(StringUtils.isNotEmpty(relation)){
                                 split = relation.split("、");
                                 if(split!=null && split.length>0){
                                     for (String ci:split) {
                                         if(StringUtils.isNotEmpty(ci)){
                                             //找标准词
-                                            diseaseRepository.mergeStandardSymptom(ci);
-                                            diseaseRepository.mergeRelationStandardshuyu(disName+code,ci);
+                                            standWord = searchStandWord(ci,type,ciKu);
+                                            if(StringUtils.isNotEmpty(standWord)){
+                                                diseaseRepository.mergeStandardSymptom(standWord);
+                                                diseaseRepository.mergeRelationStandardshuyu(disName+code,standWord);
+                                            }
                                         }
                                     }
                                 }
                             }
                             break;
                         case "2"://体征结果
-                            diseaseRepository.mergeStandardVital(standard);
-                            diseaseRepository.mergeRelationStandardVital(disId,standard);
-                            diseaseRepository.mergeRelationStandardVitalshuyu(disName+code,standard);
+                            standWord = searchStandWord(standard,type,ciKu);
+                            if(StringUtils.isNotEmpty(standWord)){
+                                diseaseRepository.mergeStandardVital(standWord);
+                                diseaseRepository.mergeRelationStandardVital(disId,standWord);
+                                diseaseRepository.mergeRelationStandardVitalshuyu(disName+code,standWord);
+                            }
                             if(StringUtils.isNotEmpty(relation)){
                                 split = relation.split("、");
                                 if(split!=null && split.length>0){
                                     for (String ci:split) {
                                         if(StringUtils.isNotEmpty(ci)){
                                             //找标准词
-                                            diseaseRepository.mergeStandardVital(ci);
-                                            diseaseRepository.mergeRelationStandardVitalshuyu(disName+code,ci);
+                                            standWord = searchStandWord(ci,type,ciKu);
+                                            if(StringUtils.isNotEmpty(standWord)){
+                                                diseaseRepository.mergeStandardVital(standWord);
+                                                diseaseRepository.mergeRelationStandardVitalshuyu(disName+code,standWord);
+                                            }
                                         }
                                     }
                                 }
                             }
                             break;
                         case "6"://病史
-                            diseaseRepository.mergeStandardHistory(standard);
-                            diseaseRepository.mergeRelationStandardHistory(disId,standard);
-                            diseaseRepository.mergeRelationStandardHistoryshuyu(disName+code,standard);
+                            standWord = searchStandWord(standard,type,ciKu);
+                            if(StringUtils.isNotEmpty(standWord)){
+                                diseaseRepository.mergeStandardHistory(standWord);
+                                diseaseRepository.mergeRelationStandardHistory(disId,standWord);
+                                diseaseRepository.mergeRelationStandardHistoryshuyu(disName+code,standWord);
+                            }
                             if(StringUtils.isNotEmpty(relation)){
                                 split = relation.split("、");
                                 if(split!=null && split.length>0){
                                     for (String ci:split) {
                                         if(StringUtils.isNotEmpty(ci)){
                                             //找标准词
-                                            diseaseRepository.mergeStandardHistory(ci);
-                                            diseaseRepository.mergeRelationStandardHistoryshuyu(disName+code,ci);
+                                            standWord = searchStandWord(ci,type,ciKu);
+                                            if(StringUtils.isNotEmpty(standWord)){
+                                                diseaseRepository.mergeStandardHistory(standWord);
+                                                diseaseRepository.mergeRelationStandardHistoryshuyu(disName+code,standWord);
+                                            }
                                         }
                                     }
                                 }
                             }
                             break;
                         case "7"://诱因
-                            diseaseRepository.mergeStandardCause(standard);
-                            diseaseRepository.mergeRelationStandardCause(disId,standard);
-                            diseaseRepository.mergeRelationStandardCauseshuyu(disName+code,standard);
+                            standWord = searchStandWord(standard,type,ciKu);
+                            if(StringUtils.isNotEmpty(standWord)){
+                                diseaseRepository.mergeStandardCause(standWord);
+                                diseaseRepository.mergeRelationStandardCause(disId,standWord);
+                                diseaseRepository.mergeRelationStandardCauseshuyu(disName+code,standWord);
+                            }
                             if(StringUtils.isNotEmpty(relation)){
                                 split = relation.split("、");
                                 if(split!=null && split.length>0){
                                     for (String ci:split) {
                                         if(StringUtils.isNotEmpty(ci)){
                                             //找标准词
-                                            diseaseRepository.mergeStandardCause(ci);
-                                            diseaseRepository.mergeRelationStandardCauseshuyu(disName+code,ci);
+                                            standWord = searchStandWord(ci,type,ciKu);
+                                            if(StringUtils.isNotEmpty(standWord)){
+                                                diseaseRepository.mergeStandardCause(standWord);
+                                                diseaseRepository.mergeRelationStandardCauseshuyu(disName+code,standWord);
+                                            }
                                         }
                                     }
                                 }
                             }
                             break;
                         case "8"://病程
-                            diseaseRepository.mergeStandardPrognosis(standard);
-                            diseaseRepository.mergeRelationStandardPrognosis(disId,standard);
-                            diseaseRepository.mergeRelationStandardPrognosisshuyu(disName+code,standard);
+                            standWord = searchStandWord(standard,type,ciKu);
+                            if(StringUtils.isNotEmpty(standWord)){
+                                diseaseRepository.mergeStandardPrognosis(standWord);
+                                diseaseRepository.mergeRelationStandardPrognosis(disId,standWord);
+                                diseaseRepository.mergeRelationStandardPrognosisshuyu(disName+code,standWord);
+                            }
                             if(StringUtils.isNotEmpty(relation)){
                                 split = relation.split("、");
                                 if(split!=null && split.length>0){
                                     for (String ci:split) {
                                         if(StringUtils.isNotEmpty(ci)){
                                             //找标准词
-                                            diseaseRepository.mergeStandardPrognosis(ci);
-                                            diseaseRepository.mergeRelationStandardPrognosisshuyu(disName+code,ci);
+                                            standWord = searchStandWord(ci,type,ciKu);
+                                            if(StringUtils.isNotEmpty(standWord)){
+                                                diseaseRepository.mergeStandardPrognosis(standWord);
+                                                diseaseRepository.mergeRelationStandardPrognosisshuyu(disName+code,standWord);
+                                            }
                                         }
                                     }
                                 }
                             }
                             break;
                         case "9"://其他
-                            diseaseRepository.mergeStandardOther(standard);
-                            diseaseRepository.mergeRelationStandardOther(disId,standard);
-                            diseaseRepository.mergeRelationStandardOthershuyu(disName+code,standard);
+                            standWord = searchStandWord(standard,type,ciKu);
+                            if(StringUtils.isNotEmpty(standWord)){
+                                diseaseRepository.mergeStandardOther(standard);
+                                diseaseRepository.mergeRelationStandardOther(disId,standard);
+                                diseaseRepository.mergeRelationStandardOthershuyu(disName+code,standard);
+                            }
                             if(StringUtils.isNotEmpty(relation)){
                                 split = relation.split("、");
                                 if(split!=null && split.length>0){
                                     for (String ci:split) {
                                         if(StringUtils.isNotEmpty(ci)){
                                             //找标准词
-                                            diseaseRepository.mergeStandardOther(ci);
-                                            diseaseRepository.mergeRelationStandardOthershuyu(disName+code,ci);
+                                            standWord = searchStandWord(ci,type,ciKu);
+                                            if(StringUtils.isNotEmpty(standWord)){
+                                                diseaseRepository.mergeStandardOther(standWord);
+                                                diseaseRepository.mergeRelationStandardOthershuyu(disName+code,standWord);
+                                            }
+
                                         }
                                     }
                                 }
@@ -1859,14 +1935,22 @@ public class    KnowledgeServiceImpl implements KnowledgeService {
                 } else if("3".equals(type)){ //处理化验
                     String lis = "";
                     //查找化验大项的标准词
-                    if(StringUtils.isNotEmpty(relation) && standard.equals(relation)){
-                        lis = standard;
-                    }else if(StringUtils.isNotEmpty(standard) && StringUtils.isEmpty(relation)){
-                        lis = standard;
-                    }else if(StringUtils.isNotEmpty(standard)&& StringUtils.isNotEmpty(relation)&&!standard.equals(relation)){
-                        //查找化验小项的标准词
-                        lis = standard+"--"+relation;
+                    standWord = searchStandWord(standard,type,ciKu);
+                    if(StringUtils.isNotEmpty(standWord)){
+                        if(StringUtils.isNotEmpty(relation) && standard.equals(relation)){
+                            lis = standWord;
+                        }else if(StringUtils.isNotEmpty(standard) && StringUtils.isEmpty(relation)){
+                            lis = standWord;
+                        }else if(StringUtils.isNotEmpty(standard)&& StringUtils.isNotEmpty(relation)&&!standard.equals(relation)){
+                            type = "subLis";
+                            if(StringUtils.isNotEmpty(searchStandWord(relation,type,ciKu))){
+                                //查找化验小项的标准词
+                                lis = standWord+"--"+searchStandWord(relation,type,ciKu);
+                            }
+
+                        }
                     }
+
                     //创建公表名
                     diseaseRepository.mergePublicLIS(lis);
                     //疾病推荐化验公表名
@@ -1876,35 +1960,46 @@ public class    KnowledgeServiceImpl implements KnowledgeService {
                         lisResultSplit = result.split("、");
                         if(lisResultSplit != null && lisResultSplit.length>0){
                             //化验结果找标准词
-                            for (String lisResult:lisResultSplit) {
-                                if(StringUtils.isNotEmpty(lisResult)){
-                                    //创建化验结果节点
-                                    diseaseRepository.mergeLISRESULT(lisResult);
-                                    //公表名和化验结果创建关系
-                                    diseaseRepository.mergeRelationPublicLIS(lis,lisResult);
-                                    //化验结果和对应的codeCondition创建关系
-                                    diseaseRepository.mergeRelationCondiLisRes(disName+code,lisResult);
+                            for (String lisRs:lisResultSplit) {
+                                if(StringUtils.isNotEmpty(lisRs)){
+                                    lisResult = searchStandWord(lisRs,"resultLis",ciKu);
+                                    if(StringUtils.isNotEmpty(lisResult)){
+                                        //创建化验结果节点
+                                        diseaseRepository.mergeLISRESULT(lisResult);
+                                        //公表名和化验结果创建关系
+                                        diseaseRepository.mergeRelationPublicLIS(lis,lisResult);
+                                        //化验结果和对应的codeCondition创建关系
+                                        diseaseRepository.mergeRelationCondiLisRes(disName+code,lisResult);
+                                    }
+
                                 }
                             }
                         }
                     }
                 }else if("4".equals(type)){ //辅检
                     //查找辅检的标准词
-                    //创建辅检标准词的节点
-                    diseaseRepository.mergePacs(standard);
-                    //疾病推荐辅检
-                    diseaseRepository.mergeRelationDis2Pacs(disId,standard);
+                    standWord = searchStandWord(standard,type,ciKu);
+                    if(StringUtils.isNotEmpty(standWord)){
+                        //创建辅检标准词的节点
+                        diseaseRepository.mergePacs(standWord);
+                        //疾病推荐辅检
+                        diseaseRepository.mergeRelationDis2Pacs(disId,standWord);
+                    }
                     if(StringUtils.isNotEmpty(relation)){
                         pacsResultSplit = relation.split("、");
                         if(pacsResultSplit != null && pacsResultSplit.length>0){
                             for (String pacs:pacsResultSplit) {
                                 //查找辅检结果的标准词
                                 if(StringUtils.isNotEmpty(pacs)){
-                                    diseaseRepository.mergePacsResult(pacs);
-                                    //创建辅检和辅检结果关系
-                                    diseaseRepository.mergeRelationPacsResult(standard,pacs);
-                                    //创建辅检结果和对应的pacsCondition的关系
-                                    diseaseRepository.mergeRelationCondiPacsRes(disName+code,pacs);
+                                   pacsResult = searchStandWord(pacs,"resultPacs",ciKu);
+                                   if(StringUtils.isNotEmpty(pacsResult)){
+                                       diseaseRepository.mergePacsResult(pacsResult);
+                                       //创建辅检和辅检结果关系
+                                       diseaseRepository.mergeRelationPacsResult(standWord,pacsResult);
+                                       //创建辅检结果和对应的pacsCondition的关系
+                                       diseaseRepository.mergeRelationCondiPacsRes(disName+code,pacsResult);
+                                   }
+
                                 }
                             }
                         }
@@ -1914,6 +2009,33 @@ public class    KnowledgeServiceImpl implements KnowledgeService {
         }
 
     }
+
+    /**
+     * 查找标准词
+     * @param type
+     * @return
+     */
+    public String searchStandWord(String word,String type,Map<String, Map<String, String>> ciKu){
+        String stand = null;
+        Map<String, String> detaiMap =null;
+        String label = Ciku.getLabel(type);
+        String[] labelSplits = label.split(",");
+        if(labelSplits.length == 1){
+            detaiMap = ciKu.get(word + "," + label);
+            if(detaiMap != null){
+                stand = detaiMap.get("stand");
+            }
+        }else if(labelSplits.length == 2){
+            detaiMap = ciKu.get(word + "," + labelSplits[0]);
+            if(detaiMap == null){
+                detaiMap = ciKu.get(word + "," + labelSplits[1]);
+            }
+            if(detaiMap != null){
+                stand = detaiMap.get("stand");
+            }
+        }
+        return stand;
+    }
     /**
      * 在图谱中删除诊断依据
      * @param singleDisease