ソースを参照

Merge remote-tracking branch 'origin/master'

MarkHuang 6 年 前
コミット
05ed400e36

+ 14 - 4
algorithm/src/main/java/org/algorithm/core/cnn/model/RelationExtractionEnsembleModel.java

@@ -11,7 +11,9 @@ import org.tensorflow.Tensor;
 import java.io.File;
 import java.nio.FloatBuffer;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.*;
 
 /**
@@ -26,7 +28,7 @@ public class RelationExtractionEnsembleModel extends AlgorithmCNNExecutor {
     private SavedModelBundle bundle; // 模型捆绑
     private Session session;  // 会话
     private RelationExtractionDataSet dataSet;
-    private RelationExtractionSubModel[] subModels = new RelationExtractionSubModel[3];
+    private RelationExtractionSubModel[] subModels = new RelationExtractionSubModel[2];
     private ExecutorService executorService = Executors.newCachedThreadPool();
 
     public RelationExtractionEnsembleModel() {
@@ -39,9 +41,17 @@ public class RelationExtractionEnsembleModel extends AlgorithmCNNExecutor {
 
         this.dataSet = new RelationExtractionDataSet(dataSetPath);
         this.init(exportDir);
-        subModels[0] = new RelationExtractionSubModel("cnn_1d_low");
-        subModels[1] = new RelationExtractionSubModel("cnn_1d_lstm_low");
-        subModels[2] = new RelationExtractionSubModel("lstm_low_api");
+
+        Map<String, Tensor<Float>> cnn_1d_low_map = new HashMap<>();
+        cnn_1d_low_map.put("keep_prob",Tensor.create(1.0f, Float.class));
+        subModels[0] = new RelationExtractionSubModel("cnn_1d_low", cnn_1d_low_map);
+//        subModels[1] = new RelationExtractionSubModel("cnn_1d_lstm_low");
+
+        Map<String, Tensor<Float>> lstm_low_api_map = new HashMap<>();
+        lstm_low_api_map.put("input_keep_prob",Tensor.create(1.0f, Float.class));
+        lstm_low_api_map.put("output_keep_prob",Tensor.create(1.0f, Float.class));
+        lstm_low_api_map.put("state_keep_prob",Tensor.create(1.0f, Float.class));
+        subModels[1] = new RelationExtractionSubModel("lstm_low_api", lstm_low_api_map);
     }
 
     /**

+ 21 - 6
algorithm/src/main/java/org/algorithm/core/cnn/model/RelationExtractionSubModel.java

@@ -4,10 +4,12 @@ import org.algorithm.core.cnn.dataset.RelationExtractionDataSet;
 import org.diagbot.pub.utils.PropertiesUtil;
 import org.tensorflow.SavedModelBundle;
 import org.tensorflow.Session;
+import org.tensorflow.Session.Runner;
 import org.tensorflow.Tensor;
 
 import java.io.File;
 import java.nio.IntBuffer;
+import java.util.Map;
 
 /**
  * @Author: bijl
@@ -18,18 +20,20 @@ public class RelationExtractionSubModel {
     private final String X_PLACEHOLDER = "X";
     private final String pos1_PLACEHOLDER = "pos1";
     private final String pos2_PLACEHOLDER = "pos2";
+    private Map<String, Tensor<Float>> keep_probs = null;
     private String PREDICTION = null;
     private final int NUM_LABEL = 1;
     private SavedModelBundle bundle; // 模型捆绑
     private Session session;  // 会话
     protected RelationExtractionDataSet dataSet;
 
-    public RelationExtractionSubModel(String modelName) {
+    public RelationExtractionSubModel(String modelName, Map<String, Tensor<Float>> keep_probs) {
+
+        this.keep_probs = keep_probs;
 
         PropertiesUtil prop = new PropertiesUtil("/algorithm.properties");
 
         String modelsPath = prop.getProperty("basicPath");  // 模型基本路径
-        String re_path = prop.getProperty("relationExtraction");  // 模型基本路径
         this.PREDICTION = modelName + "/prediction/Sigmoid";
         String exportDir = modelsPath.replace("model_version_replacement", modelName);
         String dataSetPath = modelsPath.substring(0, modelsPath.indexOf("model_version_replacement"));
@@ -76,12 +80,23 @@ public class RelationExtractionSubModel {
                 IntBuffer.wrap(inputValues[2])
         );
 
-        return this.session.runner()
+//        return this.session.runner()
+//                .feed(this.X_PLACEHOLDER, charId)  // 输入,字符id
+//                .feed(this.pos1_PLACEHOLDER, pos1)  // 输入,相对位置1
+//                .feed(this.pos2_PLACEHOLDER, pos2)  //  输入,相对位置2
+//                .feed("keep_prob", Tensor.create(1.0f, Float.class))  // 输入,dropout保留率
+//                .fetch(this.PREDICTION).run().get(0)  // 输出,tensor
+//                .copyTo(new float[batchSize][this.NUM_LABEL]);  // tensor转float[]对象
+
+        Runner runner = this.session.runner()  // 不同子模型共用的输入
                 .feed(this.X_PLACEHOLDER, charId)  // 输入,字符id
                 .feed(this.pos1_PLACEHOLDER, pos1)  // 输入,相对位置1
-                .feed(this.pos2_PLACEHOLDER, pos2)  //  输入,相对位置2
-                .feed("keep_prob", Tensor.create(1.0f, Float.class))  // 输入,dropout保留率
-                .fetch(this.PREDICTION).run().get(0)  // 输出,tensor
+                .feed(this.pos2_PLACEHOLDER, pos2);  //  输入,相对位置2
+
+        for (Map.Entry<String, Tensor<Float>> entry : this.keep_probs.entrySet()) // 非共用的输入
+            runner = runner.feed(entry.getKey(), entry.getValue());
+
+        return  runner.fetch(this.PREDICTION).run().get(0)  // 输出,tensor
                 .copyTo(new float[batchSize][this.NUM_LABEL]);  // tensor转float[]对象
     }
 

+ 9 - 1
algorithm/src/main/java/org/algorithm/test/ReSubModelTest.java

@@ -1,6 +1,10 @@
 package org.algorithm.test;
 
 import org.algorithm.core.cnn.model.RelationExtractionSubModel;
+import org.tensorflow.Tensor;
+
+import java.util.HashMap;
+import java.util.Map;
 
 /**测试子模型加载
  * @Author: bijl
@@ -12,7 +16,11 @@ public class ReSubModelTest {
     public static void main(String[] args) {
 //        RelationExtractionSubModel subModel = new RelationExtractionSubModel("cnn_1d_low");
 //        RelationExtractionSubModel subModel = new RelationExtractionSubModel("cnn_1d_lstm_low");
-        RelationExtractionSubModel subModel = new RelationExtractionSubModel("lstm_low_api");
+        Map<String, Tensor<Float>> lstm_low_api_map = new HashMap<>();
+        lstm_low_api_map.put("input_keep_prob",Tensor.create(1.0f, Float.class));
+        lstm_low_api_map.put("output_keep_prob",Tensor.create(1.0f, Float.class));
+        lstm_low_api_map.put("state_keep_prob",Tensor.create(1.0f, Float.class));
+        RelationExtractionSubModel subModel = new RelationExtractionSubModel("lstm_low_api", lstm_low_api_map);
 
 
         int[][] inputValues = new int[3][512];

+ 4 - 198
graph-web/src/main/java/org/diagbot/graphWeb/work/GraphCalculate.java

@@ -52,7 +52,7 @@ public class GraphCalculate {
         Map<String, Map<String,String>> condition = neo4jAPI.getCondition((String[]) inputList.toArray(new String[inputList.size()]),webDiag );
         List<FeatureRate> featureRates = new ArrayList<>();
         for (Map.Entry<String, Map<String,String>> d : condition.entrySet()) {
-            if (!"低血糖反应".equals(d.getKey()) && !"胃肠道不良反应".equals(d.getKey())) {
+//            if (!"低血糖反应".equals(d.getKey()) && !"胃肠道不良反应".equals(d.getKey())) {
                 FeatureRate featureRate = new FeatureRate();
                 featureRate.setFeatureName(d.getKey());
                 featureRate.setExtraProperty("");
@@ -61,7 +61,7 @@ public class GraphCalculate {
                 featureRate.setDesc(s);
                 featureRate.setRate("neo4j");
                 featureRates.add(featureRate);
-            }
+//            }
         }
         Set<String> diseaseSet = condition.keySet();
         logger.info("diseaseSet :" + diseaseSet);
@@ -79,19 +79,13 @@ public class GraphCalculate {
             }
         }
         logger.info("页面导入的所有化验项为 :" +lisSet);
-        //鉴别诊断
-        /*if(webDiag != null && webDiag.trim() != ""){
-            String[] webDiagSplits = webDiag.split(",");
-            String mainDiag = webDiagSplits[0];
-            List<String> differentialDiagnose = neo4jAPI.getDifferentialDiagnose(mainDiag);
-            responseData.setDiffDiag(differentialDiagnose);
-        }*/
+
         //走治疗
         if (webDiag.trim() != null && webDiag.trim() != "" && featureTypeList.contains("8")) {
             // 查找页面诊断里是否有不良反应
             String[] webDiagList = webDiag.split(",|,|、|;|:|;");
             Map<String, List<String>> disUE = neo4jAPI.getDisUE(webDiagList, diseaseType);
-            //获取不良反应集合
+            //根据页面输入内容推出的不良反应集合
             Set<String> ue = neo4jAPI.getUe((String[]) inputList.toArray(new String[inputList.size()]));
             //走平常诊断治疗
             Map<String, Filnlly> mulDiseaseTreat = neo4jAPI.getMulDiseaseTreat_2(webDiag, diseaseType, diseaseSet,disUE,ue,String.join(",", inputList));
@@ -106,9 +100,6 @@ public class GraphCalculate {
                 Map<String, JSONObject> mangementEvaluation1 = mangementEvaluation.getMangementEvaluation();
                 responseData.setManagementEvaluation(mangementEvaluation1);
             }
-//            MangementEvaluation mangementEvaluation = this.getMangementEvaluation();
-//            Map<String, JSONObject> mangementEvaluation1 = mangementEvaluation.getMangementEvaluation();
-//            responseData.setManagementEvaluation(mangementEvaluation1);
         }
         int age = searchData.getAge();
         String sex = searchData.getSex();
