瀏覽代碼

Merge branch 'master' of http://192.168.2.236:10080/louhr/push

bijl 6 年之前
父節點
當前提交
8bd89b3238
共有 31 個文件被更改,包括 1858 次插入320 次删除
  1. 1 2
      bigdata-web/src/main/java/org/diagbot/bigdata/common/ApplicationCacheUtil.java
  2. 14 3
      common-service/src/main/java/org/diagbot/common/work/SearchData.java
  3. 33 0
      graph-web/src/main/java/org/diagbot/graphWeb/controller/GraphController.java
  4. 12 2
      graph-web/src/main/java/org/diagbot/graphWeb/work/GraphCalculate.java
  5. 5 1
      graph/src/main/java/org/diagbot/graph/Diagnose/DiagnoseMain.java
  6. 19 9
      graph/src/main/java/org/diagbot/graph/Diagnose/DiagnoseProcess.java
  7. 32 5
      graph/src/main/java/org/diagbot/graph/encryptionNeo4j/ReadNeo4jData2Neo4j.java
  8. 227 22
      graph/src/main/java/org/diagbot/graph/jdbc/Neo4jAPI.java
  9. 24 0
      graph/src/main/java/org/diagbot/graph/jdbc/Test.java
  10. 47 9
      graph/src/main/java/org/diagbot/graph/util/NodeRelationUtil.java
  11. 4 17
      graph/src/main/resources/bolt.properties
  12. 5 1
      graph/src/main/resources/query.properties
  13. 62 0
      nlp-web/src/main/java/org/diagbot/nlp/controller/RelationExtractionController.java
  14. 74 0
      nlp-web/src/main/java/org/diagbot/nlp/dao/model/TaggingResult.java
  15. 0 28
      nlp/src/main/java/org/diagbot/nlp/relation/extract/PresentExtract.java
  16. 0 27
      nlp/src/main/java/org/diagbot/nlp/relation/module/Symptom.java
  17. 0 13
      nlp/src/main/resources/classify.dict
  18. 396 67
      nlp/src/main/resources/push-tc.dict
  19. 7 0
      nlp/src/main/resources/relation.dict
  20. 233 14
      nlp/src/main/resources/synonym.dict
  21. 418 92
      nlp/src/main/resources/tc.dict
  22. 6 6
      nlp/src/test/java/org/diagbot/nlp/test/EntityExtractTest.java
  23. 2 2
      push-web/src/main/java/org/diagbot/push/controller/AlgorithmController.java
  24. 12 0
      push-web/src/main/java/org/diagbot/push/controller/GraphController.java
  25. 5 0
      push-web/src/main/java/org/diagbot/push/controller/RelationController.java
  26. 2 0
      push-web/src/main/resources/static/index.html
  27. 2 0
      push-web/src/main/resources/static/pages/algorithm/list.html
  28. 2 0
      push-web/src/main/resources/static/pages/extract/feature.html
  29. 210 0
      push-web/src/main/resources/static/pages/label/list.html
  30. 2 0
      push-web/src/main/resources/static/pages/participle/sample.html
  31. 2 0
      push-web/src/main/resources/static/pages/relation/sample.html

+ 1 - 2
bigdata-web/src/main/java/org/diagbot/bigdata/common/ApplicationCacheUtil.java

