Przeglądaj źródła

推荐用药排序

kongwz 5 lat temu
rodzic
commit
13da950579

+ 58 - 53
graph/src/main/java/org/diagbot/graph/medicationProcess/PushTreat.java

@@ -62,25 +62,17 @@ public class PushTreat {
         List<String> allFilds = this.getAllFilds(webDiag, crisisDetails, inputList, ueSet);
 
         // TODO: 2019/11/19     匹配规则用药,判断是否满足规则
-        List<TreatDetail> treatDetailList_rule = this.ruleMedicaton(disName, webDiag, allFilds, driver);
-        String name = treatDetailList_rule.get(0).getTitle().substring(0, treatDetailList_rule.get(0).getTitle().indexOf("治疗方案"));
-        if(treatDetailList_rule.size() == 1 && disName.equals(name)){
-            // TODO: 2019/11/28  匹配主症+其他+其他
-//            List<TreatDetail> treatmentPlanList_otherrule = this.otherRuleMedicaton(disName, exculdDiagFilds, allFilds, driver);
-//            treatmentPlanList = treatmentPlanList_otherrule;
-
-        }else if(treatDetailList_rule.size() == 1 && !disName.equals(name)){
-            treatmentPlanList =treatDetailList_rule;
-        }else {
-            treatmentPlanList = treatDetailList_rule;
-        }
+        treatmentPlanList= this.ruleMedicaton(disName, webDiag, allFilds, driver);
+
         // TODO: 2019/11/28  匹配主症+其他+其他
         List<TreatDetail> treatmentPlanList_otherrule = this.otherRuleMedicaton(disName, exculdDiagFilds, allFilds, driver);
         treatmentPlanList.addAll(treatmentPlanList_otherrule);
+
         // TODO: 2019/11/19     规则不满足的情况下,返回主诊断的用药情况
         if(treatmentPlanList.size() == 0){
             treatmentPlanList = this.ordinaryMedicaton(disName,allFilds,driver);
         }
+
         // TODO: 2019/11/21 处理合并症 例如高热
         List<TreatDetail> treatDetailList = this.complicationMedicaton(inputList, driver, allFilds);
         treatmentPlanList.addAll(treatDetailList);
@@ -94,6 +86,7 @@ public class PushTreat {
         Map<String,Map<String,Object>> disDrugs = new HashMap<>();
         Map<String, String> medicaton_ji = new HashMap<>();
         Map<String, List<String>> medicatonMap = new HashMap<>();
+        Map<String,List<String>> condiTypedis = new HashMap<>();
         Set<String> disSet = new HashSet<>();
         List<String> filds = new ArrayList<>();
         if(inputList.length>0){
@@ -112,14 +105,14 @@ public class PushTreat {
                 logger.info("规则用药,查询语句为:\n" + query);
                 StatementResult result = tx.run(query);
                 while (result.hasNext()) {
-                    searchDrugs(result, conditionDesign, disDrugs,disSet);
+                    searchDrugs(condiTypedis,result, conditionDesign, disDrugs,disSet);
                 }
                 return 1;
             }
         });
         closeSession(session);
+        addColl(condiTypedis,disDrugs);
         disTreatDetailList = this.processMedication_he(disDrugs, conditionDesign, allFilds, driver);
-
         return disTreatDetailList;
     }
     /**
@@ -134,7 +127,7 @@ public class PushTreat {
 
         List<Drugs> dList = new ArrayList<>();
         Map<String, String> medicaton_ji = new HashMap<>();
-        Map<String, List<String>> medicatonMap = new HashMap<>();
+        Map<String, List<String>> medicatonMap = new LinkedHashMap<>();
 
         Session session = driver.session(AccessMode.WRITE);
         session.writeTransaction(new TransactionWork<Integer>() {
@@ -169,6 +162,7 @@ public class PushTreat {
     private List<TreatDetail> otherRuleMedicaton(String disName,List<String> excludeDiagFilds,List<String> allFilds,Driver driver){
         Map<String,Integer> conditionDesign = new HashMap<>();
         Map<String,Map<String,Object>> disDrugs = new HashMap<>();
+        Map<String,List<String>> condiTypedis = new HashMap<>();
         Set<String> disSet = new HashSet<>();
         excludeDiagFilds.add("'"+disName+"'");
         Session  session = driver.session(AccessMode.WRITE);
@@ -179,21 +173,15 @@ public class PushTreat {
                 logger.info("规则用药,查询语句为:\n" + query);
                 StatementResult result = tx.run(query);
                 while (result.hasNext()) {
-                    searchDrugs(result, conditionDesign, disDrugs,disSet);
+                    searchDrugs(condiTypedis,result, conditionDesign, disDrugs,disSet);
                 }
                 return 1;
             }
         });
         closeSession(session);
+        addColl(condiTypedis,disDrugs);
         List<TreatDetail> treatDetailList =new ArrayList<>();
-//        if(!disSet.contains(disName)){
-//            //规则不匹配,返回主诊断治疗方案
-//            treatDetailList =  this.ordinaryMedicaton(disName,allFilds,driver);
-//        }else {
-            treatDetailList = this.processMedication_otherrule(disName,disDrugs, conditionDesign, allFilds, driver);
-
-//        }
-
+        treatDetailList = this.processMedication_otherrule(disName,disDrugs, conditionDesign, allFilds, driver);
         return treatDetailList;
     }
 
@@ -201,6 +189,7 @@ public class PushTreat {
     private List<TreatDetail> ruleMedicaton(String disName,String webDiag,List<String> allFilds,Driver driver){
         Map<String,Integer> conditionDesign = new HashMap<>();
         Map<String,Map<String,Object>> disDrugs = new HashMap<>();
+        Map<String,List<String>> condiTypedis = new HashMap<>();
         Set<String> disSet = new HashSet<>();
         List<String> webDiagList = processWebDiag(disName,webDiag);
         Session  session = driver.session(AccessMode.WRITE);
@@ -208,30 +197,39 @@ public class PushTreat {
             @Override
             public Integer execute(Transaction tx) {
                 String query = propertiesUtil_treat.getProperty("medicationRule").replace("filds",webDiagList.toString());
-//                String query = propertiesUtil_treat.getProperty("medicationRule").replace("filds",allFilds.toString());
                 logger.info("规则用药,查询语句为:\n" + query);
                 StatementResult result = tx.run(query);
                 while (result.hasNext()) {
-                    searchDrugs(result, conditionDesign, disDrugs,disSet);
+                    searchDrugs(condiTypedis,result, conditionDesign, disDrugs,disSet);
                 }
                 return 1;
             }
         });
         closeSession(session);
+        addColl(condiTypedis,disDrugs);
         List<TreatDetail> treatDetailList =new ArrayList<>();
-        if(!disSet.contains(disName)){
-            //规则不匹配,返回主诊断治疗方案
-            treatDetailList =  this.ordinaryMedicaton(disName,allFilds,driver);
-        }else {
-            treatDetailList = this.processMedication(disName,disDrugs, conditionDesign, allFilds, driver);
+        treatDetailList = this.processMedication(disName,disDrugs, conditionDesign, allFilds, driver);
+        return treatDetailList;
+    }
+    private void addColl(Map<String,List<String>> condiTypedis,Map<String,Map<String,Object>> disDrugs){
+        List<List<String>> collList = new ArrayList<>();
+        if(condiTypedis!= null &&condiTypedis.size()>0){
+            for (Map.Entry<String,List<String>> ctd:condiTypedis.entrySet()) {
+                if(disDrugs.containsKey(ctd.getKey().split("&")[1])){
+                    Map<String, Object> objectMap = disDrugs.get(ctd.getKey().split("&")[1]);
+                    List<String> value = ctd.getValue();
+                    collList.add(value);
+                    objectMap.put("coll",collList);
+                    disDrugs.put(ctd.getKey().split("&")[1],objectMap);
+                }
 
+            }
         }
 
-        return treatDetailList;
-    }
 
-    private void searchDrugs(StatementResult result, Map<String, Integer> conditionDesign, Map<String, Map<String, Object>> disDrugs,Set<String> disSet) {
-        List<String> collection =null;
+    }
+    private void searchDrugs(Map<String,List<String>> condiTypedis,StatementResult result, Map<String, Integer> conditionDesign, Map<String, Map<String, Object>> disDrugs,Set<String> disSet) {
+        String collection =null;
         int i=0;
         Record next = result.next();
         String name = next.get("name").toString().replace("\"", "");
@@ -242,38 +240,45 @@ public class PushTreat {
         disSet.add(disName);
         if(design >= i){
             i = design;
-            collection = (List) next.get("collection").asList();
+            collection = next.get("collection").toString().replace("\"", "");
         }
         conditionDesign.put(name,i);
+        String ncd =category+"&"+ name + "&" + disName;
+        if(condiTypedis.containsKey(ncd)){
+            List<String> list = condiTypedis.get(ncd);
+            list.add(collection);
+            condiTypedis.put(ncd,list);
+        }else {
+            List<String> list = new ArrayList<>();
+            list.add(collection);
+            condiTypedis.put(ncd,list);
+        }
+
         if(!disDrugs.containsKey(name)){
             Map<String, Object> designHashMap = new HashMap<>();
-            List<String> pList = new ArrayList<>();
             List<String> cateList = new ArrayList<>();
             List<String> disList = new ArrayList<>();
-            List<Object> collList = new ArrayList<>();
-            pList.add(p);
-            designHashMap.put("p",pList);
-            cateList.add(category);
+            if(!cateList.contains(category)){
+                cateList.add(category);
+            }
             designHashMap.put("cate",cateList);
-            disList.add(disName);
+            if(!disList.contains(disName)){
+                disList.add(disName);
+            }
             designHashMap.put("dis",disList);
-            collList.add(collection);
-            designHashMap.put("coll",collList);
             disDrugs.put(name,designHashMap);
         }else {
             Map<String, Object> objectMap = disDrugs.get(name);
-            List<String> p1 = (List<String>)objectMap.get("p");
-            p1.add(p);
-            objectMap.put("p",p1);
             List<String> cate1 = (List<String>)objectMap.get("cate");
-            cate1.add(category);
+            if(!cate1.contains(category)){
+                cate1.add(category);
+            }
             objectMap.put("cate",cate1);
             List<String> dis1 = (List<String>)objectMap.get("dis");
-            dis1.add(disName);
+            if(!dis1.contains(disName)){
+                dis1.add(disName);
+            }
             objectMap.put("dis",dis1);
-            List<Object> coll1 = (List<Object>)objectMap.get("coll");
-            coll1.add(collection);
-            objectMap.put("coll",coll1);
             disDrugs.put(name,objectMap);
         }
     }
@@ -446,7 +451,7 @@ public class PushTreat {
     private List<Drugs> searchMedication(List<String> drugs,List<String> allFilds,Driver driver){
         List<Drugs> dList = new ArrayList<>();
         Map<String, String> medicaton_ji = new HashMap<>();
-        Map<String, List<String>> medicatonMap = new HashMap<>();
+        Map<String, List<String>> medicatonMap = new LinkedHashMap<>();
 
         Session session = driver.session(AccessMode.WRITE);
         session.writeTransaction(new TransactionWork<Integer>() {

+ 3 - 3
graph/src/main/resources/pushTreat.properties

@@ -10,16 +10,16 @@ with c,count(distinct r)>=c.path as hh \n \
 where hh =true \n \
 with c \n \
 match(c)-[r:\u63A8\u8350]->(t:TreatCollection) \n \
-return c.name as name,c.design as design,r.p as p,r.category as category,r.disName as disName,collect(t.name) as collection order by p
+return c.name as name,c.design as design,r.p as p,r.category as category,r.disName as disName,t.name as collection order by p
 #\u89C4\u5219\u627E\u836F
-searchMedication_rule=match(m:Medicine)-[r:\u5C5E\u4E8E]->(d:Drugs) where d.name in drugs \n \
+searchMedication_rule=unwind drugs as row match(m:Medicine)-[r:\u5C5E\u4E8E]->(d:Drugs) where d.name=row \n \
 with m,d \n \
 match(m:Medicine)-[r:\u5C5E\u4E8E]->(h:Drugs) where d.bigDrugs=h.name \n \
 with h,d,m \n \
 match(m)<-[R:\u614E\u7528|:\u5FCC\u7528]-(i) where i.name in filds \n \
 return h.name as big,d.name as sub,m.name as med,type(R) as ty \n \
 union \n \
-match(m:Medicine)-[r:\u5C5E\u4E8E]->(d:Drugs) where d.name in drugs \n \
+unwind drugs as row match(m:Medicine)-[r:\u5C5E\u4E8E]->(d:Drugs) where d.name=row \n \
 with m,d \n \
 match(m:Medicine)-[r:\u5C5E\u4E8E]->(h:Drugs) where d.bigDrugs=h.name \n \
 return h.name as big,d.name as sub,m.name as med,null as ty