Prechádzať zdrojové kódy

不良反应,指标推送,治疗优化

kongwz 6 rokov pred
rodič
commit
96ff7bf2fa

+ 1 - 1
graph/src/main/java/org/diagbot/graph/jdbc/Neo4jAPI.java

@@ -1290,7 +1290,7 @@ public class Neo4jAPI {
                         }
                         //药类型的大小类拼接
                         Map<String, String> shortLargeMap = new HashMap<>();
-                        propertiesUtil.getProperty("searchBigSubDrugs").replace("diseaseName","\'"+diseaseName+"\'");
+                       query =  propertiesUtil.getProperty("searchBigSubDrugs").replace("diseaseName","\'"+diseaseName+"\'");
                         logger.info("查找诊断对应的大小类,进行拼接,查找语句为:\n"+query);
                         result = tx.run(query);
                         while (result.hasNext()) {

+ 6 - 8
graph/src/main/resources/bolt.properties

@@ -91,18 +91,16 @@ searchDifferentialDiagnose=match(d:Disease)-[r:\u9274\u522B\u8BCA\u65AD]->(h) wh
 searchEmergency=match(d:Disease) where d.name in disList and d.emergency=1 return d.name as emDis
 
 #\u67E5\u627E\u6307\u6807\u7684\u8BED\u53E5
-searchIndication=with fildList  as data unwind data as row\n \
-match (n)-[r:\u786E\u8BCA|:\u62DF\u8BCA]->(m:Indicators)\n \
-where n.name=row\n \
+searchIndication=match (n)-[r:\u786E\u8BCA|:\u62DF\u8BCA]->(m:Indicators)\n \
+where n.name in fildList\n \
 with distinct m,r\n \
-return m.name as name, labels(m)[0] as label,type(r) as relationType
+return m.name as name
 
 #\u67E5\u627E\u4E0D\u826F\u53CD\u5E94\u7684\u8BED\u53E5
-searchUe=with fildList  as data unwind data as row\n \
-match (n)-[r:\u786E\u8BCA|:\u62DF\u8BCA]->(m:UntowardEffect)\n \
-where n.name=row\n \
+searchUe=match (n)-[r:\u786E\u8BCA|:\u62DF\u8BCA]->(m:UntowardEffect)\n \
+where n.name in fildList\n \
 with distinct m,r\n \
-return m.name as name, labels(m)[0] as label,type(r) as relationType
+return m.name as name
 
 #\u67E5\u627E\u4E00\u4E9B\u8BCD\u662F\u5426\u5728\u56FE\u8C31\u4E2D
 searchWords=match(d) where d.name in fildList return distinct d.name as name

+ 52 - 0
graphdb/src/main/java/org/diagbot/repository/BaseNodeRepository.java

@@ -6,6 +6,7 @@ import org.springframework.data.neo4j.repository.Neo4jRepository;
 
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 public interface BaseNodeRepository extends Neo4jRepository<BaseNode, Long> {
     // update Node by Name
@@ -63,4 +64,55 @@ public interface BaseNodeRepository extends Neo4jRepository<BaseNode, Long> {
             "return d.name as name,type(r0) as type")
     List<Map<String,Object>> getShenJiDrugsMedication(String dis,List filds);
 
+
+    //新结构推送诊断
+    //查找词所在序号
+    @Query("match(h)-[r:属于|:诊断依据]->(c:Condition) \n" +
+            "where h.name in {0}\n" +
+            "with c.name as v,count(distinct r)>=c.path as hh\n" +
+            "where hh =true\n" +
+            "return v")
+    Set<String> getFildInNumber(Set diagList);
+    //查找符合的诊断依据
+    @Query("match (l)-[r:诊断依据]->(m:Condition)\n "+
+    "where l.name in {0} \n" +
+    "with m,{1} as data\n" +
+    "match (n)-[r:诊断依据]->(m:Condition)\n" +
+    "where n.name in data\n" +
+    "with m.name as condition, count(distinct r) as sd,m.path as jundgement\n" +
+    "where sd>=jundgement return condition")
+    List<String> getFildInCondition(List<String> startList,Set<String> fildInNumber);
+    //查找疑诊
+    @Query("match (n:Condition)-[r:确诊|:拟诊]->(m:Disease)\n" +
+            "where n.name in {0}\n" +
+            "with distinct m,r\n" +
+            "return m.name as name, labels(m)[0] as label,type(r) as relationType;")
+    List<Map<String,Object>> getFildDis(Set<String> startList);
+    //查找鉴别诊断
+    @Query("match(d:Disease)-[r:鉴别诊断]->(h) where d.name={0} return h.name as name")
+    List<String> getDiffDis(String mainDis);
+    //查找急诊
+    @Query("match(d:Disease) where d.name in {0} and d.emergency=1 return d.name as emDis")
+    List<String> getEmergency(Set disSet);
+
+    //查找诊断对应的不良反应集合
+    @Query("match(d:Disease)-[r:不良反应]->(u:UntowardEffect) where d.name in {0}\n" +
+            "return d.name as dis,collect(u.name) as ueCollect")
+    List<Map<String,Object>> getUntowardEffect(String[] webDiag);
+    //通过页面内容推出不良反应集合
+    @Query("match (n)-[r:确诊|:拟诊]->(m:UntowardEffect) where n.name in {0} return distinct m.name as name")
+    Set<String> pushUntowardEffects(Set<String> ss);
+
+    //指标推送
+    //通过页面内容查找指标
+    @Query("match (n)-[r:确诊|:拟诊]->(m:Indicators) where n.name in {0} return distinct m.name as name")
+    Set<String> pushInd(Set<String> ss);
+    //处理某个具体的指标(肾功能不全)
+    @Query("match(d:Indicators{name:{0}})-[r2:内容]->(n:Content) where r2.p=1 \n" +
+            "return r2.p as sort1 ,n.name as conten,null as sort2,null as item,null as controlType,null as state,null as value,null as uint,null as details\n" +
+            "union\n" +
+            "match(d:Indicators{name:{0}})-[r2:内容]->(n:Content)-[r3:项目]->(i:Item)\n" +
+            "return r2.p as sort1 ,n.name as conten,r3.p as sort2,i.name as item,i.controlType as controlType,i.state as state,i.value as value,i.uint as uint,i.details as details order by sort1,sort2")
+    List<Map<String,Object>> allSort(String ind);
+
 }

+ 191 - 74
graphdb/src/main/java/org/diagbot/service/impl/KnowledgeServiceImpl.java

@@ -1,5 +1,6 @@
 package org.diagbot.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import org.diagbot.entity.node.LIS;
 import org.diagbot.entity.node.Symptom;
@@ -196,104 +197,136 @@ public class KnowledgeServiceImpl implements KnowledgeService {
         return map;
     }
 
+    /**
+     * 推送疑诊,鉴别诊断,急诊,指标推送,不良反应,管理评估
+     * @param searchData
+     * @return
+     */
     @Override
     public ResponseData getDis(SearchData searchData) {
         ResponseData responseData = new ResponseData();
+        Set<String> queZhen = new HashSet<>();
+        Map<String, Map<String, String>> diseaseCondition = new LinkedHashMap<>();
+        String webDiag = searchData.getDiag();
         String[] featureTypes = searchData.getFeatureType().split(",");
         List<String> featureTypeList = Arrays.asList(featureTypes);
         logger.info("前端传来的features :"+featureTypeList);
-        List<String> newList = new ArrayList<>();
-        List<String> inputList = new ArrayList<>();
         Map<String, Map<String, String>> inputs = searchData.getInputs();
         Integer diseaseType = searchData.getDisType();
         logger.info("diseaseType为 :"+diseaseType);
         Set<String> ss = inputs.keySet();
         logger.info("分词系统传来的词: "+ss);
         logger.info("图谱开始根据传来的分词计算诊断.....");
-        inputList.addAll(ss);
-        //图谱计算是否有组合词
-        List<Map<String, Object>> collectionWord = baseNodeRepository.getCollectionWord(inputList);
-        if(collectionWord !=null && collectionWord.size()>0){
-            for (Map<String, Object> word:collectionWord) {
-                String jundgement = word.get("jundgement").toString();
-                String standName = word.get("standName").toString();
-                if("TRUE".equals(jundgement)){
-                    inputList.add(standName);
-                }
-            }
-        }
-        List<Map<String, Object>> collectJYWord = baseNodeRepository.getCollectJYWord(inputList);
-        if(collectJYWord !=null && collectJYWord.size()>0){
-            for (Map<String, Object> word:collectJYWord) {
-                String fild = word.get("fild").toString();
-                String[] typeCollect = (String[])word.get("typeCollect");
-                if(typeCollect.length == 1 && "近义词".equals(typeCollect[0])){
-                    List<Map<String, Object>> jyWord = baseNodeRepository.getJYWord(fild);
-                    if(jyWord !=null && jyWord.size()>0){
-                        for (Map<String, Object> ji:jyWord) {
-                            String js = ji.get("js").toString();
-                            inputList.remove(fild);
-                            inputList.add(js);
-                        }
+        //开始推送诊断逻辑,包括推送疑诊,急诊,鉴别诊断
+        if (featureTypeList != null && featureTypeList.contains("7")){
+            //第一,二步查询输入的词所在number
+            Set<String> fildInNumber = this.getNumber(ss);
+            //第三步查找疑诊
+            List<Map<String, Object>> fildDis = baseNodeRepository.getFildDis(fildInNumber);
+            if(fildDis != null && fildDis.size()>0){
+                for (Map<String, Object> disMap:fildDis) {
+                    String relationType = disMap.get("relationType").toString();
+                    String name = disMap.get("name").toString();
+                    if("确诊".equals(relationType)){
+                        queZhen.add(name);
+                    }else if("拟诊".equals(relationType)){
+                        queZhen.add(name);
                     }
                 }
             }
-        }
-        newList.addAll(inputList);
-        while (newList.size()>0){
-            List<Map<String, Object>> condition = baseNodeRepository.getCondition(newList, inputList);
-            newList.clear();
-            if(condition !=null && condition.size()>0){
-                for (Map<String, Object> cd:condition) {
-                    String conditionName = cd.get("condition").toString();
-                    String jundgement = cd.get("jundgement").toString();
-                    if ("true".equals(jundgement)) {
-                        newList.add(conditionName);
-                        inputList.add(conditionName);
+            logger.info("图谱推出的疑诊为: "+queZhen);
+            for (String que:queZhen) {
+                Map<String,String> titleMap = new HashMap<>();
+                titleMap.put("确诊","");
+                diseaseCondition.put(que,titleMap);
+            }
+            //第四步查找鉴别诊断
+            String mainDiag = null;//主诊断
+            if(webDiag != null && !"".equals(webDiag)){
+                String[] webDiagSplits = webDiag.split(",");
+                mainDiag = webDiagSplits[0];
+            }
+            if(mainDiag != null){
+                //走鉴别诊断逻辑
+                List<String> diffDis = baseNodeRepository.getDiffDis(mainDiag);
+                if(diffDis != null && diffDis.size()>0){
+                    for (String diff:diffDis) {
+                        if (queZhen.contains(diff)) {
+                            Map<String, String> stringStringMap = diseaseCondition.get(diff);
+                            stringStringMap.put("鉴别诊断", "");
+                            diseaseCondition.put(diff, stringStringMap);
+                        } else {
+                            Map<String, String> diffMap = new HashMap<>();
+                            diffMap.put("鉴别诊断", "");
+                            diseaseCondition.put(diff, diffMap);
+                        }
                     }
                 }
             }
-        }
-        List<String> que = new ArrayList<>();
-        List<Map<String, Object>> disease = baseNodeRepository.getDisease(inputList);
-        if(disease !=null && disease.size()>0){
-            for (Map<String, Object> d: disease) {
-                String diseaseName = d.get("name").toString();
-                String relationType = d.get("relationType").toString();
-                if("确诊".equals(relationType) || "拟诊".equals(relationType)){
-                    que.add(diseaseName);
+            //急诊逻辑
+            List<String> emergency = baseNodeRepository.getEmergency(diseaseCondition.keySet());
+            if(emergency!=null && emergency.size()>0){
+                for (String em:emergency) {
+                    Map<String, String> stringStringMap = diseaseCondition.get(em);
+                    stringStringMap.put("急诊","");
+                    diseaseCondition.put(em,stringStringMap);
                 }
             }
-        }
-        logger.info("图谱计算出来的诊断为: "+que);
-        List<FeatureRate> featureRates = new ArrayList<>();
-        if(que !=null && que.size()>0){
-            for (String quezhen:que) {
-                if(!"低血糖反应".equals(quezhen) && !"胃肠道不良反应".equals(quezhen)
-                        && !"肾功能不全".equals(quezhen)){
+            List<FeatureRate> featureRates = new ArrayList<>();
+            if(diseaseCondition != null){
+                for (Map.Entry<String, Map<String,String>> d : diseaseCondition.entrySet()) {
                     FeatureRate featureRate = new FeatureRate();
-                    featureRate.setFeatureName(quezhen);
+                    featureRate.setFeatureName(d.getKey());
                     featureRate.setExtraProperty("");
-                    featureRate.setDesc(quezhen);
+                    Map<String, String> value = d.getValue();
+                    String s = JSON.toJSONString(value);
+                    featureRate.setDesc(s);
                     featureRate.setRate("neo4j");
                     featureRates.add(featureRate);
                 }
             }
+            responseData.setDis(featureRates);
         }
-        String webDiag = searchData.getDiag();
-        logger.info("界面输入的诊断为: "+webDiag);
-        if(webDiag.trim()!=null && webDiag.trim() !="" && featureTypeList.contains("8")){
+        Set<String> que = diseaseCondition.keySet();
+        logger.info("图谱计算出来的诊断(包含疑诊,急诊,鉴别诊断)为: "+que);
+
+        //推送治疗,包含不良反应
+        if(webDiag!=null && webDiag.trim() !="" && featureTypeList.contains("8")){
             logger.info("界面有诊断,并且features包含8,可以走治疗方案");
-            Map<String, Filnlly> mulDiseaseTreat = processTreat(webDiag, ss,diseaseType,que);
+            //查找页面诊断里是否有不良反应(慢病的情况下)
+            Map<String, List<String>> disUE = new HashMap<>();
+            String[] webDiagList = webDiag.split(",|,|、|;|:|;");
+            List<Map<String, Object>> untowardEffect = baseNodeRepository.getUntowardEffect(webDiagList);
+            if(untowardEffect.size()>0){
+                for (Map<String, Object> ue:untowardEffect) {
+                    String dis = ue.get("dis").toString();
+                    String [] ueCollect = (String [])ue.get("ueCollect");
+                    List<String> ueList = Arrays.asList(ueCollect);
+                    disUE.put(dis,ueList);
+                }
+            }
+            //根据页面输入内容推出的不良反应集合
+            Set<String> ue = this.getUe(ss);
+            // webDiag:界面诊断,ss:分词,diseaseType:疾病类型,que:疑诊,鉴别诊断,急诊集合
+            Map<String, Filnlly> mulDiseaseTreat = processTreat(webDiag, ss,diseaseType,que,disUE,ue);
             responseData.setTreat(mulDiseaseTreat);
         }
+        int age = searchData.getAge();
+        String sex = searchData.getSex();
+        //指标推送
         if(featureTypeList.contains("22") && que != null && que.size()>0){
             logger.info("图谱推送有疑诊,并且features包含22,可以走右侧推送");
             List<MedicalIndication> medicalIndicationList = new ArrayList<>();
-            MedicalIndication medicalIndication = this.getMedicalIndication(que);
-            medicalIndicationList.add(medicalIndication);
-            responseData.setMedicalIndications(medicalIndicationList);
+            //根据传来的词推送指标
+            Set<String> ind = this.getInd(ss);
+            logger.info("图谱推出的指标为: "+ind);
+            List<MedicalIndication> medicalIndications = this.indProcess(ind, sex, age);
+            responseData.setMedicalIndications(medicalIndications);
+//            MedicalIndication medicalIndication = this.getMedicalIndication(que);
+//            medicalIndicationList.add(medicalIndication);
+//            responseData.setMedicalIndications(medicalIndicationList);
         }
+        //推送管理评估
         if(featureTypeList.contains("11") && diseaseType == 1 && diseaseType !=null) {
             logger.info("featureTypeList 包含11,走管理评估!!!");
 //            MangementEvaluation mangementEvaluation = this.getMangementEvaluation();
@@ -302,7 +335,6 @@ public class KnowledgeServiceImpl implements KnowledgeService {
             Map test = this.getTest();
             responseData.setManagementEvaluation(test);
         }
-        responseData.setDis(featureRates);
         return responseData;
     }
 
@@ -393,6 +425,80 @@ public class KnowledgeServiceImpl implements KnowledgeService {
         return lisPacsFeature;
     }
 
+    //查询词所在number,及有用的condition
+    public Set<String> getNumber(Set<String> ss){
+        List<String> newList = new ArrayList<>();
+        Set<String> fildInNumber = baseNodeRepository.getFildInNumber(ss);
+        newList.addAll(fildInNumber);
+        //第二步查询符合的condition4
+        while (newList.size()>0){
+            List<String> fildInCondition = baseNodeRepository.getFildInCondition(newList, fildInNumber);
+            newList.clear();
+            if(fildInCondition != null && fildInCondition.size()>0){
+                for (String condition:fildInCondition) {
+                    newList.add(condition);
+                    fildInNumber.add(condition);
+                }
+            }
+        }
+        return fildInNumber;
+    }
+
+    /**
+     * 根据内容推出不良反应集合
+     * @param ss 分词
+     * @return
+     */
+    public Set<String>  getUe(Set<String> ss){
+        Set<String> number = getNumber(ss);
+        Set<String> ueSet = baseNodeRepository.pushUntowardEffects(number);
+        return ueSet;
+    }
+
+    /**
+     * 根据传来的词推送指标
+     * @param ss
+     * @return
+     */
+    public Set<String> getInd(Set<String> ss){
+        Set<String> number = getNumber(ss);
+        Set<String> indSet = baseNodeRepository.pushInd(number);
+        return indSet;
+    }
+
+    /**
+     * 指标推送处理
+     * @param indSet 指标集合
+     * @param sex 性别
+     * @param age 年龄
+     * @return
+     */
+    public List<MedicalIndication> indProcess(Set<String> indSet,String sex,Integer age){
+        List<MedicalIndication> medicalIndicationList = new ArrayList<>();
+        if (indSet != null && indSet.size() > 0) {
+            for (String s : indSet) {
+                MedicalIndication medicalIndication = new MedicalIndication();
+                List<MedicalIndicationDetail> medicalIndicationDetailList = new ArrayList<>();
+                medicalIndication.setName(s);
+                MedicalIndicationDetail medicalIndicationDetail1 = null;
+                MedicalIndicationDetail medicalIndicationDetail2 = null;
+                MedicalIndicationDetail medicalIndicationDetail3 = null;
+                JSONObject gongshiJson = null;
+                List<JSONObject> detailList = null;
+                List<JSONObject> resultList = null;
+                List<JSONObject> sexList = null;
+                List<JSONObject> shiFouList = null;
+                JSONObject shiFouJson = null;
+                Set<String> results = new LinkedHashSet<>();
+                List<Map<String, Object>> allSortMaps = baseNodeRepository.allSort(s);
+
+
+            }
+        }
+
+        return medicalIndicationList;
+    }
+
     public Map<String, Set<String>> processLisPacs(List<String> webDiagList) {
         Map<String, Set<String>> lisPacsMap = new HashMap<>();
         List<String> lisArray = new ArrayList<>();
@@ -418,7 +524,7 @@ public class KnowledgeServiceImpl implements KnowledgeService {
      * 处理治疗
      * @param
      */
-    public Map<String, Filnlly> processTreat(String webDisease,Set<String> inputFilds,Integer disType,List<String> que){
+    public Map<String, Filnlly> processTreat(String webDisease,Set<String> inputFilds,Integer disType,Set<String> que,Map<String, List<String>> disUE,Set<String> ue){
         Map<String, Filnlly> diagTreat = new HashMap<>();
         NumberFormat nf = NumberFormat.getPercentInstance();
         nf.setMinimumFractionDigits(0);//设置该百分比数字,保留2位小数;
@@ -431,6 +537,14 @@ public class KnowledgeServiceImpl implements KnowledgeService {
             for (String fild:inputFilds) {
                 fildsList.add(fild);
             }
+            if(que != null && que.size()>0){
+                for (String yizhen : que) {
+                    fildsList.add(yizhen );
+                }
+            }
+            for (String h : ue) {
+                fildsList.add(h);
+            }
             for (int j = 0; j < diseaseList.size(); j++) {
                 if (i != j) {
                     fildsList.add(diseaseList.get(j));
@@ -566,12 +680,15 @@ public class KnowledgeServiceImpl implements KnowledgeService {
             //走不良反应
             if(disType !=null && 1==disType){
                 logger.info("disType=1,可以走不良反应!!");
-                List<Indicators> indicatorsList1 = new ArrayList<>();
-                Indicators indicators1 = getAdverse(que, "低血糖反应");
-                Indicators indicators2 = getAdverse(que, "胃肠道不良反应");
-                indicatorsList1.add(indicators1);
-                indicatorsList1.add(indicators2);
-                filnlly.setAdverseEvent(indicatorsList1);
+                List<String> diseUeList = disUE.get(disFild.getKey());
+                if (diseUeList != null && diseUeList.size() > 0) {
+                    List<Indicators> indicatorsList1 = new ArrayList<>();
+                    for (String de : diseUeList) {
+                        Indicators indicators1 = getAdverse(ue, de);
+                        indicatorsList1.add(indicators1);
+                    }
+                    filnlly.setAdverseEvent(indicatorsList1);
+                }
             }
             filnlly.setTreatment(drugsList);
             diagTreat.put(disFild.getKey(),filnlly);
@@ -584,7 +701,7 @@ public class KnowledgeServiceImpl implements KnowledgeService {
      * @param diseaseSet 图谱推出的诊断
      * @return
      */
-    public MedicalIndication getMedicalIndication(List<String> diseaseSet){
+    public MedicalIndication getMedicalIndication(Set<String> diseaseSet){
         MedicalIndication medicalIndication = new MedicalIndication();
         if(diseaseSet.contains("肾功能不全")){
             logger.info("diseaseSet中包含肾功能不全");
@@ -835,7 +952,7 @@ public class KnowledgeServiceImpl implements KnowledgeService {
      * @param name
      * @return
      */
-    public Indicators getAdverse(List<String> dis,String name){
+    public Indicators getAdverse(Set<String> dis,String name){
         List<Detail> detailList1 = new ArrayList<>();
         Indicators indicators1 = new Indicators();
         indicators1.setName(name);