@@ -69,9 +69,8 @@ public class ApplicationCacheUtil {
             String[] line_string;
             List<ResultMappingFilter> resultMappingFilters = new ArrayList<>();
             try {
-                EncrypDES encrypDES = new EncrypDES();
                 for (int i = 0; i < fileContents.size(); i++) {
-                    line_string = org.apache.commons.lang3.StringUtils.split(new String(encrypDES.decryptor(fileContents.get(i))), "\\|");
+                    line_string = org.apache.commons.lang3.StringUtils.split(fileContents.get(i), "\\|");
                     if (line_string.length == 5) {
                         ResultMappingFilter resultMappingFilter = new ResultMappingFilter();
                         resultMappingFilter.setFeatureName(line_string[0]);

+ 14 - 3
common-service/src/main/java/org/diagbot/common/work/SearchData.java

@@ -32,7 +32,10 @@ public class SearchData {
     protected String past = "";
     protected String other = "";
     //大数据推送诊断结果信息
-    protected List<String> pushDiags = new ArrayList<>();
+    protected List<FeatureRate> pushDiags = new ArrayList<>();
+
+    //量表
+    protected String scaleName = "";
 
     //模型
     protected String algorithmClassifyValue;
@@ -199,6 +202,14 @@ public class SearchData {
         this.other = other;
     }
 
+    public String getScaleName() {
+        return scaleName;
+    }
+
+    public void setScaleName(String scaleName) {
+        this.scaleName = scaleName;
+    }
+
     public String getAlgorithmClassifyValue() {
         return algorithmClassifyValue;
     }
@@ -215,11 +226,11 @@ public class SearchData {
         this.filters = filters;
     }
 
-    public List<String> getPushDiags() {
+    public List<FeatureRate> getPushDiags() {
         return pushDiags;
     }
 
-    public void setPushDiags(List<String> pushDiags) {
+    public void setPushDiags(List<FeatureRate> pushDiags) {
         this.pushDiags = pushDiags;
     }
 }

+ 33 - 0
graph-web/src/main/java/org/diagbot/graphWeb/controller/GraphController.java

@@ -2,6 +2,8 @@ package org.diagbot.graphWeb.controller;
 
 import com.alibaba.fastjson.JSONObject;
 import org.diagbot.graph.javabean.GdbResponse;
+import org.diagbot.graph.jdbc.DriverManager;
+import org.diagbot.graph.jdbc.Neo4jAPI;
 import org.diagbot.graphWeb.dao.BackResponse;
 import org.diagbot.graphWeb.work.GraphCalculate;
 import org.diagbot.graphWeb.work.HighRiskCalculate;
@@ -15,10 +17,41 @@ import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.ResponseBody;
 
 import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+import static org.diagbot.graph.jdbc.DriverManager.propertiesUtil;
 
 @Controller
 @RequestMapping("/graph")
 public class GraphController {
+    @RequestMapping(value = "/push", method = RequestMethod.POST)
+    @ResponseBody
+    public Response<ResponseData> bayesPageData(HttpServletRequest request, @RequestBody SearchData searchData) throws Exception {
+        Response<ResponseData> response = new Response();
+        GraphCalculate graphCalculate = new GraphCalculate();
+        ResponseData responseData = graphCalculate.calculate(request, searchData);
+        response.setData(responseData);
+        return response;
+    }
+
+    @RequestMapping(value = "/highRisk", method = RequestMethod.POST)
+    @ResponseBody
+    public Response<GdbResponse> getHighRisk(HttpServletRequest request, @RequestBody SearchData searchData) throws Exception {
+        HighRiskCalculate highRiskCalculate = new HighRiskCalculate();
+        Response<GdbResponse> gdbResponseResponse = highRiskCalculate.calculateHighRisk(request, searchData);
+        return gdbResponseResponse;
+    }
+
+    @RequestMapping(value = "/lisPacs", method = RequestMethod.POST)
+    @ResponseBody
+    public Response<ResponseData> lisPacsData(HttpServletRequest request, @RequestBody SearchData searchData) throws Exception {
+        Response<ResponseData> response = new Response();
+        GraphCalculate graphCalculate = new GraphCalculate();
+        ResponseData responseData = graphCalculate.getLisPacs(request, searchData);
+        response.setData(responseData);
+        return response;
+    }
+
 
 }
 

+ 12 - 2
graph-web/src/main/java/org/diagbot/graphWeb/work/GraphCalculate.java

@@ -58,7 +58,7 @@ public class GraphCalculate {
             featureRate.setFeatureName(d.getKey());
             featureRate.setExtraProperty("");
             featureRate.setDesc(d.getValue());
-            featureRate.setRate("");
+            featureRate.setRate("neo4j");
             featureRates.add(featureRate);
         }
 
@@ -89,7 +89,17 @@ public class GraphCalculate {
         Neo4jAPI neo4jAPI = new Neo4jAPI(DriverManager.newDrive());
         String webDiag = searchData.getDiag();
         List<String> webDiagList = Arrays.asList(webDiag.split(",|,|、"));
-        List<String> bigdataDiagList = searchData.getPushDiags();
+        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());
+                }else {
+                    bigdataDiagList.add(fe.getFeatureName());
+                }
+            }
+        }
         for (String web: webDiagList ) {
                 for (int i=0;i<bigdataDiagList.size();i++ ) {
                     if(bigdataDiagList.get(i).equals(web)){

+ 5 - 1
graph/src/main/java/org/diagbot/graph/Diagnose/DiagnoseMain.java

@@ -16,8 +16,12 @@ public class DiagnoseMain {
 //                "侵袭性骨破坏","右上腹痛","向右背部放射","墨菲斯征阳性","白细胞增多","不洁饮食","胆囊内有强回声团");
 //        Map<String, String> diagnose = new DiagnoseProcess().getDiagnose(
 //                "上腹痛","墨菲斯征阳性","白细胞增多","不洁饮食","胆囊内有强回声团");
+//        Map<String, String> diagnose = new DiagnoseProcess().getDiagnose(
+//                "咽痛","鼻塞","乏力","淋巴结肿大","扁桃体肿大","上腹痛","墨菲斯征阳性","白细胞增多","不洁饮食","胆囊内有强回声团","近端指间关节炎","足关节炎","对称性关节肿胀",
+//                "晨僵≥30分钟","类风湿因子阳性","抗CCP抗体阳性","胸腔积液","呼吸音减弱","发热","胸痛","呼吸困难","咳嗽");
         Map<String, String> diagnose = new DiagnoseProcess().getDiagnose(
-                "咽痛","鼻塞","乏力","淋巴结肿大","扁桃体肿大","上腹痛","墨菲斯征阳性","白细胞增多","不洁饮食","胆囊内有强回声团","近端指间关节炎","足关节炎","对称性关节肿胀","晨僵≥30分钟","类风湿因子阳性","抗CCP抗体阳性");
+                "咽痛","鼻塞","乏力","淋巴结肿大","扁桃体肿大","上腹痛","墨菲斯征阳性","白细胞增多","不洁饮食","胆囊内有强回声团","近端指间关节炎","足关节炎","对称性关节肿胀",
+                "晨僵≥30分钟","类风湿因子阳性","抗CCP抗体阳性","胸腔积液","呼吸音减弱","发热","咳嗽");
         for (Map.Entry<String,String> disease:diagnose.entrySet()) {
             System.out.println(disease.getKey()+"\t"+disease.getValue());
         }

+ 19 - 9
graph/src/main/java/org/diagbot/graph/Diagnose/DiagnoseProcess.java

@@ -21,18 +21,28 @@ public class DiagnoseProcess {
         //获取driver和session
         Driver driver = DriverManager.newDrive("192.168.2.232","neo4j","root");
         Session session = driver.session(AccessMode.READ);
-        //第一步查找近义词.化验或辅检项目
-        String searchJinyici = propertiesUtil.getProperty("searchJinyici");
-        String fildList = searchJinyici.replace("fildList", startList.toString());
-        query = fildList;
+        //第一步查找近义词
+//        String searchJinyici = propertiesUtil.getProperty("searchJinyici");
+//        String fildList = searchJinyici.replace("fildList", startList.toString());
+        query = propertiesUtil.getProperty("serchCollect").replace("fildList",startList.toString());;
 //        System.out.println("查找近义词语句:"+query+"\n");
         run = session.run(query);
         while (run.hasNext()){
-            Record next = run.next();
-            String c = next.get("zi").toString();
-            String d = next.get("fu").toString();
-            startList.remove(c);
-            startList.add(d);
+            Record record = run.next();
+            String fild = record.get("fild").toString();
+            List<Object> typeCollect = record.get("typeCollect").asList();
+            //如果不包含诊断依据就找它的同义词,否则就要这个词
+            if("近义词".equals(typeCollect.get(0)) && typeCollect.size() ==1){
+                query = "match(l)-[r:近义词]->(h) where l.name="+fild+" return h.name as js";
+                StatementResult jinyiResult = session.run(query);
+                while (jinyiResult.hasNext()){
+                    Record next = jinyiResult.next();
+                    String js = next.get("js").toString();
+                    startList.remove(fild);
+                    startList.add(js);
+                }
+
+            }
         }
         newList.addAll(startList);
         int i =0;

+ 32 - 5
graph/src/main/java/org/diagbot/graph/encryptionNeo4j/ReadNeo4jData2Neo4j.java

@@ -17,6 +17,7 @@ public class ReadNeo4jData2Neo4j{
     public static PropertiesUtil propertiesUtil = new PropertiesUtil("query.properties");
     public static void main(String[] args) {
         String[] diseaseArray ={"慢性胃炎","急性胰腺炎","心脏病","肺部感染"};
+//        String[] diseaseArray ={"肺部感染"};
         NodeRelationUtil nodeRelationUtil = new NodeRelationUtil();
         Driver driver233 = nodeRelationUtil.getDriver();//读
         Driver driver232 = nodeRelationUtil.get232Driver();//写
@@ -45,7 +46,6 @@ public class ReadNeo4jData2Neo4j{
         List<String> diseaseNameList;
         String queryWord;
         StatementResult resultSet;
-
         diseaseNameList = new ArrayList<String>(Arrays.asList(diseaseArray));
         for (String diseaseName:diseaseNameList) {
             nodeRelationUtil.AddNode(driver,0,"Disease",diseaseName.replace("\"",""));//添加疾病
@@ -53,15 +53,42 @@ public class ReadNeo4jData2Neo4j{
             resultSet = session.run(queryWord);
             while (resultSet.hasNext()){
                 Record record = resultSet.next();
-                String drug = record.get("drug").toString();//药类
-                String label = record.get("label").toString();//类型
-                int p = Integer.parseInt(record.get("p").toString());//药类的排序
+                String drug = record.get("drug").toString().replace("\"","");//药类
+                String label = record.get("label").toString().replace("\"","");//类型
                 int p1 = record.get("p").asInt();
                 List<Object> collectName = record.get("collectName").asList();
-                System.out.println(drug+"\t"+label+"\t"+p+"\t"+collectName);
+                String s = collectName.get(0).toString();
+                nodeRelationUtil.AddNode(driver,0,"Drugs",drug);
+                nodeRelationUtil.addRelationWithProperty(driver,"Disease",diseaseName.replace("\"",""),"推荐",p1,"Drugs",drug);
+                for (Object o:collectName) {
+                    String medicationName = o.toString();
+                    nodeRelationUtil.AddNode(driver,0,"Medicine",medicationName);
+                    nodeRelationUtil.addRelation(driver,0,"Drugs",drug,"包含","Medicine",medicationName);
+                }
+            }
+            queryWord = propertiesUtil.getProperty("diseaseMedication").replace("diseaseName",diseaseName);
+            resultSet = session.run(queryWord);
+            while (resultSet.hasNext()){
+                Record record = resultSet.next();
+                double p1 = record.get("p").asDouble();
+                String medication = record.get("collectName").toString().replace("\"","");//类型
+                nodeRelationUtil.AddNode(driver,0,"Medicine",medication);
+                nodeRelationUtil.addRelationWithPropertyDouble(driver,"Disease",diseaseName.replace("\"",""),"推荐",p1,"Medicine",medication);
+            }
+            queryWord = propertiesUtil.getProperty("bigDrugAndSubDrugs").replace("diseaseName",diseaseName);
+            resultSet = session.run(queryWord);
+            while (resultSet.hasNext()){
+                Record record = resultSet.next();
+                String bigDrugs = record.get("big").toString().replace("\"","");//大类型
+                String subDrugs = record.get("sub").toString().replace("\"","");//小类型
+                nodeRelationUtil.AddNode(driver,0,"Drugs",bigDrugs);
+                nodeRelationUtil.AddNode(driver,0,"Drugs",subDrugs);
+                nodeRelationUtil.addRelation(driver,0,"Drugs",bigDrugs,"包含","Drugs",subDrugs);
+                nodeRelationUtil.addRelation(driver,0,"Disease",diseaseName.replace("\"",""),"推荐","Drugs",bigDrugs);
             }
         }
     }
+
     private static void from233to232(String[] diseaseArray,NodeRelationUtil nodeRelationUtil, Driver driver232, Session session) {
         List<String> diseaseList;
         String query;

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

@@ -63,7 +63,7 @@ public class Neo4jAPI {
 
             while (Rset.hasNext()) {
                 rec = Rset.next();
-//                System.out.println(rec);
+                //                System.out.println(rec);
                 String lbl = rec.get(key).toString();
                 jobj.put(lbl.substring(1, lbl.length() - 1), rec.get(val).toString());
             }
@@ -256,7 +256,7 @@ public class Neo4jAPI {
                     coll.put(name, (Object) jobj);
                 }
 
-//                System.out.println(name + "\t" + lbl + "\t" + JSONUtils.toJSONString(Result));
+                //                System.out.println(name + "\t" + lbl + "\t" + JSONUtils.toJSONString(Result));
             }
 
             for (String key : coll.keySet()) {
@@ -406,7 +406,7 @@ public class Neo4jAPI {
 
             resmap.put(name, content);
             res = JSONUtils.toJSONString(resmap);
-//            System.out.println(res);
+            //            System.out.println(res);
         } catch (Exception ex) {
             ex.printStackTrace();
         } finally {
@@ -434,7 +434,7 @@ public class Neo4jAPI {
             switch (option) {
                 case "-1":
                     RemovePath(start, end, oldrel);
-//                    Res = GetPath(name, label, "1");
+                    //                    Res = GetPath(name, label, "1");
                     break;
                 case "0":
                     Res = GetPath(name, label, level);
@@ -653,7 +653,26 @@ public class Neo4jAPI {
         String query = "";
         try {
             session = driver.session(AccessMode.WRITE);
-            //判断是否有近义词
+            query = propertiesUtil.getProperty("serchCollect").replace("fildList",fildList.toString());
+            result = session.run(query);
+            while (result.hasNext()){
+                Record record = result.next();
+                String fild = record.get("fild").toString();
+                List<Object> typeCollect = record.get("typeCollect").asList();
+                //如果不包含诊断依据就找它的同义词,否则就要这个词
+                if("近义词".equals(typeCollect.get(0)) && typeCollect.size() ==1){
+                    query = "match(l)-[r:近义词]->(h) where l.name="+fild+" return h.name as js";
+                    StatementResult jinyiResult = session.run(query);
+                    while (jinyiResult.hasNext()){
+                        Record next = jinyiResult.next();
+                        String js = next.get("js").toString();
+                        fildList.remove(fild);
+                        fildList.add(js);
+                    }
+
+                }
+            }
+/*            //判断是否有近义词
             query = "match (l)-[r:近义词]->(m)\n" +
                     "where l.name in  " + fildList + "\n" +
                     "return l.name as zi,type(r),m.name as fu";
@@ -664,7 +683,8 @@ public class Neo4jAPI {
                 String d = record.get("fu").toString();
                 fildList.remove(c);
                 fildList.add(d);
-            }
+            }*/
+//            System.out.println("参与计算的词:"+fildList);
             newList.addAll(fildList);
             int i = 0;
             while (newList.size() > 0) {
@@ -676,6 +696,8 @@ public class Neo4jAPI {
                         "match (n)-[r:诊断依据]->(m)\n" +
                         "where n.name= row\n" +
                         "return m.name as condition, count(distinct r)>=m.path as jundgement, labels(m)[0] as label";
+//                System.out.println("第"+i+"次查询:");
+//                System.out.println(query);
                 result = session.run(query);
                 newList.clear();
                 while (result.hasNext()) {
@@ -695,7 +717,6 @@ public class Neo4jAPI {
                     "where n.name=row\n" +
                     "with distinct m,r\n" +
                     "return m.name as name, labels(m)[0] as label,type(r) as relationType";
-
             result = session.run(query);
             while (result.hasNext()) {
                 Record record = result.next();
@@ -898,7 +919,7 @@ public class Neo4jAPI {
                         for (Map.Entry<String, LinkedHashMap<String, String>> w : mapSortValueDa.entrySet()) {
                             int i = 0;
                             Drugs drugs1 = new Drugs();
-//                                drugs1.setDrugsName(w.getKey().trim());//药类
+                            //                                drugs1.setDrugsName(w.getKey().trim());//药类
                             LinkedList<Medicition> medicitions = new LinkedList<>();
                             LinkedHashMap<String, String> value2 = w.getValue();
                             for (Map.Entry<String, String> d : value2.entrySet()) {
@@ -953,7 +974,7 @@ public class Neo4jAPI {
         nf.setMinimumFractionDigits(0);//设置该百分比数字,保留2位小数;
         nf.setRoundingMode(RoundingMode.HALF_UP); //设置满5向上进位,即四舍五入;
         Map<String, String> resultMap = new HashMap<>();
-        String[] diseaseArray = disease.split(",|,|、");
+        String[] diseaseArray = disease.split(",|,|、|;|:|;");
         List<String> diseaseList = new ArrayList<>();//诊断数组
         for (int i = 0; i < diseaseArray.length; i++) {
             diseaseList.add(diseaseArray[i]);
@@ -1006,7 +1027,7 @@ public class Neo4jAPI {
                         }
                         //药类型的大小类拼接
                         Map<String, String> shortLargeMap = new HashMap<>();
-//                        query="match (n:Disease{name:'"+diseaseName+"'})-[:推荐]->(d:Drugs)<-[:包含]-(m) return d.name as short,m.name as large";
+                        //                        query="match (n:Disease{name:'"+diseaseName+"'})-[:推荐]->(d:Drugs)<-[:包含]-(m) return d.name as short,m.name as large";
                         query = "match (n:Disease{name:'" + diseaseName + "'})-[r0:推荐]->(m:Drugs)-[:包含]->(k:Drugs) return k.name as short,m.name as large";
                         result = tx.run(query);
                         while (result.hasNext()) {
@@ -1045,11 +1066,11 @@ public class Neo4jAPI {
                          * 查找药类的忌用
                          */
                         Map<String, String> drugsUseMap = new HashMap<>();//key:药名 value:禁忌(慎用)
-                        query = "match (n:Disease{name:'急性胰腺炎'})-[:推荐]->(d:Drugs)<-[r0:慎用]-(m)\n" +
+                        query = "match (n:Disease{name:'"+diseaseName+"'})-[:推荐]->(d:Drugs)<-[r0:慎用]-(m)\n" +
                                 "where m.name in " + value + "" +
                                 "return d.name as ff,type(r0) as hh\n" +
                                 "union\n" +
-                                "match (n:Disease{name:'急性胰腺炎'})-[:推荐]->(d:Drugs)<-[r0:忌用]-(m)\n" +
+                                "match (n:Disease{name:'"+diseaseName+"'})-[:推荐]->(d:Drugs)<-[r0:忌用]-(m)\n" +
                                 "where m.name in " + value + "" +
                                 "return d.name as ff,type(r0) as hh";
                         result = tx.run(query);
@@ -1066,7 +1087,7 @@ public class Neo4jAPI {
                             int i = 0;
                             Drugs drugs = new Drugs();
                             String drugsName = w.getKey();//药类
-//                            Map<String, String> bigSubDrugs = new DrugsPattern().bigSubDrugs(drugsName);
+                            //                            Map<String, String> bigSubDrugs = new DrugsPattern().bigSubDrugs(drugsName);
                             Map<String, String> bigSubDrugs = drugsPattern.bigSubDrugs(drugsName);
                             drugs.setBigdrugsName(bigSubDrugs.get("big"));
                             drugs.setSubdrugsName(bigSubDrugs.get("sub"));
@@ -1207,9 +1228,9 @@ public class Neo4jAPI {
      * @return
      */
     public Map<String, List> getPushBack(String diseaseName, int sign) {
-//        Map<String, String> labelMap = new HashMap<>();
+        //        Map<String, String> labelMap = new HashMap<>();
         HashMap<String, List> backMap = new HashMap<>();
-        String[] label = {"Symptom", "Vital", "LIS", "PACS", "History"};
+        String[] label = { "Symptom", "Vital", "LIS", "PACS", "History" };
         Session session = null;
         StatementResult result = null;
         String query = "";
@@ -1418,7 +1439,7 @@ public class Neo4jAPI {
                         "when m.判断1= \"大于等于\" and m.单位=row.units then row.value >= m.判断系数1\n" +
                         "when m.判断1= \"小于\" and m.单位=row.units then row.value < m.判断系数1\n" +
                         "when m.判断1= \"小于等于\" and m.单位=row.units then row.value <= m.判断系数1\n" +
-//                        "when m.单位<>row.unit and m.单位 is not null then '单位不同'\n" +
+                        //                        "when m.单位<>row.unit and m.单位 is not null then '单位不同'\n" +
                         "else 'Unknown'\n" +
                         "end as judgement1,\n" +
                         "case\n" +
@@ -1434,7 +1455,7 @@ public class Neo4jAPI {
                         "when m.判断2 = \"大于等于\" and m.单位=row.units then row.value >= m.判断系数2\n" +
                         "when m.判断2 = \"小于\" and m.单位=row.units then row.value < m.判断系数2\n" +
                         "when m.判断2 = \"小于等于\" and m.单位=row.units then row.value <= m.判断系数2\n" +
-//                        "when m.单位<>row.unit and m.单位 is not null then '单位不同'\n" +
+                        //                        "when m.单位<>row.unit and m.单位 is not null then '单位不同'\n" +
                         "else 'Unknown'\n" +
                         "end as judgement2\n" +
                         "return m.name as LIS_Result,\n" +
@@ -1442,13 +1463,13 @@ public class Neo4jAPI {
                         "when judgement1 = True and judgement2 = True then True\n" +
                         "when judgement1 = True and judgement2 = '未定义' then True\n" +
                         "when judgement2 = True and judgement1 = '未定义' then True\n" +
-//                        "when judgement2 = '单位不同' or judgement1 = '单位不同' then 'Unknown'\n" +
-//                        "when judgement2 = '未定义' and judgement1 = '未定义' then 'Unknown'\n" +
-//                        "when judgement2 is null or judgement1 is null then 'Unknown'\n" +
-//                        "when judgement2 = false or judgement1 = false then false\n" +
+                        //                        "when judgement2 = '单位不同' or judgement1 = '单位不同' then 'Unknown'\n" +
+                        //                        "when judgement2 = '未定义' and judgement1 = '未定义' then 'Unknown'\n" +
+                        //                        "when judgement2 is null or judgement1 is null then 'Unknown'\n" +
+                        //                        "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()) {
@@ -1588,4 +1609,188 @@ public class Neo4jAPI {
         }
         return graphWordsList;
     }
+
+    /**
+     * 根据是否需要计算调取相应返回量表的方法
+     *
+     * @param scaleName
+     * @return
+     */
+    public Map<String, Object> getScale(String scaleName) {
+        Session session = driver.session(AccessMode.READ);
+        StatementResult Rset;
+        scaleName = scaleName.toUpperCase();
+        Map<String, Object> scale = new LinkedHashMap<>();
+
+        try {
+            String query = "match (m:Scale) WHERE m.name=~'.*" + scaleName + ".*' return m.type";
+            Rset = session.run(query);
+            String type = Rset.next().get("m.type").toString().replace("\"", "");
+            if ("NoCalc".equals(type)) {
+                scale = this.getScaleNoCalc(scaleName);
+            } else {
+                scale = this.getScaleCalc(scaleName);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            System.out.println("调量表方法时出了问题!");
+        } finally {
+            CloseSession(session);
+            return scale;
+        }
+
+    }
+
+    /**
+     * 返回带得分需要计算的量表
+     *
+     * @param scaleName
+     * @return
+     */
+    public Map<String, Object> getScaleCalc(String scaleName) {
+        Session session = driver.session(AccessMode.READ);
+        StatementResult Rset1 = null;
+        StatementResult Rset2 = null;
+        Record rec;
+        scaleName = scaleName.toUpperCase();
+
+        //<年龄,<<=44,0>>   最外层
+        Map<String, Object> twoLevelItems = new LinkedHashMap<>();
+        //第二层
+        Map<String, Object> threeLevelItems = new LinkedHashMap<>();
+        //<<=44,0>
+        Map<Object, Object> itemOrIndex = new LinkedHashMap<>();
+
+        try {
+            String query1 = "match (m:Scale)-[r1]->(n1)-[r2]->(n2) WHERE m.name=~'.*" + scaleName + ".*' return n1.name,r1.score,n2.name," +
+                    "r2.score,n2.type,r2.p order by toInt(r2.p),n2.type";
+
+            String query2 = "match (m:Scale)-[r1]->(n1)-[r2]->(n2)-[r3]->(n3) WHERE m.name=~'.*" + scaleName + ".*' return n1.name,r1.score,n2.name," +
+                    "r2.score,n3.name,r3.score,r3.p,n3.type order by toInt(r2.p),n2.type";
+            writeLog(query1);
+            Rset1 = session.run(query1);
+            Rset2 = session.run(query2);
+            writeLog(query2);
+
+            String item = "";
+            String optionOrIndex = "";
+            String score1 = "";
+            String index = "";
+            String score2 = "";
+
+            while (Rset1.hasNext()) {
+                rec = Rset1.next();
+                item = rec.get("n1.name").toString().replace("\"", "");
+                optionOrIndex = rec.get("n2.name").toString().replace("\"", "");
+                score1 = rec.get("r2.score").toString().replace("\"", "");
+                if (!"NULL".equals(score1)) {
+                    if (!threeLevelItems.containsKey(item)) {
+                        itemOrIndex = new LinkedHashMap<>();
+                    }
+                    itemOrIndex.put(optionOrIndex, score1);
+                    threeLevelItems.put(item, itemOrIndex);
+                }
+            }
+            while (Rset2.hasNext()) {
+                rec = Rset2.next();
+                item = rec.get("n1.name").toString().replace("\"", "");
+                optionOrIndex = rec.get("n2.name").toString().replace("\"", "");
+                index = rec.get("n3.name").toString().replace("\"", "");
+                score2 = rec.get("r3.score").toString().replace("\"", "");
+
+                if (!threeLevelItems.containsKey(item)) {
+                    itemOrIndex = new LinkedHashMap<>();
+                    twoLevelItems = new LinkedHashMap<>();
+                }
+                if (!twoLevelItems.containsKey(optionOrIndex)) {
+                    itemOrIndex = new LinkedHashMap<>();
+                }
+                itemOrIndex.put(index, score2);
+                twoLevelItems.put(optionOrIndex, itemOrIndex);
+                threeLevelItems.put(item, twoLevelItems);
+            }
+        } catch (Exception ex) {
+            ex.printStackTrace();
+            System.out.println("返回带得分需要计算的量表时出了问题!---->getScaleCalc");
+        } finally {
+            CloseSession(session);
+            return threeLevelItems;
+        }
+    }
+
+    /**
+     * 返回不带得分不需要计算的量表
+     *
+     * @param scaleName
+     * @return
+     */
+    public Map<String, Object> getScaleNoCalc(String scaleName) {
+        Session session = driver.session(AccessMode.READ);
+        StatementResult Rset1 = null;
+        StatementResult Rset2 = null;
+        Record rec;
+        scaleName = scaleName.toUpperCase();
+
+        Map<String, Object> fourLevelItems = new LinkedHashMap<>();
+        Map<String, Object> threeLevelItems = new LinkedHashMap<>();
+        Map<String, Object> twoLevelItems = new LinkedHashMap<>();
+        Map<Object, Object> firstLevelItems = new LinkedHashMap<>();
+
+        try {
+            String query1 = "match (m:Scale)-[r1]->(n1) where m.name=~'.*" + scaleName + ".*' " +
+                    "return m.name,r1.grade,n1.name order by r1.grade,toInt(r1.p)";
+
+            String query2 = "match (m:Scale)-[r1]->(n1)-[r2]->(n2) where m.name=~'.*" + scaleName + ".*' " +
+                    "return m.name,r1.grade,n1.name,r2.stage,n2.name order by r1.grade,r2.stage,toInt(r1.p)";
+            writeLog(query1);
+            Rset1 = session.run(query1);
+            Rset2 = session.run(query2);
+            writeLog(query2);
+
+            String scale = "";
+            String grade = "";
+            String gradeName = "";
+            String stage = "";
+            String stageName = "";
+
+            while (Rset1.hasNext()) {
+                rec = Rset1.next();
+                scale = rec.get("m.name").toString().replace("\"", "");
+                grade = rec.get("r1.grade").toString().replace("\"", "");
+                gradeName = rec.get("n1.name").toString().replace("\"", "");
+
+                firstLevelItems.put(gradeName, grade);
+                fourLevelItems.put(scale, firstLevelItems);
+
+            }
+
+            while (Rset2.hasNext()) {
+                rec = Rset2.next();
+                scale = rec.get("m.name").toString().replace("\"", "");
+                grade = rec.get("r1.grade").toString().replace("\"", "");
+                gradeName = rec.get("n1.name").toString().replace("\"", "");
+                stage = rec.get("r2.stage").toString().replace("\"", "");
+                stageName = rec.get("n2.name").toString().replace("\"", "");
+
+                if (!threeLevelItems.containsKey(gradeName)) {
+                    firstLevelItems = new LinkedHashMap<>();
+                    twoLevelItems = new LinkedHashMap<>();
+                }
+                if (!twoLevelItems.containsKey(grade)) {
+                    firstLevelItems = new LinkedHashMap<>();
+                }
+                firstLevelItems.put(stageName, stage);
+                twoLevelItems.put(grade, firstLevelItems);
+                threeLevelItems.put(gradeName, twoLevelItems);
+                fourLevelItems.put(scale, threeLevelItems);
+            }
+        } catch (Exception ex) {
+            ex.printStackTrace();
+            System.out.println("返回不带得分不需要计算的量表出了问题!---->getScaleNoCalc");
+        } finally {
+            CloseSession(session);
+            return fourLevelItems;
+        }
+    }
+
 }

+ 24 - 0
graph/src/main/java/org/diagbot/graph/jdbc/Test.java

@@ -0,0 +1,24 @@
+package org.diagbot.graph.jdbc;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @Description:
+ * @Author: HUJING
+ * @Date: 2019/3/22 11:37
+ */
+public class Test {
+    public static void main(String[] args) throws Exception {
+        Neo4jAPI neo4jAPI = new Neo4jAPI(DriverManager.newDrive("localhost", "neo4j", "root"));
+        Map<String, Object> scale = neo4jAPI.getScaleNoCalc("te");
+
+                Set<String> keys = scale.keySet();
+        for (String key:keys) {
+            System.out.println(key + "," + scale.get(key));
+        }
+
+
+    }
+}

+ 47 - 9
graph/src/main/java/org/diagbot/graph/util/NodeRelationUtil.java

@@ -122,6 +122,52 @@ public class NodeRelationUtil {
             if (session != null) session.close();
         }
     }
+    /**
+     * 添加带属性的关系
+     */
+    public void addRelationWithProperty(final Driver driver, final String fromlbl, final String fromval, final String relation,final Integer sort, final String tolbl, final String toval){
+        Session session = null;
+        try {
+            session = driver.session(AccessMode.WRITE);
+            session.writeTransaction(new TransactionWork<Integer>() {
+                @Override
+                public Integer execute(Transaction tx) {
+                    int result =0;
+                    String query = "MATCH (e:" + fromlbl + "{name:$src}), (c:" + tolbl + "{name:$dest}) " +
+                            "MERGE (e)-[r:" + relation + "{p:"+sort+"}]->(c) RETURN e.name, type(r), c.name";
+                    result = processRelation(tx, query, "src", fromval, "dest", toval);
+                    return result;
+                }
+            });
+        }catch (Exception ex) {
+            ex.printStackTrace();
+        } finally {
+            if (session != null) session.close();
+        }
+    }
+    /**
+     * 添加带属性的关系
+     */
+    public void addRelationWithPropertyDouble(final Driver driver, final String fromlbl, final String fromval, final String relation,final Double sort, final String tolbl, final String toval){
+        Session session = null;
+        try {
+            session = driver.session(AccessMode.WRITE);
+            session.writeTransaction(new TransactionWork<Integer>() {
+                @Override
+                public Integer execute(Transaction tx) {
+                    int result =0;
+                    String query = "MATCH (e:" + fromlbl + "{name:$src}), (c:" + tolbl + "{name:$dest}) " +
+                            "MERGE (e)-[r:" + relation + "{rate:"+sort+"}]->(c) RETURN e.name, type(r), c.name";
+                    result = processRelation(tx, query, "src", fromval, "dest", toval);
+                    return result;
+                }
+            });
+        }catch (Exception ex) {
+            ex.printStackTrace();
+        } finally {
+            if (session != null) session.close();
+        }
+    }
     /**
      * 为两个节点添加关系
      * @param fromlbl 标签类型
@@ -135,15 +181,6 @@ public class NodeRelationUtil {
         //两个节点之间,有关系,先删除
         try {
             session = driver.session(AccessMode.WRITE);
-//            session.writeTransaction(new TransactionWork<Integer>() {
-//                @Override
-//                public Integer execute(Transaction tx) {
-//                    String query = "MATCH (e:" + fromlbl + "{name:$src})-[r]->(c:" +
-//                            tolbl + "{name:$dest}) DELETE r";
-//                    int result = processRelation(tx, query, "src", fromval, "dest", toval);
-//                    return result;
-//                }
-//            });
             //为两个节点添加关系
             session.writeTransaction(new TransactionWork<Integer>() {
                 @Override
@@ -174,6 +211,7 @@ public class NodeRelationUtil {
         tx.run(query, parameters(srclbl, srcname, destlbl, destname));
         return 1;
     }
+
     private int processNode(Transaction tx, String query, String label, String val) {
         tx.run(query, parameters(label, val));
         return 1;

+ 4 - 17
graph/src/main/resources/bolt.properties

@@ -20,22 +20,13 @@ bolt112.user=neo4j
 bolt112.passwd=123456
 
 #\u63A8\u786E\u8BCA\u5904\u7406sql
-#\u67E5\u627E\u8FD1\u4E49\u8BCD\u548C\u5316\u9A8C\u548C\u8F85\u68C0\u9879\u76EE
-
-#searchJinyici=with fildList as data  unwind data as  fild \n \
-#match(d:Disease)-[R1:\u63A8\u8350]->(h)-[r:\u7ED3\u679C]->(l) \n \
-#where l.name=fild \n \
-#return l.name as zi,labels(l)[0] as jin,h.name as fu,labels(h)[0] as da \n \
-#union \n \
-#with fildList as data  unwind data as  fild  \n \
-#match(l)-[r:\u8FD1\u4E49\u8BCD]->(h) \n \
-#where l.name=fild \n \
-#return l.name as zi,labels(l)[0] as jin,h.name as fu,labels(h)[0] as da
-
+#\u67E5\u627E\u8FD1\u4E49\u8BCD
 searchJinyici=with fildList as data  unwind data as  fild  \n \
 match(l)-[r:\u8FD1\u4E49\u8BCD]->(h) \n \
 where l.name=fild \n \
 return l.name as zi,labels(l)[0] as jin,h.name as fu,labels(h)[0] as da
+#\u67E5\u627E\u8FD1\u4E49\u8BCD\u7CBE\u534E\u7248
+serchCollect=match (n)-[r:\u8BCA\u65AD\u4F9D\u636E|:\u8FD1\u4E49\u8BCD]->(e) where n.name in fildList return n.name as fild,collect(distinct type(r)) as typeCollect
 #\u67E5\u627E\u80FD\u63A8\u51FA\u8BCA\u65AD\u4F9D\u636E\u7684\u8BCD
 searchCondition=with newList as data unwind data as row\n \
 match (l)-[r:\u8BCA\u65AD\u4F9D\u636E]->(m)\n \
@@ -56,11 +47,7 @@ searchWords=match(d) where d.name in fildList return distinct d.name as name
 #\u6839\u636E\u75BE\u75C5\u67E5\u627E\u76F8\u5E94\u7684Lis Pacs
 serchLisPacs=match (d:Disease)-[r1:\u63A8\u8350]->(m)\n \
 where d.name in diseaseNmae return distinct d.name as name,labels(m)[0] as lei,m.name as n
-#serchLisPacs=match (d:Disease)-[r1:\u63A8\u8350]->(m:LIS)-[r2:\u5C0F\u9879]->(l) \
-#where d.name in diseaseNmae return distinct d.name as name,labels(m)[0] as lei,m.name as n,l.name as lr \
-#union \
-#match (d:Disease)-[r1:\u63A8\u8350]->(m:PACS)-[r2:\u7ED3\u679C]->(l) \
-#where d.name in diseaseNmae return distinct d.name as name,labels(m)[0] as lei,m.name as n,l.name as lr
+
 #\u66F4\u65B0\u8BCA\u65AD\u4F9D\u636E\u7684path
 updateConditionPath=match (n:Condition)<-[:\u8BCA\u65AD\u4F9D\u636E]-(m) \n \
           with n,\n \

+ 5 - 1
graph/src/main/resources/query.properties

@@ -2,4 +2,8 @@
 # \u7B2C\u4E00\u6B65,\u75BE\u75C5\u5230\u7C7B,\u7C7B\u5305\u542B\u836F
 diseaseDrugsMedication=\
   match(d:Disease{name:'diseaseName'})-[r:\u63A8\u8350]->(h)-[r1:\u5305\u542B]->(l:Medicine) \
-  return d.name,h.name as drug,labels(h)[0] as label,r.p as p,collect(l.name) as collectName
+  return d.name,h.name as drug,labels(h)[0] as label,r.p as p,collect(l.name) as collectName
+# \u7B2C\u4E8C\u6B65,\u75BE\u75C5\u548C\u836F\u7684\u5173\u7CFB
+diseaseMedication=match(d:Disease{name:"diseaseName"})-[r:\u63A8\u8350]->(l:Medicine) return d.name,r.rate as p,l.name as collectName
+# \u7B2C\u4E09\u6B65,\u5927\u7C7B\u548C\u5B50\u7C7B\u7684\u5173\u7CFB
+bigDrugAndSubDrugs=match(d:Disease)-[r:\u63A8\u8350]->(s:Drugs)-[r1:\u5305\u542B]->(j:Drugs)where d.name="diseaseName" return s.name as big,j.name as sub

+ 62 - 0
nlp-web/src/main/java/org/diagbot/nlp/controller/RelationExtractionController.java

@@ -1,14 +1,18 @@
 package org.diagbot.nlp.controller;
 
+import org.diagbot.nlp.dao.model.TaggingResult;
 import org.diagbot.nlp.feature.FeatureType;
 import org.diagbot.nlp.relation.analyze.RelationAnalyze;
 import org.diagbot.nlp.relation.util.OutputInfo;
 import org.diagbot.pub.api.Response;
+import org.diagbot.pub.jdbc.MysqlJdbc;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @ClassName org.diagbot.nlp.controller.RelationExtractionController
@@ -31,4 +35,62 @@ public class RelationExtractionController {
         response.setData(outputInfos);
         return response;
     }
+
+    @RequestMapping({"/list"})
+    @ResponseBody
+    public Response<List<TaggingResult>> list(int pageNum) throws Exception {
+        Response<List<TaggingResult>> response = new Response();
+        MysqlJdbc nlpJdbc = new MysqlJdbc("root", "diagbot@20180822", "jdbc:mysql://192.168.2.235:3306/nlp-web?useUnicode=true&characterEncoding=UTF-8");
+        List<Map<String, String>> data = nlpJdbc.query("re_tagging_result_part",
+                new String[]{"sentence_id", "sentence", "entity_1_name", "entity_2_name", "relation", "entity_1_position", "entity_2_position"},
+                " where relation = 1 order by sentence_id, sentence limit " + pageNum * 100 + ", 100");
+
+        String sentence = "";
+        String s = "";
+        String[] position1 = null;
+        String[] position2 = null;
+        List<TaggingResult> taggingResults = new ArrayList<>();
+        for (Map<String, String> map : data) {
+            TaggingResult tr = new TaggingResult();
+            tr.setSentenceId(map.get("sentence_id"));
+            tr.setEntity1Name(map.get("entity_1_name"));
+            tr.setEntity2Name(map.get("entity_2_name"));
+            tr.setEntity1Position(map.get("entity_1_position"));
+            tr.setEntity2Position(map.get("entity_2_position"));
+            tr.setRelation(map.get("relation"));
+
+            sentence = map.get("sentence");
+            position1 = tr.getEntity1Position().split(",");
+            position2 = tr.getEntity2Position().split(",");
+            if ("0".equals(position1[0])) {
+                s = "<span class=\"label label-success\">";
+            } else {
+                s = sentence.substring(0, Integer.parseInt(position1[0]))
+                        + "<span class=\"label label-success\">";
+            }
+            s = s + sentence.substring(Integer.parseInt(position1[0]), Integer.parseInt(position1[1]) + 1) + "</span>";
+            if (position1[1].equals(position2[0])) {
+                if (Integer.parseInt(position2[1]) == sentence.length() - 1) {
+                    s = s + "<span class=\"label label-success\">" + sentence.substring(Integer.parseInt(position2[0])) + "</span>";
+                } else {
+                    s = s + "<span class=\"label label-success\">" + sentence.substring(Integer.parseInt(position2[0]), Integer.parseInt(position2[1]) + 1) + "</span>";
+                }
+            } else {
+                s = s + sentence.substring(Integer.parseInt(position1[1]) + 1, Integer.parseInt(position2[0]));
+
+                if (Integer.parseInt(position2[1]) == sentence.length() - 1) {
+                    s = s + "<span class=\"label label-success\">" + sentence.substring(Integer.parseInt(position2[0])) + "</span>";
+                } else {
+                    s = s + "<span class=\"label label-success\">" + sentence.substring(Integer.parseInt(position2[0]), Integer.parseInt(position2[1]) + 1) + "</span>";
+                    s = s + sentence.substring(Integer.parseInt(position2[1]) + 1);
+                }
+            }
+
+            tr.setSentence(s);
+            taggingResults.add(tr);
+        }
+
+        response.setData(taggingResults);
+        return response;
+    }
 }

+ 74 - 0
nlp-web/src/main/java/org/diagbot/nlp/dao/model/TaggingResult.java

@@ -0,0 +1,74 @@
+package org.diagbot.nlp.dao.model;
+
+/**
+ * @ClassName org.diagbot.nlp.dao.model.TaggingResult
+ * @Description TODO
+ * @Author fyeman
+ * @Date 2019/3/27/027 13:25
+ * @Version 1.0
+ **/
+public class TaggingResult {
+    private String sentenceId;
+    private String sentence;
+    private String entity1Name;
+    private String entity2Name;
+    private String relation;
+    private String entity1Position;
+    private String entity2Position;
+
+    public String getSentenceId() {
+        return sentenceId;
+    }
+
+    public void setSentenceId(String sentenceId) {
+        this.sentenceId = sentenceId;
+    }
+
+    public String getSentence() {
+        return sentence;
+    }
+
+    public void setSentence(String sentence) {
+        this.sentence = sentence;
+    }
+
+    public String getEntity1Name() {
+        return entity1Name;
+    }
+
+    public void setEntity1Name(String entity1Name) {
+        this.entity1Name = entity1Name;
+    }
+
+    public String getEntity2Name() {
+        return entity2Name;
+    }
+
+    public void setEntity2Name(String entity2Name) {
+        this.entity2Name = entity2Name;
+    }
+
+    public String getRelation() {
+        return relation;
+    }
+
+    public void setRelation(String relation) {
+        this.relation = relation;
+    }
+
+    public String getEntity1Position() {
+        return entity1Position;
+    }
+
+    public void setEntity1Position(String entity1Position) {
+        this.entity1Position = entity1Position;
+    }
+
+    public String getEntity2Position() {
+        return entity2Position;
+    }
+
+    public void setEntity2Position(String entity2Position) {
+        this.entity2Position = entity2Position;
+    }
+}

+ 0 - 28
nlp/src/main/java/org/diagbot/nlp/relation/extract/PresentExtract.java

@@ -110,33 +110,5 @@ public class PresentExtract extends BaseExtract {
             negative.setNegaName(lemma.getText());
             symptom.setNegative(negative);
         }
-
-        //体征指标
-        if (NlpUtil.isFeature(lemma.getProperty(), Constants.vital_index_type)) {
-            Item item = new Item();
-            item.setItemName(lemma.getText());
-            for (Lemma l : lemma.getRelationLemmas()) {
-                if (NlpUtil.isFeature(l.getProperty(), Constants.vital_type)) {
-                    Desc desc = new Desc();
-                    desc.setInfo(l.getText());
-                    item.setDesc(desc);
-                }
-            }
-            symptom.setItem(item);
-        }
-
-        //体征指标值 体征结果放入描述信息
-        if (NlpUtil.isFeature(lemma.getProperty(), Constants.vital_type)) {
-            Desc desc = new Desc();
-            desc.setInfo(lemma.getText());
-            for (Lemma l : lemma.getRelationLemmas()) {
-                if (NlpUtil.isFeature(l.getProperty(), Constants.degree_type)) {
-                    Degree degree = new Degree();
-                    degree.setDegreeName(l.getText());
-                    desc.setDegree(degree);
-                }
-            }
-            symptom.setDesc(desc);
-        }
     }
 }

+ 0 - 27
nlp/src/main/java/org/diagbot/nlp/relation/module/Symptom.java

@@ -18,9 +18,6 @@ public class Symptom {
     private Cause cause;
     private Property property;
     private PD pd;
-    private Factor factor;
-    private Item item;
-    private Desc desc;
 
     public String getSymptomName() {
         return symptomName;
@@ -77,28 +74,4 @@ public class Symptom {
     public void setPd(PD pd) {
         this.pd = pd;
     }
-
-    public Factor getFactor() {
-        return factor;
-    }
-
-    public void setFactor(Factor factor) {
-        this.factor = factor;
-    }
-
-    public Item getItem() {
-        return item;
-    }
-
-    public void setItem(Item item) {
-        this.item = item;
-    }
-
-    public Desc getDesc() {
-        return desc;
-    }
-
-    public void setDesc(Desc desc) {
-        this.desc = desc;
-    }
 }

+ 0 - 13
nlp/src/main/resources/classify.dict

@@ -32,7 +32,6 @@ uc4wosX6ldH/giOxsh/keYQ33BywhUJYZPoBO8n237c=
 sq5zlizUqhqHWMzIoFlFKPR/pORJpN9Vqlng+sByJCU=
 hgC7M3b39tTf5bmaUhsl4L3x4iJ8d5RzPSlDKuZEVjRtRFdcV1NujTrG6oBW92Ux
 frnNWRzB6BPPPNYz2D3dCA80ZZEsU3ddz4eh8Mahl5CxTb9XoIkHhg==
-U5h/K5wI1rCBm7Vslk47GlfMQ2l3jz6PRUCVPnTww6PBKyLBwyEWvwNafAt4xcbP
 m9q3k3xk3wXf5bmaUhsl4L3x4iJ8d5RzPSlDKuZEVjRtRFdcV1NujTrG6oBW92Ux
 2z0tJ3lTKVP/giOxsh/keYQ33BywhUJYZPoBO8n237c=
 QoC/nLn28T0C+rctQKAgcQ==
@@ -249,7 +248,6 @@ bXeXtjeRnceYwtsGLXv3QRv7cyud4xHvIcH2gySE+pt90joex6fU8w==
 S27l44+aUKGyN+mEyJFk1eHZq5jN+kbH/3vyjmvlEiR2eUHGj471i4/cY+Eo7wNg
 axliUydwy6CbIYwjhndvSc00TtO1zC8qF+l6Y9N2RLGh3Kpg1P0DcvwJyrXwan2SVDH65NLCimkChzW+9JMTLQ==
 7mHfSs2ahWgN/MTGra2zHurUo2OLEJuOcMzJDR+Dx5/q1KNjixCbjkpgEZ36UZf7
-ltfmaY06UmHuKTwXQ8G++WI2rUC8DjuDlwSAWhjCMeVeWQJuZ3jutf2Saj+ycVe1KNbW1X9m3F/N/myMdNF0eg==
 ltfmaY06UmFpsBk3T9c0WHfWUbCsZSxkv1TG75Duk1J31lGwrGUsZOfYaeLVqdOC
 ltfmaY06UmEVmy/lhETRf1RbAVVTc/TL88gL0WYvCcBc5unjpKSGaQ==
 ltfmaY06UmHQqRYkRXd1mqem6OVL2DYu
@@ -276,7 +274,6 @@ VYC86U7wxUX35DEw2wRUr77FdzWBmGuA
 VYC86U7wxUVuoije31Jd6G+W3nM3rIhmF2tqckCSSA0=
 vPPRWcr4YTfaK6/3r+Vykez43b3/DLD+jHJUgMBB3xdKYBGd+lGX+w==
 vPPRWcr4YTeEfvwh8gqO7i9GjCJsfm4x7Pjdvf8MsP6MclSAwEHfF0pgEZ36UZf7
-vPPRWcr4YTeEfvwh8gqO7i9GjCJsfm4xefy5emNpoED9GPObCJNmRSTJz2hrgEDj
 V0frMxTQuVeMevuJvs9jkNHslsJl7u4CwWoy2GgCKNo=
 IM+jua9aH2mukRWtpsKrGNaASP+5scN8yPDcgRquUNKz3WtVDETsAROEiP9CLQoxbENZYM316MM=
 1NPpRLTHlGSasKbS+m6iOiDPZo+CnhxUmD+IQiHVKig=
@@ -288,7 +285,6 @@ eGznvUAM0uHU6zgx9FyG6RaM7WOSQVwkh7wTmwEwQXA=
 D3C9tHD21pqc1Vb2EO2M0fBJjrfkIPW/fxbkLmU1oo+cnhBcsp/6nqN1jYWi3sJk
 VfPlSD8i9UYmSDgAB2kAg52p4Dnh0VTi1Mzbbxn2BUM=
 VfPlSD8i9Ub3R9KvkRZsVmxl+7KbWyNG
-VfPlSD8i9UbOuOKExXRjQlSVzdl1PJl4LsJ0WD3LSKVMwTH/nM47BuWhvZh7ytuf
 zZa0fPFxEK+mHOFr+Gs47rm4q3Q0uW8AO8B+JsbxdH8=
 Jwh3VweI8WFIWFm1Z5ArgDgsRRzQeyj2h8sbVxmGYxc=
 2z4SSMorMrj0iUewMX/HNqkWbu+roNTTlstWavEIl/fN/myMdNF0eg==
@@ -864,7 +860,6 @@ egdG4lAcaQsdxLyjErI1cSOCFug3Kgau
 Sl6BLrlvQSLUXi7Mo4IbTkHtQNj0yevSOaeYvhBHXvY=
 1gUQpu2xSeM3Y4XD3zOr/1iiRIPsjsUx
 ALEKCIGw74MTpTagcMl4MGjmiJmNa7uO
-k/1y4hNfYFntVN1pFDSc8RIohHaDxAUCA200GsQgR08=
 T1JDUmVce1tDbBG7nnyBJSz3pRFAMZgXb8nVx09fy5I4ol1WGH/UYyJETzU7uXbDPJ0iAF6t8WzIZkPw1PCk5UpgEZ36UZf7
 EzHVXle2xuzMOFufYLPehU/8+3IIDohx+IppjFHGz5DN/myMdNF0eg==
 XovH2uoqnUgBcKUyc6e+2VPzs1UZEM5SbkpQ2+OcnaK516EIk0//scOARPTf3yZp2QN4XPx/73ss96URQDGYFxCsfQH5AndQQo+b5Q3VZwY=
@@ -892,7 +887,6 @@ tgvNZaXukA9L/UW/zBqatv5aEIwl2vxt
 41KYgrT0eeHiY3SCNs6T6Vb2Mcn6v/Eu
 5dtCqnjl6f38szI+gIxrlgUbJZYO0vTBkG57ceWMY4U=
 RNzAdY0AuWiA5QIdKVy62QUbJZYO0vTBkG57ceWMY4U=
-WNmqKr2DQDpL/UW/zBqatm4k+/uv3k0rQO93OQZFPCL9NE8PmLrm2kpgEZ36UZf7
 qdxhzGdO7jkswPGwz3jUKfOZP2xXjIHYlvQg3XJhi5TGuYfsZXbuiUpgEZ36UZf7
 FcVcmzyCL9Snqy7jTcdZCHiF8O79Oeu6
 FcVcmzyCL9RZwvctrbcBuAUbJZYO0vTBkG57ceWMY4U=
@@ -1094,7 +1088,6 @@ Nv3fuNI5Z5GakTpNU2z6YLL7eishqWZcNoacTcPrgWqqtkPG4uOcrWio84Sl8MtnSIPVT1yBEnIrR3s6
 Gc+2o0fCUZzBRTe6oIudregYu/3lBtTW
 5Sra+EdnNoR8prrdihRFLHSUC9qzlE8Q4IOBga5nZhU=
 5Sra+EdnNoSx7oF3dV8rMv1aiH5OL33XRPSDQg6jxMY=
-g30soSzYKlYqYKw79TNc7QRCRQj3+Yw4xTk1DIXFBE8=
 rjhqzeVmkFnTI+WJ2et/tyjIGXGb0pxhlFY8TGpRROykR43XZ/D19GjmiJmNa7uO
 By5Q/SU5xir/htQJCfkj0mjDavUxAGQwiyj1XzzybXfZEVscrMg5dh3MJNT9T0Fg
 By5Q/SU5xipoUqVZtkiIfor2h5to/cdy+zH+s2Ckk/s=
@@ -1113,7 +1106,6 @@ IfQDH7CTkzJP5E6M4w+G6WjmiJmNa7uO
 IfQDH7CTkzJL1m083cZQTRnbBLCi9C1xiyj1XzzybXdMCGJKFF/t5/zjff0oshEqRPSDQg6jxMY=
 1AooRnXbEgjf639HfTBDFMxEHLCiD1Fbiyj1XzzybXfXpE/hQAQuKsyMPkyDj6du
 aaaLXiiwFGwYoo5YVl4ymlRLANlLlxMa6PxbI2Tuen10WJlxlVnNiGjmiJmNa7uO
-dbLk7j87qA6dfi/AMIwgmbwSPIDxDMZXc2cBBXfK2Sg=
 dbLk7j87qA4+lUpJsZjitBA5dmRw7oD3lwSAWhjCMeXiu6DVXxeD2qpMdycOeUu+
 KAgQozkhYNL5U7DJmdKn2Pubfnjgw4t5TqaB7WtLhLs=
 KAgQozkhYNIUJhbuNqUgurMtDXvYITGLf3CUNr4OtgOzLQ172CExi2jmiJmNa7uO
@@ -1429,7 +1421,6 @@ y6woOm+2nak76tKZqLR5ePsXBbymGi6229PyhLKx2/M=
 FRuKyrtJj/RL/UW/zBqatrbbhSEIgUpgPdWxorbyLPs=
 FRuKyrtJj/Ruoije31Jd6G+W3nM3rIhmF2tqckCSSA0=
 FRuKyrtJj/Rtji7RQU6MgnxagDumF4eXfIMd9XetO0Q=
-SKaLpgRak/8C5jte+G2tDI4VE9jQFPdkZl7o2bncDjWc1z5OQO1F/suCId09X+YWsy/WPPubGso=
 ZVA3/wCefBvKKPZ9pFrEuNlZxLMPZCO0
 NeOoAxjiNI6eVQOebOiQLUXV3zTNFOIbnlUDnmzokC34/GXbYZi1yg==
 6I3whFXazWvCtyDuBs8393rFrxRvslo+
@@ -2701,7 +2692,6 @@ y6RwJnkotMGAB2gzKtqpWq4nf19T2MqU
 yokgZBjG8QoKRzCQOPslC6QYi4EuC0UwUw1uOsHB9JE=
 nkXD7eUcGePpaRTCt1IWM7xmhD0i8Z6MLAP6atSHlLIDe6UEgsXt4g==
 nkXD7eUcGePpaRTCt1IWM/m8YryVkoItu1Ttk1Cqmfax7oF3dV8rMv1aiH5OL33XRPSDQg6jxMY=
-nkXD7eUcGeOsZzsJ/bexA0HtQNj0yevSOaeYvhBHXvY=
 nkXD7eUcGeN/Wn+OYuhRqlyeT2PysZmfBPYSNyNJvJo=
 0PSdlzO54Ng1rjaqozpDXqZGg42X964l5BVA0aRDJIpli4jU0IqLM4WnN21XAUBd4pfsivOis/w=
 0PSdlzO54NhKHzxyfFv6AcP9BUiq3RYM2XAUTDmsJIdVpF3YrJiqUC/Enh2Hig6A3AiudXn+tDg852cDxbmqrkpgEZ36UZf7
@@ -3090,7 +3080,6 @@ W2bBwRKK4rKrD5lrehcs0eX2o+Ji1cV3EhNnSPa0ZtRIIW6Yo0+Qcg==
 Yc9r17g16XPJDvGOv3hcXvpi6Ttg5z9+
 9Z7CDt8UKI+SiL22CgmDHRtCiFIvl2Nt8hultllIVlhDlYZOFx0ejEpgEZ36UZf7
 9Z7CDt8UKI8VYtoCQtI3jGWYJkOa6bezXjtyr6A7ByYvheJYChtGSvWewg7fFCiPRPSDQg6jxMY=
-4EAa7rXXi9pnljC7BKM66GXck5eZcMYqRPSDQg6jxMY=
 8mmZXfA1XQNOZ7L5fkIdtGqEYbHJr1qagAvyPfjooHlqhGGxya9amhokdeqhF+go
 uKyAHyqaIxfgwWhs6sMTg2m+Co+Sbg46h3BzZ8jy7CRFvLp4VWH/Rw==
 uKyAHyqaIxerJ0WVSgFMUJTpFHbyXXLYl2wk5bLU6tCyqIkJrrynYK3euAJGuYi5HXOsLgfiOIE=
@@ -3289,8 +3278,6 @@ BJkReTsX1JCasKbS+m6iOkkYN69+7bJOUMuOrTNCizK4L+7+yUX/Mg==
 X1TI2yx608bha/ouwRhrgXv3fXHWDmjo
 X1TI2yx608aYZ2XfIHjSYA3ATuDFAU1ecrpIx9viR18=
 5fQKGywt1fAzkv78V9MxEcRVl+UAZZmInky2BtDQnDc=
-39Z8DCPqeTTN2eWW4k1RskpgEZ36UZf7
-YRezYtWickmWVrgdkPXx6w==
 hYF2byblOfrmON+KcZNNZ/5aEIwl2vxt
 RhevA091BXhTFOd9Y6fg77jjxG+prICFHw1WTVz8+tK0JYpL2Q3nR51MUuyK2cfleAvdR6S8hz8=
 brIZn1EvciUIhOadvvPYK7jjxG+prICFHw1WTVz8+tK0JYpL2Q3nR51MUuyK2cfleAvdR6S8hz8=

文件差異過大導致無法顯示
+ 396 - 67
nlp/src/main/resources/push-tc.dict


+ 7 - 0
nlp/src/main/resources/relation.dict

@@ -1,6 +1,7 @@
 RNMak3cFWH4=
 ddolNu+ruoI=
 crSKo8ZJQWw=
+GLI7v4oJneU=
 z9odaTsZTe4=
 UtapbxnvICk=
 zCUYt/gJFTA=
@@ -22,6 +23,7 @@ YLWWPYmlo7s=
 28BY78TjZOw=
 1zF5xvlmigE=
 5iH5AYe9ogQ=
+c1L+syscJqI=
 dCLIxiAaEPQ=
 nLmMNwLd9hU=
 KO6x8jrh1Go=
@@ -32,6 +34,8 @@ MowtsJaT+Eg=
 tvD9gnRGuE0=
 TS5FqQfA3Bo=
 8OTyr31+HZE=
+qdFv0AhEzho=
+W8g6uyvyhXY=
 33mX5o5YCuI=
 eN8E9yHmcuQ=
 Wrhyd5KGRwU=
@@ -56,12 +60,15 @@ GHAXRYXi1X4=
 3PiS9MWTEcU=
 h0qS3XYvg7w=
 exAkRV4R8YY=
+VIiXu9Fzbfg=
 u6Lr+Jfr3PY=
 Slw/FnB9o4g=
 r7bymlovf1w=
 bSkSwBpuGHs=
 Xoa3vcFiseU=
 TXb4vMJd3ok=
++XVC3EsH+pQ=
+J36KtM8/eqU=
 rc7iV++H97Y=
 itwdzE4pvKw=
 yuYZf2CANH0=

文件差異過大導致無法顯示
+ 233 - 14
nlp/src/main/resources/synonym.dict


文件差異過大導致無法顯示
+ 418 - 92
nlp/src/main/resources/tc.dict


+ 6 - 6
nlp/src/test/java/org/diagbot/nlp/test/EntityExtractTest.java

@@ -87,11 +87,11 @@ public class EntityExtractTest {
                         "entity_1_name", "entity_2_name", "entity_1_prop", "entity_2_prop", "entity_1_prop_name", "entity_2_prop_name", "relation"});
             }
 
-//            if (results_none_pair.size() > 0) {
-//                MysqlJdbc nlpJdbc = new MysqlJdbc("root", "diagbot@20180822", "jdbc:mysql://192.168.2.235:3306/nlp-web?useUnicode=true&characterEncoding=UTF-8");
-//                nlpJdbc.insert(results_none_pair, "re_tagging_result_none_compare", new String[]{"sentence_id", "sentence_uuid", "sentence", "entity_1_position", "entity_2_position",
-//                        "entity_1_name", "entity_2_name", "entity_1_prop", "entity_2_prop", "entity_1_prop_name", "entity_2_prop_name", "relation"});
-//            }
+            if (results_none_pair.size() > 0) {
+                MysqlJdbc nlpJdbc = new MysqlJdbc("root", "diagbot@20180822", "jdbc:mysql://192.168.2.235:3306/nlp-web?useUnicode=true&characterEncoding=UTF-8");
+                nlpJdbc.insert(results_none_pair, "re_tagging_result_part_new_none", new String[]{"sentence_id", "sentence_uuid", "sentence", "entity_1_position", "entity_2_position",
+                        "entity_1_name", "entity_2_name", "entity_1_prop", "entity_2_prop", "entity_1_prop_name", "entity_2_prop_name", "relation"});
+            }
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -132,7 +132,7 @@ public class EntityExtractTest {
 
     public List<Map<String, String>> searchData() {
         MysqlJdbc nlpJdbc = new MysqlJdbc("root", "diagbot@20180822", "jdbc:mysql://192.168.2.235:3306/nlp-web?useUnicode=true&characterEncoding=UTF-8");
-        List<Map<String, String>> data = nlpJdbc.query("tb_ryjl_extract", new String[]{"zyxh", "xbs"}, " limit 3, 3");
+        List<Map<String, String>> data = nlpJdbc.query("tb_ryjl_extract", new String[]{"zyxh", "xbs"}, " limit 15, 100");
         return data;
     }
 

+ 2 - 2
push-web/src/main/java/org/diagbot/push/controller/AlgorithmController.java

@@ -80,9 +80,9 @@ public class AlgorithmController extends BaseController {
         }
 
         //推送出的诊断信息作为参数传入知识图谱
-        List<String> pushDiags = new ArrayList<>();
+        List<FeatureRate> pushDiags = new ArrayList<>();
         for (FeatureRate fr : bigDataResponseData.getDis()) {
-            pushDiags.add(fr.getFeatureName());
+            pushDiags.add(fr);
         }
         searchData.setPushDiags(pushDiags);
 

+ 12 - 0
push-web/src/main/java/org/diagbot/push/controller/GraphController.java

@@ -3,6 +3,8 @@ package org.diagbot.push.controller;
 import org.diagbot.common.work.ResponseData;
 import org.diagbot.common.work.SearchData;
 import org.diagbot.graph.javabean.GdbResponse;
+import org.diagbot.graph.jdbc.DriverManager;
+import org.diagbot.graph.jdbc.Neo4jAPI;
 import org.diagbot.graphWeb.work.GraphCalculate;
 import org.diagbot.graphWeb.work.HighRiskCalculate;
 import org.diagbot.pub.api.Response;
@@ -14,6 +16,7 @@ import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.ResponseBody;
 
 import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
 
 @Controller
 @RequestMapping("/graph")
@@ -66,4 +69,13 @@ public class GraphController extends BaseController {
         response.setData(responseData);
         return response;
     }
+
+    @RequestMapping(value = "/scale", method = RequestMethod.POST)
+    @ResponseBody
+    public Map<String, Object> scale(HttpServletRequest request, @RequestBody SearchData searchData) throws Exception {
+        Neo4jAPI neo4jAPI = new Neo4jAPI(DriverManager.newDrive("192.168.2.233","neo4j","root"));
+        String scaleName = searchData.getScaleName();
+        Map<String, Object> scale = neo4jAPI.getScale(scaleName);
+        return scale;
+    }
 }

+ 5 - 0
push-web/src/main/java/org/diagbot/push/controller/RelationController.java

@@ -21,4 +21,9 @@ public class RelationController extends BaseController {
     public String index() {
         return listView;
     }
+
+    @RequestMapping({"/list"})
+    public String list() {
+        return "/pages/label/list.html";
+    }
 }

+ 2 - 0
push-web/src/main/resources/static/index.html

@@ -67,6 +67,8 @@
             <li class="active"><a href="/push-web/participle/index"><i class="fa fa-circle-o"></i>分词示例</a></li>
             <li class="active"><a href="/push-web/extract/index"><i class="fa fa-circle-o"></i>提取特征</a></li>
             <li class="active"><a href="/push-web/relation/index"><i class="fa fa-circle-o"></i>关系抽取</a></li>
+            <li class="active"><a href="/push-web/relation/list"><i class="fa fa-circle-o"></i>数据标注</a>
+            </li>
             <li class="active"><a href="/push-web/algorithm/index"><i class="fa fa-circle-o"></i>算法分析</a></li>
             <li class="active"><a href="/push-web/graph/index"><i class="fa fa-circle-o"></i>知识图谱分析</a></li>
           </ul>

+ 2 - 0
push-web/src/main/resources/static/pages/algorithm/list.html

@@ -63,6 +63,8 @@
                     <ul class="treeview-menu">
                         <li class="active"><a href="/push-web/participle/index"><i class="fa fa-circle-o"></i>分词示例</a></li>
                         <li class="active"><a href="/push-web/extract/index"><i class="fa fa-circle-o"></i>提取特征</a></li>
+                        <li class="active"><a href="/push-web/relation/list"><i class="fa fa-circle-o"></i>数据标注</a>
+                        </li>
                         <li class="active"><a href="/push-web/relation/index"><i class="fa fa-circle-o"></i>关系抽取</a></li>
                         <li class="active"><a href="/push-web/algorithm/index"><i class="fa fa-circle-o"></i>算法分析</a></li>
                     </ul>

+ 2 - 0
push-web/src/main/resources/static/pages/extract/feature.html

@@ -63,6 +63,8 @@
                     <ul class="treeview-menu">
                         <li class="active"><a href="/push-web/participle/index"><i class="fa fa-circle-o"></i>分词示例</a></li>
                         <li class="active"><a href="/push-web/extract/index"><i class="fa fa-circle-o"></i>提取特征</a></li>
+                        <li class="active"><a href="/push-web/relation/list"><i class="fa fa-circle-o"></i>数据标注</a>
+                        </li>
                         <li class="active"><a href="/push-web/relation/index"><i class="fa fa-circle-o"></i>关系抽取</a></li>
                         <li class="active"><a href="/push-web/algorithm/index"><i class="fa fa-circle-o"></i>算法分析</a></li>
                     </ul>

+ 210 - 0
push-web/src/main/resources/static/pages/label/list.html

@@ -0,0 +1,210 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <title>AdminLTE 2 | Invoice</title>
+    <!-- Tell the browser to be responsive to screen width -->
+    <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
+    <!-- Bootstrap 3.3.6 -->
+    <link rel="stylesheet" href="../bootstrap/css/bootstrap.min.css">
+    <!-- Font Awesome -->
+    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.5.0/css/font-awesome.min.css">
+    <!-- Ionicons -->
+    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/ionicons/2.0.1/css/ionicons.min.css">
+    <!-- Theme style -->
+    <link rel="stylesheet" href="../dist/css/AdminLTE.min.css">
+    <!-- AdminLTE Skins. Choose a skin from the css/skins
+         folder instead of downloading all of them to reduce the load. -->
+    <link rel="stylesheet" href="../dist/css/skins/_all-skins.min.css">
+
+    <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
+    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
+    <!--[if lt IE 9]>
+    <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
+    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
+    <![endif]-->
+    <style>
+        .interval {
+            padding: 1px 8px !important;
+        }
+
+        #my_file {
+            visibility: hidden; /* 隐藏 */
+        }
+    </style>
+</head>
+<body class="hold-transition skin-blue sidebar-mini">
+<div class="wrapper">
+
+    <header class="main-header">
+        <!-- Logo -->
+        <a href="#" class="logo">
+            <!-- logo for regular state and mobile devices -->
+            <span class="logo-lg"><b>D</b>iagbot</span>
+        </a>
+
+    </header>
+    <!-- Left side column. contains the logo and sidebar -->
+    <aside class="main-sidebar">
+        <!-- sidebar: style can be found in sidebar.less -->
+        <section class="sidebar">
+            <!-- /.search form -->
+            <!-- sidebar menu: : style can be found in sidebar.less -->
+            <ul class="sidebar-menu">
+                <li class="header">MAIN NAVIGATION</li>
+                <li class="treeview active">
+                    <a href="#">
+                        <i class="fa fa-folder"></i> <span>diagbot</span>
+                        <span class="pull-right-container">
+              <i class="fa fa-angle-left pull-right"></i>
+            </span>
+                    </a>
+                    <ul class="treeview-menu">
+                        <li class="active"><a href="/push-web/participle/index"><i class="fa fa-circle-o"></i>分词示例</a>
+                        </li>
+                        <li class="active"><a href="/push-web/extract/index"><i class="fa fa-circle-o"></i>提取特征</a></li>
+                        <li class="active"><a href="/push-web/relation/list"><i class="fa fa-circle-o"></i>数据标注</a>
+                        </li>
+                        <li class="active"><a href="/push-web/relation/index"><i class="fa fa-circle-o"></i>关系抽取</a>
+                        </li>
+                        <li class="active"><a href="/push-web/algorithm/index"><i class="fa fa-circle-o"></i>算法分析</a>
+                        </li>
+                    </ul>
+                </li>
+            </ul>
+        </section>
+        <!-- /.sidebar -->
+    </aside>
+
+    <!-- Content Wrapper. Contains page content -->
+    <div class="content-wrapper">
+        <!-- Content Header (Page header) -->
+        <section class="content-header">
+            <h1>
+                <small></small>
+            </h1>
+            <ol class="breadcrumb">
+                <li><a href="#"><i class="fa fa-dashboard"></i>Diagbot</a></li>
+                <li><a href="#">nlp</a></li>
+                <li class="active">分词示例</li>
+            </ol>
+        </section>
+        <!-- Main content -->
+        <section class="invoice">
+            <div class="row">
+                <div class="row">
+                    <div class="col-xs-12">
+                        <button type="button" class="btn btn-success pull-right"
+                                onclick="_ajax()"><i
+                                class="fa fa-credit-card"></i> 开始
+                        </button>
+                        <button type="button" class="btn btn-success pull-right"
+                                onclick="after()"><i
+                                class="fa fa-credit-card"></i> 下一页
+                        </button>
+                        <button type="button" class="btn btn-success pull-right"
+                                onclick="before()"><i
+                                class="fa fa-credit-card"></i> 上一页
+                        </button>
+                    </div>
+                </div>
+                <div class="col-md-12">
+                    <!-- TABLE: LATEST ORDERS -->
+                    <div class="box box-info">
+                        <div class="box-header with-border">
+                            <h3 class="box-title">正样本信息</h3>
+                            <div class="box-tools pull-right">
+                                <button type="button" class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i>
+                                </button>
+                                <button type="button" class="btn btn-box-tool" data-widget="remove"><i class="fa fa-times"></i></button>
+                            </div>
+                        </div>
+                        <!-- /.box-header -->
+                        <div class="box-body">
+                            <div class="table-responsive">
+                                <table class="table no-margin">
+                                    <thead>
+                                    <tr>
+                                        <th width="90%">样本</th>
+                                        <th width="10%">ID</th>
+                                    </tr>
+                                    </thead>
+                                    <tbody id="symptom_extract_id">
+                                    </tbody>
+                                </table>
+                            </div>
+                            <!-- /.table-responsive -->
+                        </div>
+                    </div>
+                    <!-- /.box -->
+                </div>
+                <!-- ./col -->
+            </div>
+
+
+
+            <script>
+                var pageNum = 0;
+                function before() {
+                    if (pageNum > 0) {
+                        pageNum = pageNum -1;
+                    }
+                    _ajax();
+                }
+
+                function after() {
+                    pageNum = pageNum +1;
+                    _ajax();
+                }
+
+                function _ajax() {
+                    $.support.cors = true;
+                    $.ajax({
+                        url: nlp_web_url + '/relation/list',
+                        data: {"pageNum":pageNum},
+                        dataType: "json",
+                        type: "post",
+                        success: function (data) {
+                            var taggingResults = data.data;
+                            var h = "";
+                            $.each(taggingResults, function (index, taggingResult) {
+                                h += "<tr><td>";
+                                h += taggingResult.sentence;
+                                h += "</td>";
+                                h += "<td>";
+                                    h += taggingResult.sentenceId;
+                                h += "</td></tr>";
+                            });
+
+                            $("#symptom_extract_id").html(h);
+                        }
+                    });
+                };
+            </script>
+    </section>
+    <!-- /.content -->
+    <div class="clearfix"></div>
+</div>
+
+<!-- /.control-sidebar -->
+<!-- Add the sidebar's background. This div must be placed
+     immediately after the control sidebar -->
+<div class="control-sidebar-bg"></div>
+</div>
+<!-- ./wrapper -->
+
+<!-- jQuery 2.2.3 -->
+<script src="../plugins/jQuery/jquery-2.2.3.min.js"></script>
+<!-- Bootstrap 3.3.6 -->
+<script src="../bootstrap/js/bootstrap.min.js"></script>
+<!-- FastClick -->
+<script src="../plugins/fastclick/fastclick.js"></script>
+<!-- AdminLTE App -->
+<script src="../dist/js/app.min.js"></script>
+<!-- AdminLTE for demo purposes -->
+<script src="../dist/js/demo.js"></script>
+
+<script src="../dist/js/push.js"></script>
+</body>
+</html>

+ 2 - 0
push-web/src/main/resources/static/pages/participle/sample.html

@@ -63,6 +63,8 @@
           <ul class="treeview-menu">
             <li class="active"><a href="/push-web/participle/index"><i class="fa fa-circle-o"></i>分词示例</a></li>
             <li class="active"><a href="/push-web/extract/index"><i class="fa fa-circle-o"></i>提取特征</a></li>
+            <li class="active"><a href="/push-web/relation/list"><i class="fa fa-circle-o"></i>数据标注</a>
+            </li>
             <li class="active"><a href="/push-web/relation/index"><i class="fa fa-circle-o"></i>关系抽取</a></li>
             <li class="active"><a href="/push-web/algorithm/index"><i class="fa fa-circle-o"></i>算法分析</a></li>
           </ul>

+ 2 - 0
push-web/src/main/resources/static/pages/relation/sample.html

@@ -64,6 +64,8 @@
                         <li class="active"><a href="/push-web/participle/index"><i class="fa fa-circle-o"></i>分词示例</a>
                         </li>
                         <li class="active"><a href="/push-web/extract/index"><i class="fa fa-circle-o"></i>提取特征</a></li>
+                        <li class="active"><a href="/push-web/relation/list"><i class="fa fa-circle-o"></i>数据标注</a>
+                        </li>
                         <li class="active"><a href="/push-web/relation/index"><i class="fa fa-circle-o"></i>关系抽取</a>
                         </li>
                         <li class="active"><a href="/push-web/algorithm/index"><i class="fa fa-circle-o"></i>算法分析</a>