Browse Source

图谱查询接口修改

yuchengwei 5 months atrás
parent
commit
aad5205224

+ 4 - 4
src/main/java/com/qizhen/healsphere/config/Neo4jUtil.java

@@ -10,14 +10,14 @@ import org.springframework.context.annotation.Configuration;
 public class Neo4jUtil {
 
 //    @Value("${spring.neo4j.uri}")
-//    private static String url = "bolt://173.18.12.194:7687";
-    private static String url = "bolt://172.16.8.59:7687";
+    private static String url = "bolt://173.18.12.194:7687";
+//    private static String url = "bolt://172.16.8.59:7687";
 //    @Value("${spring.neo4j.authentication.username}")
     private static String username = "neo4j";
 
 //    @Value("${spring.neo4j.authentication.password}")
-//    private static String password = "12345678";
-    private static String password = "1Qaz@wsx";
+    private static String password = "12345678";
+//    private static String password = "1Qaz@wsx";
 
     private static Driver driver;
 

+ 21 - 4
src/main/java/com/qizhen/healsphere/facade/KgFacade.java

@@ -6,6 +6,7 @@ import cn.hutool.json.JSONUtil;
 import com.qizhen.healsphere.common.exception.CommonErrorCode;
 import com.qizhen.healsphere.common.exception.CommonException;
 import com.qizhen.healsphere.repository.mapper.entity.PresetInfo;
+import com.qizhen.healsphere.repository.neo4j.BaseNodeRepository;
 import com.qizhen.healsphere.service.impl.KgServiceImpl;
 import com.qizhen.healsphere.web.dto.*;
 import com.qizhen.healsphere.web.param.KgQuery;
@@ -27,6 +28,22 @@ import java.util.Map;
 public class KgFacade extends KgServiceImpl {
     @Autowired
     private PresetInfoFacade presetInfoFacade;
+    @Autowired
+    private BaseNodeRepository baseNodeRepository;
+
+
+    public List<NodeDTO> getNode(KgQuery kgQuery){
+        List<String> list = baseNodeRepository.findNodeByNameLike(kgQuery.getLabelName(), kgQuery.getInputStr());
+        List<NodeDTO> result = new ArrayList<>();
+        if (CollUtil.isNotEmpty(list)){
+            for (String node : list){
+                NodeDTO nodeDTO = new NodeDTO();
+                nodeDTO.setName(node);
+                result.add(nodeDTO);
+            }
+        }
+        return result;
+    }
 
     public GraphLabelDTO getGraphFac(KgQuery kgQuery) {
         GraphLabelDTO graphLabelDTO = new GraphLabelDTO();
@@ -37,7 +54,7 @@ public class KgFacade extends KgServiceImpl {
         if (CollUtil.isEmpty(res)) {
             throw new CommonException(CommonErrorCode.NOT_EXISTS);
         } else {
-            Integer nodeId = 0;
+            long nodeId = 0;
             categories.add(new CategorieDTO("中心词"));
             categories.add(new CategorieDTO("关系"));
             Map<String, Integer> cMap = new HashMap<>();
@@ -46,7 +63,7 @@ public class KgFacade extends KgServiceImpl {
 
             GraphDTO graphDTO = res.get(0);
             GNodeDTO gNodeDTO
-                    = new GNodeDTO(graphDTO.getLabel(), 0, graphDTO.getName(), nodeId, "circle", 50);
+                    = new GNodeDTO(graphDTO.getLabel(), 0, graphDTO.getName(), nodeId, "circle", 50,graphDTO.getProperties());
             nodeId++;
             node.add(gNodeDTO);
             if (CollUtil.isNotEmpty(graphDTO.getENodeRSDTOS())) {
@@ -58,7 +75,7 @@ public class KgFacade extends KgServiceImpl {
                         rsId++;
                     }
                     GNodeDTO nNodeDTO
-                            = new GNodeDTO("", 1, "", nodeId, "diamond", 10);
+                            = new GNodeDTO("", 1, "", nodeId, "diamond", 10,graphDTO.getProperties());
                     node.add(nNodeDTO);
                     links.add(new LinkDTO(gNodeDTO.getName(), nNodeDTO.getName(), baseNodeRSDTO.getRType()));
                     nodeId++;
@@ -70,7 +87,7 @@ public class KgFacade extends KgServiceImpl {
                             }
                             GNodeDTO eNodeDTO
                                     = new GNodeDTO(baseNodeDTO.getLabel(), cMap.get(baseNodeRSDTO.getRType()),
-                                    baseNodeDTO.getName(), nodeId, symbol, 28);
+                                    baseNodeDTO.getName(), nodeId, symbol, 28, baseNodeDTO.getProperties());
                             nodeId++;
                             node.add(eNodeDTO);
                             links.add(new LinkDTO(nNodeDTO.getName(), eNodeDTO.getName(), ""));

+ 22 - 7
src/main/java/com/qizhen/healsphere/repository/neo4j/BaseNodeRepository.java

@@ -1,14 +1,15 @@
 package com.qizhen.healsphere.repository.neo4j;
 
 import com.qizhen.healsphere.config.Neo4jUtil;
-import org.neo4j.driver.v1.Record;
-import org.neo4j.driver.v1.Session;
-import org.neo4j.driver.v1.StatementResult;
-import org.neo4j.driver.v1.Values;
+import org.neo4j.driver.v1.*;
 import org.neo4j.driver.v1.types.Node;
 import org.springframework.stereotype.Repository;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 @Repository
 public class BaseNodeRepository {
@@ -36,6 +37,22 @@ public class BaseNodeRepository {
 
     }
 
+    public List<String> findNodeByNameLike(String label,String name) {
+        String query = String.format("MATCH (n:`%s`) WHERE n.name contains $name and n.is_deleted = 'N' return distinct n.name limit 20", label);
+        try(Session session = Neo4jUtil.getSession()) {
+            StatementResult result = session.run(query,Values.parameters("name", name));
+            List<String> names = new ArrayList<>();
+            if(result.hasNext()) {
+                List<Record> records = result.list();
+                for (Record record : records) {
+                    names.addAll(record.values().stream().map(Value::asString).collect(Collectors.toList()));
+                }
+            }
+            return names;
+        }
+
+    }
+
     /**
      * 根据id查询实体属性
      * @param id
@@ -84,7 +101,6 @@ public class BaseNodeRepository {
             return listMap;
 
         }
-
     }
 
     /**
@@ -115,7 +131,6 @@ public class BaseNodeRepository {
                 map.put("properties", node.asMap());
             }
             return map;
-
         }
     }
 

+ 1 - 1
src/main/java/com/qizhen/healsphere/service/KgService.java

@@ -19,5 +19,5 @@ public interface KgService {
 
     List<GraphDTO> getGraph(KgQuery kgQuery);
 
-    Collection<Map> getGraphNew(KgQuery kgQuery);
+    List<Map<String,Object>> getGraphNew(KgQuery kgQuery);
 }

+ 99 - 19
src/main/java/com/qizhen/healsphere/service/impl/KgServiceImpl.java

@@ -1,12 +1,20 @@
 package com.qizhen.healsphere.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
+import com.qizhen.healsphere.config.Neo4jUtil;
 import com.qizhen.healsphere.service.KgService;
+import com.qizhen.healsphere.web.dto.BaseNodeRSDTO;
 import com.qizhen.healsphere.web.dto.GraphDTO;
+import com.qizhen.healsphere.web.dto.NextNodeDTO;
 import com.qizhen.healsphere.web.param.KgQuery;
-import org.springframework.data.neo4j.repository.query.QueryFragmentsAndParameters;
+import org.neo4j.driver.v1.Record;
+import org.neo4j.driver.v1.Session;
+import org.neo4j.driver.v1.StatementResult;
+import org.neo4j.driver.v1.Values;
+import org.neo4j.driver.v1.types.Node;
 import org.springframework.stereotype.Service;
 
-import java.util.Collection;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -37,32 +45,104 @@ public class KgServiceImpl implements KgService {
         String cypherQuery = "MATCH (n:" + kgQuery.getLabelName() + ")-[r]->(m)\n" +
                 "            where n.name = $inputStr\n" +
                 "            OPTIONAL MATCH p=(m)-[]->(o) where head(Labels(m)) in [\"疾病\",\"症状\",\"药品通用名\",\"手术和操作\",\"实验室检查\",\"辅助检查\"]\n" +
-                "            RETURN head(Labels(n)) as sLabel,n.name as sName,Type (r) as rType, head(Labels(m)) as eLabel,m.name as eName, count(p) as pCount\n" +
+                "            RETURN n,Type (r) as rType, m, count(p) as pCount\n" +
                 "            ORDER BY rType";
-        QueryFragmentsAndParameters parameters = new QueryFragmentsAndParameters(cypherQuery,map);
+
+
+        try(Session session = Neo4jUtil.getSession()) {
+            StatementResult result = session.run(cypherQuery, Values.parameters("inputStr", kgQuery.getInputStr()));
+            List<GraphDTO> graphDTOList = new ArrayList<>();
+
+            Map<String,GraphDTO> graphMap = new HashMap<>();
+            Map<String,List<NextNodeDTO>> rtypeMap = new HashMap<>();
+
+            while (result.hasNext()) {
+                Record record = result.next();
+                Node nodeN = record.get("n").asNode();
+                Node nodeM = record.get("m").asNode();
+                String sLabel = nodeN.labels().iterator().next();
+                String sName = nodeN.asMap().get("name").toString();
+                long sId = nodeN.id();
+                Map<String, Object> sProp = nodeN.asMap();
+
+                String rType = record.get("rType").asString();
+                String eLabel = nodeM.labels().iterator().next();
+                String eName = nodeM.asMap().get("name").toString();
+                long eId = nodeM.id();
+                Map<String, Object> eProp = nodeM.asMap();
+
+                int pCount = record.get("pCount").asInt();
+
+                if (!graphMap.containsKey(sName+"_"+sLabel)) {
+                    GraphDTO graphDTO = new GraphDTO();
+                    graphDTO.setName(sName);
+                    graphDTO.setLabel(sLabel);
+                    graphDTO.setId(sId);
+                    graphDTO.setProperties(sProp);
+                    graphMap.put(sName, graphDTO);
+                }
+                NextNodeDTO nextNodeDTO = new NextNodeDTO();
+                nextNodeDTO.setName(eName);
+                nextNodeDTO.setLabel(eLabel);
+                nextNodeDTO.setPCount(pCount);
+                nextNodeDTO.setId(eId);
+                nextNodeDTO.setProperties(eProp);
+
+                List<NextNodeDTO> nextNodeDTOS = rtypeMap.get(rType);
+                if (CollUtil.isEmpty(nextNodeDTOS)) {
+                    nextNodeDTOS = new ArrayList<>();
+                }
+                nextNodeDTOS.add(nextNodeDTO);
+                rtypeMap.put(rType, nextNodeDTOS);
+            }
+
+            GraphDTO graphDTO = graphMap.values().stream().findFirst().get();
+
+            List<BaseNodeRSDTO> baseNodeRSDTOS = new ArrayList<>();
+            rtypeMap.forEach((key, value) -> {
+                BaseNodeRSDTO nodeRSDTO = new BaseNodeRSDTO();
+                nodeRSDTO.setRType(key);
+                nodeRSDTO.setENodeDTOS(value);
+                baseNodeRSDTOS.add(nodeRSDTO);
+            });
+            graphDTO.setENodeRSDTOS(baseNodeRSDTOS);
+            graphDTOList.add(graphDTO);
+
+            return graphDTOList;
+
+        }
+
+//        QueryFragmentsAndParameters parameters = new QueryFragmentsAndParameters(cypherQuery,map);
+
+
 //        return neo4jTemplate.toExecutableQuery(GraphDTO.class,parameters).getResults();
-        return null;
+//        return null;
     }
 
     @Override
-    public Collection<Map> getGraphNew(KgQuery kgQuery){
-//        String cypherQuery = "MATCH (n:" + kgQuery.getLabelName() + ")-[r]->(m)\n" +
-//                "            where n.name = $inputStr\n" +
-//                "            OPTIONAL MATCH p=(m)-[]->(o) where head(Labels(m)) in [\"疾病\",\"症状\",\"药品通用名\",\"手术和操作\",\"实验室检查\",\"辅助检查\"]\n" +
-//                "            RETURN head(Labels(n)) as sLabel,n.name as sName,Type (r) as rType, head(Labels(m)) as eLabel,m.name as eName, count(p) as pCount\n" +
-//                "            ORDER BY rType";
-//
-//        Collection<Map<String, Object>> mapCollection = neo4jClient.query(cypherQuery).bind(kgQuery.getInputStr()).to("inputStr").fetch().all();
-//        return mapCollection;
-        Map<String,Object> map = new HashMap<>();
-        map.put("inputStr",kgQuery.getInputStr());
+    public List<Map<String,Object>> getGraphNew(KgQuery kgQuery){
         String cypherQuery = "MATCH (n:" + kgQuery.getLabelName() + ")-[r]->(m)\n" +
                 "            where n.name = $inputStr\n" +
                 "            OPTIONAL MATCH p=(m)-[]->(o) where head(Labels(m)) in [\"疾病\",\"症状\",\"药品通用名\",\"手术和操作\",\"实验室检查\",\"辅助检查\"]\n" +
                 "            RETURN head(Labels(n)) as sLabel,n.name as sName,Type (r) as rType, head(Labels(m)) as eLabel,m.name as eName, count(p) as pCount\n" +
                 "            ORDER BY rType";
-        QueryFragmentsAndParameters parameters = new QueryFragmentsAndParameters(cypherQuery,map);
-//        return neo4jTemplate.toExecutableQuery(Map.class,parameters).getResults();
-        return null;
+
+        try(Session session = Neo4jUtil.getSession()) {
+            StatementResult result = session.run(cypherQuery, Values.parameters("inputStr", kgQuery.getInputStr()));
+            List<Map<String,Object>> listMap = new ArrayList<>();
+            if(result.hasNext()) {
+                List<Record> records = result.list();
+                for (Record record : records) {
+//                    Map<String,Object> map = new HashMap<>();
+//                    Node node = record.get("n").asNode();
+//                    map.put("id", node.id());
+//                    map.put("labels", node.labels());
+//                    map.put("properties", node.asMap());
+                    listMap.add(record.asMap());
+                }
+            }
+            return listMap;
+
+        }
     }
 }

+ 8 - 0
src/main/java/com/qizhen/healsphere/web/KgController.java

@@ -1,6 +1,7 @@
 package com.qizhen.healsphere.web;
 
 import com.qizhen.healsphere.web.dto.GraphLabelDTO;
+import com.qizhen.healsphere.web.dto.NodeDTO;
 import com.qizhen.healsphere.web.dto.RespDTO;
 import com.qizhen.healsphere.web.dto.TreeDTO;
 import com.qizhen.healsphere.facade.KgFacade;
@@ -15,6 +16,7 @@ import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
+import java.util.List;
 
 /**
  * @Description: 朗通知识图谱控制层
@@ -54,5 +56,11 @@ public class KgController {
         log.info("获取树形分类缓存成功");
         return RespDTO.onSuc(kgFacade.getTreeFac(kgTree));
     }
+
+    @ApiOperation(value = "查询节点", notes = "查询节点")
+    @PostMapping("/getNode")
+    public RespDTO<List<NodeDTO>> getNode(@RequestBody @Valid KgQuery kgQuery) {
+        return RespDTO.onSuc(kgFacade.getNode(kgQuery));
+    }
 }
 

+ 4 - 0
src/main/java/com/qizhen/healsphere/web/dto/BaseNodeDTO.java

@@ -3,6 +3,8 @@ package com.qizhen.healsphere.web.dto;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.util.Map;
+
 /**
  * @Description:
  * @author: gaodm
@@ -13,4 +15,6 @@ import lombok.Setter;
 public class BaseNodeDTO {
     private String name;
     private String label;
+    private Long id;
+    private Map<String,Object> properties;
 }

+ 6 - 2
src/main/java/com/qizhen/healsphere/web/dto/GNodeDTO.java

@@ -3,6 +3,8 @@ package com.qizhen.healsphere.web.dto;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.util.Map;
+
 /**
  * @Description:
  * @author: gaodm
@@ -14,16 +16,18 @@ public class GNodeDTO {
     private String type;
     private Integer category;
     private String label;
-    private Integer name;
+    private Long name;
     private String symbol;
     private Integer symbolSize;
+    private Map<String, Object> properties;
 
-    public GNodeDTO(String type, Integer category, String label, Integer name, String symbol, Integer symbolSize) {
+    public GNodeDTO(String type, Integer category, String label, Long name, String symbol, Integer symbolSize, Map<String, Object> properties) {
         this.type = type;
         this.category = category;
         this.label = label;
         this.name = name;
         this.symbol = symbol;
         this.symbolSize = symbolSize;
+        this.properties = properties;
     }
 }

+ 3 - 3
src/main/java/com/qizhen/healsphere/web/dto/LinkDTO.java

@@ -11,11 +11,11 @@ import lombok.Setter;
 @Getter
 @Setter
 public class LinkDTO {
-    private Integer source;
-    private Integer target;
+    private Long source;
+    private Long target;
     private String value;
 
-    public LinkDTO(Integer source, Integer target, String value) {
+    public LinkDTO(Long source, Long target, String value) {
         this.source = source;
         this.target = target;
         this.value = value;

+ 15 - 0
src/main/java/com/qizhen/healsphere/web/dto/NodeDTO.java

@@ -0,0 +1,15 @@
+package com.qizhen.healsphere.web.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/3/16 10:11
+ */
+@Getter
+@Setter
+public class NodeDTO {
+    private String name;
+}

+ 12 - 12
src/main/resources/mapper/neo4j/KgMapper.xml

@@ -3,18 +3,18 @@
 <!--        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">-->
 <!--<mapper namespace="com.qizhen.healsphere.repository.mapper.KgMapper">-->
 
-<!--    <resultMap id="GraphResultMap" type="com.qizhen.healsphere.web.dto.GraphDTO">-->
-<!--        <result column="sName" property="name"/>-->
-<!--        <result column="sLabel" property="label"/>-->
-<!--        <collection property="eNodeRSDTOS" ofType="com.qizhen.healsphere.web.dto.BaseNodeRSDTO">-->
-<!--            <result column="rType" property="rType"/>-->
-<!--            <collection property="eNodeDTOS" ofType="com.qizhen.healsphere.web.dto.NextNodeDTO">-->
-<!--                <result column="eName" property="name"/>-->
-<!--                <result column="eLabel" property="label"/>-->
-<!--                <result column="pCount" property="pCount"/>-->
-<!--            </collection>-->
-<!--        </collection>-->
-<!--    </resultMap>-->
+    <resultMap id="GraphResultMap" type="com.qizhen.healsphere.web.dto.GraphDTO">
+        <result column="sName" property="name"/>
+        <result column="sLabel" property="label"/>
+        <collection property="eNodeRSDTOS" ofType="com.qizhen.healsphere.web.dto.BaseNodeRSDTO">
+            <result column="rType" property="rType"/>
+            <collection property="eNodeDTOS" ofType="com.qizhen.healsphere.web.dto.NextNodeDTO">
+                <result column="eName" property="name"/>
+                <result column="eLabel" property="label"/>
+                <result column="pCount" property="pCount"/>
+            </collection>
+        </collection>
+    </resultMap>
 
 <!--    <select id="getGraph" parameterType='com.qizhen.healsphere.web.param.KgQuery' resultMap="GraphResultMap">-->
 <!--        MATCH (n:${labelName})-[r]->(m)-->

+ 13 - 6
src/test/java/com/qizhen/healsphere/KgGraphTests.java

@@ -1,7 +1,9 @@
 package com.qizhen.healsphere;
 
 import cn.hutool.json.JSONUtil;
+import com.qizhen.healsphere.facade.KgFacade;
 import com.qizhen.healsphere.service.impl.KgServiceImpl;
+import com.qizhen.healsphere.web.dto.NodeDTO;
 import com.qizhen.healsphere.web.param.KgQuery;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -10,8 +12,7 @@ import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.test.context.junit4.SpringRunner;
 
-import java.util.Collection;
-import java.util.Map;
+import java.util.List;
 
 @RunWith(SpringRunner.class)
 @ComponentScan(basePackages = {"com.qizhen.healsphere.model","com.qizhen.healsphere.repository"})
@@ -20,6 +21,9 @@ public class KgGraphTests {
     @Autowired
     KgServiceImpl kgServiceImpl;
 
+    @Autowired
+    KgFacade kgFacade;
+
 
     @Test
     public void contextLoads() {}
@@ -29,12 +33,15 @@ public class KgGraphTests {
 
         KgQuery kq = new KgQuery();
         kq.setLabelName("疾病");
-        kq.setInputStr("急性胰腺炎");
-        Collection<Map> graph = kgServiceImpl.getGraphNew(kq);
-        System.out.println(JSONUtil.toJsonStr(graph));
+        kq.setInputStr("急性");
+//        List<Map<String,Object>> graph = kgServiceImpl.getGraphNew(kq);
+//        System.out.println(JSONUtil.toJsonStr(graph));
 //        List<GraphDTO> graph = kgServiceImpl.getGraph(kq);
 //        System.out.println(JSONUtil.toJsonStr(graph));
-
+//        GraphLabelDTO graphFac = kgFacade.getGraphFac(kq);
+//        System.out.println(JSONUtil.toJsonStr(graphFac));
+        List<NodeDTO> node = kgFacade.getNode(kq);
+        System.out.println(JSONUtil.toJsonStr(node));
 //        String uri = "bolt://173.18.12.194:7687";
 //        String user = "neo4j";
 //        String password = "12345678";