@@ -117,12 +108,6 @@ public class GraphCalculate {
             //查找指标
             Set<String> indSet = neo4jAPI.getInd((String[]) inputList.toArray(new String[inputList.size()]));
             logger.info("featureTypeList 包含22,走指标推送!!!,图谱推出的指标为:" + indSet);
-            /*List<MedicalIndication> medicalIndicationList = new ArrayList<>();
-            MedicalIndication medicalIndication = this.getMedicalIndication(indSet,age,sex);
-            if (medicalIndication != null) {
-                medicalIndicationList.add(medicalIndication);
-            }
-            responseData.setMedicalIndications(medicalIndicationList);*/
             List<MedicalIndication> idn = neo4jAPI.getIdn(indSet, age, sex);
             responseData.setMedicalIndications(idn);
 
@@ -271,185 +256,6 @@ public class GraphCalculate {
         return sortedMap;
     }
 
-    /**
-     * 量表和指标
-     *
-     * @param idnSet
-     * @return
-     */
-    public MedicalIndication getMedicalIndication(Set idnSet,Integer age,String sex) throws Exception {
-        MedicalIndication medicalIndication = new MedicalIndication();
-        if (idnSet.contains("肾功能不全")) {
-            logger.info("diseaseSet中包含肾功能不全");
-            //推送指标
-            medicalIndication.setName("肾功能不全");
-            List<MedicalIndicationDetail> medicalIndicationDetailList = new ArrayList<>();
-            //量表
-            MedicalIndicationDetail medicalIndicationDetail1 = new MedicalIndicationDetail();
-            medicalIndicationDetail1.setType(1);
-            JSONObject liangJson = new JSONObject();
-            liangJson.put("name", "密西根糖尿病周围神经病评分(MDNS)");
-            medicalIndicationDetail1.setContent(liangJson);
-            //公式
-            MedicalIndicationDetail medicalIndicationDetail2 = new MedicalIndicationDetail();
-            medicalIndicationDetail2.setType(2);
-            JSONObject gongshiJson = new JSONObject();
-            gongshiJson.put("name", "肾小球滤过率");
-            List<JSONObject> detailList = new ArrayList<>();
-            JSONObject ageJsonObject = new JSONObject();
-            ageJsonObject.put("controlType", 2);
-            ageJsonObject.put("name", "年龄");
-            ageJsonObject.put("value", age);
-            ageJsonObject.put("uint", "");
-            ageJsonObject.put("details", new ArrayList<>());
-            JSONObject indicationJsonObject = new JSONObject();
-            indicationJsonObject.put("controlType", 2);
-            indicationJsonObject.put("name", "血肌酐");
-            indicationJsonObject.put("value", "");
-            indicationJsonObject.put("uint", "mg/dL");
-            indicationJsonObject.put("details", new ArrayList<>());
-            JSONObject sexJson = new JSONObject();
-            sexJson.put("controlType", 1);
-            sexJson.put("name", "性别");
-            sexJson.put("value", "");
-            sexJson.put("uint", "");
-            List<JSONObject> sexList = new ArrayList<>();
-            JSONObject manJson = new JSONObject();
-            manJson.put("detailName", "男");
-            manJson.put("value", 1);
-            manJson.put("state", 0);
-            if("M".equals(sex)){
-                manJson.put("state", 1);
-            }
-            JSONObject womanJson = new JSONObject();
-            womanJson.put("detailName", "女");
-            womanJson.put("value", 1.018);
-            womanJson.put("state", 0);
-            if("F".equals(sex)){
-                womanJson.put("state", 1);
-            }
-            sexList.add(manJson);
-            sexList.add(womanJson);
-            sexJson.put("details", sexList);
-            detailList.add(ageJsonObject);
-            detailList.add(indicationJsonObject);
-            detailList.add(sexJson);
-            gongshiJson.put("details", detailList);
-            medicalIndicationDetail2.setContent(gongshiJson);
-            //其他
-            MedicalIndicationDetail medicalIndicationDetail3 = new MedicalIndicationDetail();
-            medicalIndicationDetail3.setType(3);
-            JSONObject shiFouJson = new JSONObject();
-            shiFouJson.put("name", "是否");
-            shiFouJson.put("controlType", 0);
-            List<JSONObject> shiFouList = new ArrayList<>();
-            JSONObject shiJsonObject = new JSONObject();
-            shiJsonObject.put("detailName", "是");
-            shiJsonObject.put("state", 1);
-            JSONObject fouJsonObject = new JSONObject();
-            fouJsonObject.put("detailName", "否");
-            fouJsonObject.put("state", 0);
-            shiFouList.add(shiJsonObject);
-            shiFouList.add(fouJsonObject);
-            shiFouJson.put("details", shiFouList);
-            medicalIndicationDetail3.setContent(shiFouJson);
-            medicalIndicationDetailList.add(medicalIndicationDetail1);
-            //Map<String, Object> maps = scaleCalcMethod(medicalIndicationDetail2);
-            JSONObject resultJson = new JSONObject();
-            JSONArray resultList = new JSONArray();
-            JSONObject result = new JSONObject();
-            result.put("text", "");
-            result.put("name", "GFR值");
-            resultList.add(result);
-            result = new JSONObject();
-            result.put("text", "");
-            result.put("name", "评估结论");
-            resultList.add(result);
-            gongshiJson.put("result", resultList);
-            medicalIndicationDetail2.setContent(gongshiJson);
-            medicalIndicationDetailList.add(medicalIndicationDetail2);
-            medicalIndicationDetailList.add(medicalIndicationDetail3);
-            medicalIndication.setDetails(medicalIndicationDetailList);
-        } else {
-            medicalIndication = null;
-        }
-        return medicalIndication;
-    }
-
-    /**
-     * 管理评估
-     *
-     * @return
-     */
-    public MangementEvaluation getMangementEvaluation() {
-        MangementEvaluation mangementEvaluation = new MangementEvaluation();
-        Map<String, JSONObject> mangementMap = new HashMap<>();
-        JSONObject curativeJson = new JSONObject();
-        List<JSONObject> itemJson = new ArrayList<>();
-        JSONObject bloodPressure = new JSONObject();
-        bloodPressure.put("controltype", 0);
-        bloodPressure.put("name", "血压控制情况");
-        List<JSONObject> bloodPressureLevelList = new ArrayList<>();
-        String[] items = { "正常", "1级", "2级", "3级" };
-        for (String item : items) {
-            JSONObject iJson = new JSONObject();
-            iJson.put("detailName", item);
-            iJson.put("state", 0);
-            bloodPressureLevelList.add(iJson);
-        }
-        bloodPressure.put("details", bloodPressureLevelList);
-        itemJson.add(bloodPressure);
-
-        JSONObject bmiControl = new JSONObject();
-        bmiControl.put("controltype", 0);
-        bmiControl.put("name", "BMI控制情况");
-        List<JSONObject> bmiControlLevelList = new ArrayList<>();
-        String[] bmiControlitems = { "体重过低", "体重达标", "肥胖前期", "肥胖" };
-        for (String item : bmiControlitems) {
-            JSONObject iJson = new JSONObject();
-            iJson.put("detailName", item);
-            iJson.put("state", 0);
-            bmiControlLevelList.add(iJson);
-        }
-        bmiControl.put("details", bmiControlLevelList);
-        itemJson.add(bmiControl);
-
-        JSONObject bloodFatControl = new JSONObject();
-        bloodFatControl.put("controltype", 0);
-        bloodFatControl.put("name", "血脂控制情况");
-        List<JSONObject> bloodFatControlLevelList = new ArrayList<>();
-        String[] bloodFatControlitems = { "高血脂" };
-        for (String item : bloodFatControlitems) {
-            JSONObject iJson = new JSONObject();
-            iJson.put("detailName", item);
-            iJson.put("state", 0);
-            bloodFatControlLevelList.add(iJson);
-        }
-        bloodFatControl.put("details", bmiControlLevelList);
-        itemJson.add(bloodFatControl);
-        curativeJson.put("rows", itemJson);
-        //分级管理
-        JSONObject gradeJson = new JSONObject();
-        List<JSONObject> gradItemJson = new ArrayList<>();
-        JSONObject bigGrad = new JSONObject();
-        bigGrad.put("name", "血压控制情况");
-        bigGrad.put("controltype", 0);
-        List<JSONObject> gradItemJ = new ArrayList<>();
-        String[] gradItem = { "常规管理", "强化管理" };
-        for (String item : gradItem) {
-            JSONObject j = new JSONObject();
-            j.put("detailName", item);
-            j.put("state", 0);
-            gradItemJ.add(j);
-        }
-        bigGrad.put("details", gradItemJ);
-        gradItemJson.add(bigGrad);
-        gradeJson.put("rows", gradItemJson);
-        mangementMap.put("疗效评估", curativeJson);
-        mangementMap.put("糖尿病分级管理", gradeJson);
-        mangementEvaluation.setMangementEvaluation(mangementMap);
-        return mangementEvaluation;
-    }
 
     public Map<String, Object> scaleCalcMethod(MedicalIndicationDetail medicalIndicationDetail) throws Exception {
         Map<String, Object> scaleCalcResult = new HashMap<>();

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

@@ -771,34 +771,100 @@ public class Neo4jAPI {
     }
 
     /**
-     * 鉴别诊断
-     * @param mainDiag
+     * 新结构,包含关联词
+     * @param keys
+     * @param webDiag
      * @return
      */
-    public List<String> getDifferentialDiagnose(String mainDiag){
-        List<String> differentialDiagnoseList = new LinkedList<>();
+    public Map<String, Map<String,String>> getNewCondition(String[] keys,String webDiag) {
+        Map<String, Map<String,String>> diseaseCondition = new LinkedHashMap<>();
+        List<String> newList = new ArrayList<>();
+        List<String> fildList = new ArrayList<>();
+        List<String> startList = new ArrayList<>();
+        //输出确诊集合
+        Set<String> quezhen = new LinkedHashSet<>();
+        for (String fild : keys) {
+            fildList.add("\"" + fild.trim() + "\"");
+        }
+        logger.info("根据 " + fildList + " 这些词推送图谱诊断!!!");
         Session session = null;
         StatementResult result = null;
         String query = "";
         try {
             session = driver.session(AccessMode.WRITE);
             logger.info("session 为: " + session);
-            query = propertiesUtil.getProperty("searchDifferentialDiagnose").replace("mainDis", mainDiag);
+            //第一步查询是否有组合的词
+            query = propertiesUtil.getProperty("searchNumColl").replace("startList", fildList.toString());
+            result = session.run(query);
+            while (result.hasNext()) {
+                Record next = result.next();
+                String v = next.get("v").toString();
+                startList.add(v);
+            }
+            newList.addAll(startList);
+            while (newList.size() > 0) {
+                query = propertiesUtil.getProperty("searchNewCondition").replace("newList", newList.toString()).replace("fildList", startList.toString());
+                result = session.run(query);
+                newList.clear();
+                while (result.hasNext()) {
+                    Record record = result.next();
+                    String condition = record.get("condition").toString();
+                    String jundgement = record.get("jundgement").toString();
+                    if ("TRUE".equals(jundgement)) {
+                        newList.add(condition);
+                        startList.add(condition);
+                    }
+                }
+            }
+            //第三步查找确诊
+            query = propertiesUtil.getProperty("searchDis").replace("startList", startList.toString());
             result = session.run(query);
             while (result.hasNext()) {
                 Record record = result.next();
-                List<Object> coll = record.get("coll").asList();
-                if(coll != null && coll.size()>0){
-                    for (Object o:coll) {
-                        differentialDiagnoseList.add(o.toString().replace("\"",""));
+                String quezhenName = record.get("name").toString().replace("\"", "");
+                String conditionType = record.get("relationType").toString().replace("\"", "");
+                if ("确诊".equals(conditionType)) {
+                    quezhen.add(quezhenName);
+                } else if ("拟诊".equals(conditionType)) {
+                    quezhen.add(quezhenName);
+                }
+            }
+            for (String qu : quezhen) {
+                Map<String, String> dis_res = new HashMap<>();
+                dis_res.put("确诊", "");
+//                diseaseCondition.put(qu, JSON.toJSONString(dis_res));
+                diseaseCondition.put(qu,dis_res);
+                logger.info("图谱推出的诊断为: " + qu);
+            }
+            Set<String> queSets = diseaseCondition.keySet();
+            if(webDiag != null && webDiag.trim() != ""){
+                String[] webDiagSplits = webDiag.split(",");
+                String mainDiag = webDiagSplits[0];
+                query = propertiesUtil.getProperty("searchDifferentialDiagnose").replace("mainDis", mainDiag);
+                result = session.run(query);
+                while (result.hasNext()) {
+                    Record record = result.next();
+                    List<Object> coll = record.get("coll").asList();
+                    if(coll != null && coll.size()>0){
+                        for (Object o:coll) {
+                            if(queSets.contains(o.toString().replace("\"",""))){
+                                Map<String, String> stringStringMap = diseaseCondition.get(o.toString().replace("\"", ""));
+                                stringStringMap.put("鉴别诊断","");
+                                diseaseCondition.put(o.toString().replace("\"",""),stringStringMap);
+                            }else {
+                                Map<String, String> diffMap = new HashMap<>();
+                                diffMap.put("鉴别诊断","");
+                                diseaseCondition.put(o.toString().replace("\"",""),diffMap);
+                            }
+                        }
                     }
                 }
             }
-        }catch (Exception e){
+        } catch (Exception e) {
             e.printStackTrace();
-        }finally {
+        } finally {
             CloseSession(session);
-            return differentialDiagnoseList;
+            return diseaseCondition;
         }
     }
     /**
@@ -942,73 +1008,6 @@ public class Neo4jAPI {
     }
 
 
-    /**
-     * 新的诊断逻辑
-     * 包含确诊和疑诊集合
-     *
-     * @param iputList
-     * @return
-     */
-    public Map<String, ArrayList> newConditionProcess(ArrayList<String> iputList) {
-        Map<String, ArrayList> conditionMap = new HashMap<>();
-        ArrayList<String> quezhenList = new ArrayList<>();
-        ArrayList<String> yizhenList = new ArrayList<>();
-        //处理原始输入
-        List<String> arrayList = inputProcess(iputList);
-        List<String> newList = new ArrayList<>();
-        newList.addAll(arrayList);
-        Session session = null;
-        StatementResult stat = null;
-        String query = "";
-        try {
-            session = driver.session(AccessMode.READ);
-            while (newList.size() > 0) {
-                //查找符合条件的判断节点
-                query = "with " + newList + " as data unwind data as row\n" +
-                        "match (l)-[r:诊断依据]->(m)\n" +
-                        "where row.label in labels(l) and l.name=row.name\n" +
-                        "with m," + arrayList + " as data unwind data as row\n" +
-                        "match (n)-[r:诊断依据]->(m)\n" +
-                        "where row.label in labels(n) and n.name=row.name\n" +
-                        "return m.name as condition, count(distinct r)>=m.path as jundgement, labels(m)[0] as label";
-                stat = session.run(query);
-                newList.clear();
-                while (stat.hasNext()) {
-                    Record record = stat.next();
-                    String condition = record.get("condition").toString();
-                    String jundgement = record.get("jundgement").toString();
-                    String label = record.get("label").toString();
-                    if ("TRUE".equals(jundgement)) {
-                        newList.add("{label:" + label + ",name:" + condition + "}");
-                        arrayList.add("{label:" + label + ",name:" + condition + "}");
-                    }
-                }
-            }
-            //计算确诊,可能诊断
-            query = "with " + arrayList + " as data unwind data as row\n" +
-                    "match (n)-[r:确诊|:可能诊断]->(m)\n" +
-                    "where row.label in labels(n) and n.name=row.name\n" +
-                    "with distinct m,r\n" +
-                    "return m.name as name, labels(m)[0] as label,type(r) as relationType";
-            stat = session.run(query);
-            while (stat.hasNext()) {
-                Record record = stat.next();
-                if ("\"确诊\"".equals(record.get("relationType").toString())) {
-                    quezhenList.add(record.get("name").toString().replaceAll("\"", ""));
-                } else if ("\"可能诊断\"".equals(record.get("relationType").toString())) {
-                    yizhenList.add(record.get("name").toString().replaceAll("\"", ""));
-                }
-            }
-            conditionMap.put("确诊", quezhenList);
-            conditionMap.put("可能诊断", yizhenList);
-        } catch (Exception e) {
-            e.printStackTrace();
-        } finally {
-            CloseSession(session);
-            return conditionMap;
-        }
-    }
-
     /**
      * 多疾病下治疗方案
      *
@@ -1240,14 +1239,7 @@ public class Neo4jAPI {
                     fildsList.add("\'" + diseaseList.get(j) + "\'");
                 }
             }
-         /*   //获取每个病的不良反应集合
-            List<String> ueList = disUE.get(diseaseList.get(i));
-            if(ueList !=null && ueList.size()>0){
-                for (String ue:ueList) {
-                    fildsList.add("\'"+ue+"\'");
-                }
-            }
-*/
+
             diseFilds.put(diseaseList.get(i), fildsList);
         }
         try {
@@ -1421,13 +1413,19 @@ public class Neo4jAPI {
                             logger.info(diseaseName + "下面有" + stringList + "不良反应");
                             if (stringList != null && stringList.size() > 0) {
                                 List<Indicators> indicatorsList1 = new ArrayList<>();
-                                Indicators indicators1 = getAdverse(ueSet, "低血糖反应");
-                                logger.info(disSet + "包含  低血糖反应");
-                                Indicators indicators2 = getAdverse(ueSet, "胃肠道不良反应");
-                                logger.info(disSet + "包含  胃肠道不良反应");
-                                indicatorsList1.add(indicators1);
-                                indicatorsList1.add(indicators2);
+                                for (String de:stringList) {
+                                    Indicators indicators1 = getAdverse(ueSet, de);
+                                    logger.info(disSet + "包含  "+de);
+                                    indicatorsList1.add(indicators1);
+                                }
                                 filnlly.setAdverseEvent(indicatorsList1);
+//                                Indicators indicators1 = getAdverse(ueSet, "低血糖反应");
+//                                logger.info(disSet + "包含  低血糖反应");
+//                                Indicators indicators2 = getAdverse(ueSet, "胃肠道不良反应");
+//                                logger.info(disSet + "包含  胃肠道不良反应");
+//                                indicatorsList1.add(indicators1);
+//                                indicatorsList1.add(indicators2);
+//                                filnlly.setAdverseEvent(indicatorsList1);
                             }
                         }
                         filnlly.setTreatment(drugsList);
@@ -1788,82 +1786,6 @@ public class Neo4jAPI {
         return indicators1;
     }
 
-    /**
-     * 倒推实现
-     *
-     * @param diseaseName
-     * @return
-     */
-    public Map<String, List> getPushBack(String diseaseName, int sign) {
-        //        Map<String, String> labelMap = new HashMap<>();
-        HashMap<String, List> backMap = new HashMap<>();
-        String[] label = { "Symptom", "Vital", "LIS", "PACS", "History" };
-        Session session = null;
-        StatementResult result = null;
-        String query = "";
-        try {
-            if (sign == 1) {
-                session = driver.session(AccessMode.WRITE);
-                for (String l : label) {
-                    query = "match (d1:Disease{name:'" + diseaseName + "'})-[r1]->(s1:" + l + ") return s1.name as symptom";
-                    result = session.run(query);
-                    while (result.hasNext()) {
-                        String symptom = result.next().get("symptom").toString().replaceAll("\"", "");
-                        if (backMap.containsKey(l)) {
-                            List symptomList = backMap.get(l);
-                            symptomList.add(symptom);
-                            backMap.put(l, symptomList);
-                        } else {
-                            List<String> sList = new ArrayList<>();
-                            sList.add(symptom);
-                            backMap.put(l, sList);
-                        }
-                    }
-                }
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        } finally {
-            CloseSession(session);
-        }
-
-        return backMap;
-    }
-
-    /**
-     * 高危逻辑
-     *
-     * @param diseaseName
-     * @return
-     */
-    public Map<String, String> getHighRisk(String diseaseName) {
-        String[] diseaseArray = diseaseName.split(",|,|、");
-        List<String> diseaseList = new ArrayList<>();
-        for (String di : diseaseArray) {
-            diseaseList.add("'" + di + "'");
-        }
-        Map<String, String> riskMap = new HashMap<>();
-        Session session = null;
-        StatementResult result = null;
-        String query = "match(d:Disease) where d.name in " + diseaseList + " return d.name as name, d.high_risk as risk";
-        try {
-            session = driver.session(AccessMode.WRITE);
-            result = session.run(query);
-            while (result.hasNext()) {
-                Record next = result.next();
-                String name = next.get("name").toString().replaceAll("\"", "");
-                String risk = next.get("risk").toString();
-                riskMap.put(name, risk);
-            }
-
-        } catch (Exception e) {
-            e.printStackTrace();
-
-        } finally {
-            CloseSession(session);
-            return riskMap;
-        }
-    }
 
     /**
      * 反推LIS,PACS
@@ -2142,36 +2064,6 @@ public class Neo4jAPI {
         }
     }
 
-    public List<String> getGrapWords(String[] keys) {
-        List<String> graphWordsList = new ArrayList<>();
-        ArrayList<String> fildList = new ArrayList<>();
-        //输出确诊集合
-        Set<String> quezhen = new HashSet<>();
-        for (String fild : keys) {
-            fildList.add("\"" + fild.trim() + "\"");
-        }
-        Session session = null;
-        StatementResult result = null;
-        String query = "";
-        try {
-            session = driver.session(AccessMode.WRITE);
-            //判断是否有近义词
-            query = "match(d) where d.name in " + fildList + " return distinct d.name as name";
-            result = session.run(query);
-            while (result.hasNext()) {
-                Record next = result.next();
-                String word = next.get("name").toString();
-                graphWordsList.add(word);
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        } finally {
-            CloseSession(session);
-        }
-        return graphWordsList;
-    }
-
-
     /**
      * 根据是否需要计算调取相应返回量表的方法
      *
@@ -2456,6 +2348,10 @@ public class Neo4jAPI {
                 if (!scaleStructure.containsKey("Calc")) {
                     scaleStructure.put("Calc", Integer.valueOf(calc));
                 }
+
+                if (group.contains("-")){
+                    group = group.split("-")[0];
+                }
                 if (group.contains("计算方法")) {
                     String[] range = mutex.split("~|-");
                     String min = range[0];

+ 21 - 0
graph/src/main/resources/bolt.properties

@@ -42,6 +42,27 @@ where n.name=row\n \
 with distinct m,r\n \
 return m.name as name, labels(m)[0] as label,type(r) as relationType
 
+#\u63A8\u9001\u786E\u8BCA,\u65B0\u7ED3\u6784,\u5305\u542B\u5173\u8054\u8BCD
+#\u67E5\u627E\u8FD9\u4E2A\u8BCD\u5C5E\u4E8E\u54EA\u4E2A\u5E8F\u53F7\u96C6\u5408
+searchNumColl=match(h)-[r:\u5C5E\u4E8E|:\u8BCA\u65AD\u4F9D\u636E]->(c:Condition)\n \
+where h.name in startList\n \
+with c.name as v,count(distinct r)>=c.path as hh\n \
+where hh =true\n \
+return v
+#\u67E5\u627E\u8BCA\u65AD\u4F9D\u636E
+searchNewCondition=with newList as data \n \
+ match (l)-[r:\u8BCA\u65AD\u4F9D\u636E]->(m:Condition)\n \
+where l.name in data \n \
+with m,fildList as data\n \
+match (n)-[r:\u8BCA\u65AD\u4F9D\u636E]->(m:Condition)\n \
+where n.name in data\n \
+return m.name as condition, count(distinct r)>=m.path as jundgement, labels(m)[0] as label\n";
+#\u67E5\u627E\u786E\u8BCA
+searchDis=match (n:Condition)-[r:\u786E\u8BCA|:\u62DF\u8BCA]->(m:Disease)\n \
+where n.name in startList\n \
+with distinct m,r\n \
+return m.name as name, labels(m)[0] as label,type(r) as relationType;
+
 #\u67E5\u627E\u9274\u522B\u8BCA\u65AD\u7684\u8BED\u53E5
 searchDifferentialDiagnose=match(d:Disease)-[r:\u9274\u522B\u8BCA\u65AD]->(h) where d.name='mainDis' return collect(h.name) as coll
 

+ 79 - 70
graphdb/src/main/java/org/diagbot/service/impl/KnowledgeServiceImpl.java

@@ -181,14 +181,17 @@ public class KnowledgeServiceImpl implements KnowledgeService {
 
     @Override
     public Map<String, Object> getHighRiskDisease(SearchData searchData) {
-        String[] splitsDiag = searchData.getDiag().split(",|,|、");
-        List<String> diseaseNameList = Arrays.asList(splitsDiag);
         Map<String, Object> map = new HashMap<>();
-        List<Map<String, Object>> list = baseNodeRepository.getHighRisk(diseaseNameList);
-        for (Map hrmap:list) {
-            String name = hrmap.get("name").toString();
-            String risk = hrmap.get("risk").toString();
-            map.put(name, risk);
+        String diag = searchData.getDiag();
+        if(diag != null && diag != ""){
+            String[] splitsDiag = searchData.getDiag().split(",|,|、");
+            List<String> diseaseNameList = Arrays.asList(splitsDiag);
+            List<Map<String, Object>> list = baseNodeRepository.getHighRisk(diseaseNameList);
+            for (Map hrmap:list) {
+                String name = hrmap.get("name").toString();
+                String risk = hrmap.get("risk").toString();
+                map.put(name, risk);
+            }
         }
         return map;
     }
@@ -307,74 +310,80 @@ public class KnowledgeServiceImpl implements KnowledgeService {
     public Map<String, List<FeatureRate>> getLisPacs(SearchData searchData) {
         Map<String, List<FeatureRate>> lisPacsFeature = new HashMap<>();
         String webDiag = searchData.getDiag();
-        List<String> webDiagList = Arrays.asList(webDiag.split(",|,|、"));
-        List<FeatureRate> bigdataDiagFeature = searchData.getPushDiags();
-        List<String> bigdataDiagList =new LinkedList<>();
-        if(bigdataDiagFeature.size()>0){
-            for (FeatureRate fe:bigdataDiagFeature) {
-                if("neo4j".equals(fe.getRate())){
-                    bigdataDiagList.add(fe.getFeatureName());
-                    logger.info("图谱推出的诊断为: "+fe.getFeatureName());
-                }else {
-                    bigdataDiagList.add(fe.getFeatureName());
-                    logger.info("大数据推出的诊断为: "+fe.getFeatureName());
+        List<String> webDiagList = null;
+        if(webDiag != null && webDiag !="") {
+            webDiagList = Arrays.asList(webDiag.split(",|,|、"));
+        }
+            List<FeatureRate> bigdataDiagFeature = searchData.getPushDiags();
+            List<String> bigdataDiagList =new LinkedList<>();
+            if(bigdataDiagFeature.size()>0){
+                for (FeatureRate fe:bigdataDiagFeature) {
+                    if("neo4j".equals(fe.getRate())){
+                        bigdataDiagList.add(fe.getFeatureName());
+                        logger.info("图谱推出的诊断为: "+fe.getFeatureName());
+                    }else {
+                        bigdataDiagList.add(fe.getFeatureName());
+                        logger.info("大数据推出的诊断为: "+fe.getFeatureName());
+                    }
                 }
             }
-        }
-        for (String web: webDiagList ) {
-            for (int i=0;i<bigdataDiagList.size();i++ ) {
-                if(bigdataDiagList.get(i).equals(web)){
-                    bigdataDiagList.remove(bigdataDiagList.get(i));
+            if(webDiagList != null){
+                for (String web: webDiagList ) {
+                    for (int i=0;i<bigdataDiagList.size();i++ ) {
+                        if(bigdataDiagList.get(i).equals(web)){
+                            bigdataDiagList.remove(bigdataDiagList.get(i));
+                        }
+                    }
                 }
             }
-        }
-        logger.info("界面诊断为: " + webDiagList);
-        Map<String, Set<String>> weblisPacs =null;
-        Map<String, Set<String>> biglisPacs =null;
-        if(webDiagList !=null && webDiagList.size()>0){
-            weblisPacs = processLisPacs(webDiagList);
-        }
-        if(bigdataDiagList !=null && bigdataDiagList.size()>0){
-            biglisPacs = processLisPacs(bigdataDiagList);
-        }
-        Set<String> lis =null;
-        Set<String> pacs =null;
-        //如果界面有诊断
-        if(weblisPacs !=null && weblisPacs.values().size()>0){
-            lis = weblisPacs.get("LIS");
-            pacs = weblisPacs.get("PACS");
-            logger.info("界面有诊断的情况下,界面诊断推出的lis为: "+lis);
-            logger.info("界面有诊断的情况下,界面诊断推出的pacs为: "+pacs);
-            if(biglisPacs !=null && biglisPacs.values().size()>0){
-                Set<String> bl = biglisPacs.get("LIS");
-                Set<String>  bp= biglisPacs.get("PACS");
-                logger.info("界面有诊断的情况下,推出诊断的lis为: "+bl);
-                logger.info("界面有诊断的情况下,推出诊断的pacs为: "+bp);
-                lis.addAll(bl);
-                pacs.addAll(bp);
+            logger.info("界面诊断为: " + webDiagList);
+            Map<String, Set<String>> weblisPacs =null;
+            Map<String, Set<String>> biglisPacs =null;
+            if(webDiagList !=null && webDiagList.size()>0){
+                weblisPacs = processLisPacs(webDiagList);
             }
-        }else {
-            lis = biglisPacs.get("LIS");
-            pacs = biglisPacs.get("PACS");
-            logger.info("界面无诊断的情况下,推出诊断的lis为: "+lis);
-            logger.info("界面无诊断的情况下,推出诊断的lis为: "+pacs);
-        }
-        logger.info("推出的合并lis为: " + lis);
-        logger.info("推出的合并pacs为: " + pacs);
-        ArrayList<FeatureRate> lisFeature = new ArrayList<>();
-        ArrayList<FeatureRate> pacsFeature = new ArrayList<>();
-        for (String l:lis) {
-            FeatureRate featureRate = new FeatureRate();
-            featureRate.setFeatureName(l);
-            lisFeature.add(featureRate);
-        }
-        for (String p:pacs) {
-            FeatureRate featureRate = new FeatureRate();
-            featureRate.setFeatureName(p);
-            pacsFeature.add(featureRate);
-        }
-        lisPacsFeature.put("lisList",lisFeature);
-        lisPacsFeature.put("pacsList",pacsFeature);
+            if(bigdataDiagList !=null && bigdataDiagList.size()>0){
+                biglisPacs = processLisPacs(bigdataDiagList);
+            }
+            Set<String> lis =null;
+            Set<String> pacs =null;
+            //如果界面有诊断
+            if(weblisPacs !=null && weblisPacs.values().size()>0){
+                lis = weblisPacs.get("LIS");
+                pacs = weblisPacs.get("PACS");
+                logger.info("界面有诊断的情况下,界面诊断推出的lis为: "+lis);
+                logger.info("界面有诊断的情况下,界面诊断推出的pacs为: "+pacs);
+                if(biglisPacs !=null && biglisPacs.values().size()>0){
+                    Set<String> bl = biglisPacs.get("LIS");
+                    Set<String>  bp= biglisPacs.get("PACS");
+                    logger.info("界面有诊断的情况下,推出诊断的lis为: "+bl);
+                    logger.info("界面有诊断的情况下,推出诊断的pacs为: "+bp);
+                    lis.addAll(bl);
+                    pacs.addAll(bp);
+                }
+            }else {
+                lis = biglisPacs.get("LIS");
+                pacs = biglisPacs.get("PACS");
+                logger.info("界面无诊断的情况下,推出诊断的lis为: "+lis);
+                logger.info("界面无诊断的情况下,推出诊断的lis为: "+pacs);
+            }
+            logger.info("推出的合并lis为: " + lis);
+            logger.info("推出的合并pacs为: " + pacs);
+            ArrayList<FeatureRate> lisFeature = new ArrayList<>();
+            ArrayList<FeatureRate> pacsFeature = new ArrayList<>();
+            for (String l:lis) {
+                FeatureRate featureRate = new FeatureRate();
+                featureRate.setFeatureName(l);
+                lisFeature.add(featureRate);
+            }
+            for (String p:pacs) {
+                FeatureRate featureRate = new FeatureRate();
+                featureRate.setFeatureName(p);
+                pacsFeature.add(featureRate);
+            }
+            lisPacsFeature.put("lisList",lisFeature);
+            lisPacsFeature.put("pacsList",pacsFeature);
+
         return lisPacsFeature;
     }