|
@@ -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;
|
|
|
+
|
|
|
+ }
|
|
|
}
|
|
|
}
|