|
@@ -12,6 +12,7 @@ import org.neo4j.driver.v1.types.Path;
|
|
|
import org.neo4j.driver.v1.types.Relationship;
|
|
|
import java.io.FileWriter;
|
|
|
import java.io.IOException;
|
|
|
+import java.math.RoundingMode;
|
|
|
import java.sql.Array;
|
|
|
import java.sql.ResultSet;
|
|
|
import java.text.NumberFormat;
|
|
@@ -948,7 +949,156 @@ public class Neo4jAPI {
|
|
|
return resultMap;
|
|
|
}
|
|
|
}
|
|
|
+ /**
|
|
|
+ * 第二版治疗方案
|
|
|
+ * @param disease
|
|
|
+ * @param filds
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public Map<String, JSONObject> getMulDiseaseTreat_2(String disease,String filds){
|
|
|
+ Map<String, JSONObject> diagTreat = new HashMap<>();
|
|
|
+ JSONObject j1 = new JSONObject();
|
|
|
+ Session session = null;
|
|
|
+ NumberFormat nf = NumberFormat.getPercentInstance();
|
|
|
+ nf.setMinimumFractionDigits(0);//设置该百分比数字,保留2位小数;
|
|
|
+ nf.setRoundingMode(RoundingMode.HALF_UP); //设置满5向上进位,即四舍五入;
|
|
|
+ Map<String, String> resultMap = new HashMap<>();
|
|
|
+ String[] diseaseArray = disease.split(",|,|、");
|
|
|
+ List<String> diseaseList = new ArrayList<>();//诊断数组
|
|
|
+ for (int i = 0;i<diseaseArray.length;i++) {
|
|
|
+ diseaseList.add(diseaseArray[i]);
|
|
|
+ }
|
|
|
+ Map<String, ArrayList> diseFilds = new HashMap<>();
|
|
|
+ for(int i=0;i<diseaseList.size();i++) {
|
|
|
+ String[] fildsArray = filds.split(",");
|
|
|
+ ArrayList<String> fildsList = new ArrayList<>();//其他条件数组
|
|
|
+ for (String fild : fildsArray) {
|
|
|
+ fildsList.add("\'" + fild + "\'");
|
|
|
+ }
|
|
|
+ for (int j = 0; j < diseaseList.size(); j++) {
|
|
|
+ if (i != j) {
|
|
|
+ fildsList.add("\'" + diseaseList.get(j) + "\'");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ diseFilds.put(diseaseList.get(i), fildsList);
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ session = driver.session(AccessMode.WRITE);
|
|
|
+ Integer integer = session.writeTransaction(new TransactionWork<Integer>() {
|
|
|
+ @Override
|
|
|
+ public Integer execute(Transaction tx) {
|
|
|
+ StatementResult result = null;
|
|
|
+ String query="";
|
|
|
+ for (Map.Entry<String,ArrayList> df: diseFilds.entrySet()) {
|
|
|
+ String diseaseName = df.getKey();//疾病
|
|
|
+ ArrayList value = df.getValue();//其他条件
|
|
|
+ StringBuffer s1 = new StringBuffer();
|
|
|
+ s1.append("match (d:Disease{name:'"+diseaseName+"'})-[r0:推荐]->(m:Drugs)-[:包含]->(n:Medicine),(d)-[r1:推荐]->(n)");
|
|
|
+ s1.append("\n");
|
|
|
+ s1.append("where r0.p<6").append("\n");
|
|
|
+ s1.append("return m.name as 类, r0.p as sort, n.name as 药物, r1.rate as a order by sort , a desc");
|
|
|
+ query=s1.toString();
|
|
|
+ result=tx.run(query);
|
|
|
+ Map<String, LinkedHashMap<String,String>> contentMap = new LinkedHashMap<>();
|
|
|
+ while (result.hasNext()){
|
|
|
+ Record record = result.next();
|
|
|
+ List<Value> values = record.values();
|
|
|
+ String drugs = values.get(0).toString().replace("\"", "");
|
|
|
+ if(contentMap.containsKey(drugs)){
|
|
|
+ LinkedHashMap<String, String> stringStringHashMap = contentMap.get(drugs);
|
|
|
+ stringStringHashMap.put(values.get(2).toString().replace("\"",""),values.get(3).toString());
|
|
|
+ contentMap.put(drugs,stringStringHashMap);
|
|
|
+ }else {
|
|
|
+ LinkedHashMap<String, String> sa = new LinkedHashMap<>();
|
|
|
+ sa.put(values.get(2).toString().replace("\"",""),values.get(3).toString());
|
|
|
+ contentMap.put(drugs,sa);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //药类型的大小类拼接
|
|
|
+ Map<String, String> shortLargeMap = new HashMap<>();
|
|
|
+ query="match (n:Disease{name:'"+diseaseName+"'})-[:推荐]->(d:Drugs)<-[:包含]-(m) return d.name as short,m.name as large";
|
|
|
+ result=tx.run(query);
|
|
|
+ while (result.hasNext()){
|
|
|
+ Record record = result.next();
|
|
|
+ String aShort = record.get("short").toString().replace("\"","");
|
|
|
+ String large = record.get("large").toString().replace("\"","");
|
|
|
+ shortLargeMap.put(aShort,large+"("+aShort+")");
|
|
|
+ }
|
|
|
+ Map<String, LinkedHashMap<String, String>> shortLargeMapConcat = new LinkedHashMap<>();
|
|
|
+ for (Map.Entry<String, LinkedHashMap<String, String>> f:contentMap.entrySet()
|
|
|
+ ) {
|
|
|
+ String key = f.getKey();
|
|
|
+ if(shortLargeMap.get(key)!=null){
|
|
|
+ shortLargeMapConcat.put(shortLargeMap.get(key),contentMap.get(key));
|
|
|
+ }else {
|
|
|
+ shortLargeMapConcat.put(key,contentMap.get(key));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Map<String, String> medicationUseMap = new HashMap<>();//key:药名 value:禁忌(慎用)
|
|
|
+ StringBuffer fildBuffer = new StringBuffer();
|
|
|
+ fildBuffer.append("match (n:Disease{name:'" + diseaseName + "'})-[:推荐]->(d)<-[r0:慎用]-(m)").append("\n");
|
|
|
+ fildBuffer.append("where m.name in " + value + "").append("\n");
|
|
|
+ fildBuffer.append("return d.name as ff,type(r0) as hh").append("\n").append("union\n");
|
|
|
+ fildBuffer.append("match (n:Disease{name:'" + diseaseName + "'})-[:推荐]->(d)<-[r0:忌用]-(m)\n");
|
|
|
+ fildBuffer.append("where m.name in " + value + "").append("\n");
|
|
|
+ fildBuffer.append("return d.name as ff,type(r0) as hh");
|
|
|
+ query = fildBuffer.toString();
|
|
|
+ result = tx.run(query);
|
|
|
+ while (result.hasNext()) {
|
|
|
+ Record next = result.next();
|
|
|
+ String name = next.get("ff").toString().replace("\"", "");//药名
|
|
|
+ String type = next.get("hh").toString().replace("\"", "");//忌用(慎用)
|
|
|
+ medicationUseMap.put(name, type);
|
|
|
+ }
|
|
|
|
|
|
+ JSONObject j2 = new JSONObject();
|
|
|
+ List<JSONObject> drugsList = new ArrayList<>();
|
|
|
+ for (Map.Entry<String, LinkedHashMap<String, String>> w : shortLargeMapConcat.entrySet()) {
|
|
|
+ int i = 0;
|
|
|
+ JSONObject j4 = new JSONObject();
|
|
|
+ String drugs = w.getKey();//药类
|
|
|
+ List<JSONObject> meditionList = new ArrayList<>();
|
|
|
+ LinkedHashMap<String, String> meditionRate = w.getValue();
|
|
|
+ for (Map.Entry<String,String> g:meditionRate.entrySet()
|
|
|
+ ) {
|
|
|
+ JSONObject j5 = new JSONObject();
|
|
|
+ String meditionName = g.getKey().trim();//药名
|
|
|
+ String rate = nf.format(Double.parseDouble(g.getValue().trim()));//百分比
|
|
|
+ j5.put("medicitionName",meditionName);
|
|
|
+ j5.put("rate",rate);
|
|
|
+ if (i<3) {
|
|
|
+ j5.put("isShow",1);//展示
|
|
|
+ i++;
|
|
|
+ } else {
|
|
|
+ j5.put("isShow",0);//不展示
|
|
|
+ }
|
|
|
+ if ("忌用".equals(medicationUseMap.get(meditionName))) {
|
|
|
+ j5.put("forbidden",2);
|
|
|
+ } else if ("慎用".equals(medicationUseMap.get(meditionName))) {
|
|
|
+ j5.put("forbidden",1);
|
|
|
+ } else {
|
|
|
+ j5.put("forbidden",0);
|
|
|
+ }
|
|
|
+ meditionList.add(j5);
|
|
|
+ }
|
|
|
+ j4.put("drugsName",drugs);
|
|
|
+ j4.put("medicitionsList",meditionList);
|
|
|
+ drugsList.add(j4);
|
|
|
+ }
|
|
|
+ j2.put("treatment",drugsList);
|
|
|
+// j1.put(diseaseName,j2);
|
|
|
+ diagTreat.put(diseaseName,j2);
|
|
|
+ }
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }catch (Exception e){
|
|
|
+ e.printStackTrace();
|
|
|
+ }finally {
|
|
|
+ CloseSession(session);
|
|
|
+ return diagTreat;
|
|
|
+ }
|
|
|
+ }
|
|
|
/**
|
|
|
* 倒推实现
|
|
|
* @param diseaseName
|
|
@@ -1119,7 +1269,7 @@ public class Neo4jAPI {
|
|
|
// "when judgement2 = false or judgement1 = false then false\n" +
|
|
|
"else False end as judgement order by LIS_Result";
|
|
|
|
|
|
- System.out.println(query);
|
|
|
+// System.out.println(query);
|
|
|
|
|
|
StatementResult run = session.run(query);
|
|
|
while (run.hasNext()) {
|