From d060dc914f2dff0a822e3e0166a15af0f4027c76 Mon Sep 17 00:00:00 2001 From: "DESKTOP-DDTUS3E\\yaxin" Date: Wed, 13 Nov 2024 15:12:44 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A0=B9=E6=8D=AEcaseId=E6=9F=A5=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E7=B1=BB=E5=9E=8B=EF=BC=8C=E5=85=B3=E7=B3=BB=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E9=9B=86=E5=90=88=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/supervision/config/Neo4jConfig.java | 2 +- .../neo4j/controller/Neo4jController.java | 4 + .../neo4j/service/Neo4jService.java | 2 + .../neo4j/service/impl/Neo4jServiceImpl.java | 148 +++++++++++------- 4 files changed, 98 insertions(+), 58 deletions(-) diff --git a/src/main/java/com/supervision/config/Neo4jConfig.java b/src/main/java/com/supervision/config/Neo4jConfig.java index 2c67682..f7d4eff 100644 --- a/src/main/java/com/supervision/config/Neo4jConfig.java +++ b/src/main/java/com/supervision/config/Neo4jConfig.java @@ -23,7 +23,7 @@ public class Neo4jConfig { // 这里可以添加额外的配置,比如加密、连接池设置等 Config config = Config.builder() // 示例:关闭加密(注意:在生产环境中应该启用加密) - .withoutEncryption() +// .withoutEncryption() // 你可以在这里添加更多的配置选项 .build(); diff --git a/src/main/java/com/supervision/neo4j/controller/Neo4jController.java b/src/main/java/com/supervision/neo4j/controller/Neo4jController.java index 338bcdf..1df32f4 100644 --- a/src/main/java/com/supervision/neo4j/controller/Neo4jController.java +++ b/src/main/java/com/supervision/neo4j/controller/Neo4jController.java @@ -89,6 +89,10 @@ public class Neo4jController { public R getNode(@RequestParam String picType, @RequestParam String caseId) { return neo4jService.getNode(picType, caseId); } + @GetMapping("/getNodeAndRelationListByCaseId") + public R getNodeAndRelationListByCaseId(@RequestParam String picType, @RequestParam String caseId) { + return neo4jService.getNodeAndRelationListByCaseId(picType, caseId); + } // @GetMapping("/test") // public R test() { diff --git a/src/main/java/com/supervision/neo4j/service/Neo4jService.java b/src/main/java/com/supervision/neo4j/service/Neo4jService.java index 77fa0c6..2d59b14 100644 --- a/src/main/java/com/supervision/neo4j/service/Neo4jService.java +++ b/src/main/java/com/supervision/neo4j/service/Neo4jService.java @@ -35,6 +35,8 @@ public interface Neo4jService { R getNode(String picType, String caseId); + R getNodeAndRelationListByCaseId(String picType, String caseId); + // R test(); void deleteAbstractGraph(); diff --git a/src/main/java/com/supervision/neo4j/service/impl/Neo4jServiceImpl.java b/src/main/java/com/supervision/neo4j/service/impl/Neo4jServiceImpl.java index 74a649b..e360c0d 100644 --- a/src/main/java/com/supervision/neo4j/service/impl/Neo4jServiceImpl.java +++ b/src/main/java/com/supervision/neo4j/service/impl/Neo4jServiceImpl.java @@ -12,8 +12,8 @@ import com.supervision.neo4j.service.Neo4jService; import com.supervision.neo4j.utils.Neo4jUtils; import lombok.Data; import lombok.extern.slf4j.Slf4j; -import org.neo4j.driver.*; import org.neo4j.driver.Record; +import org.neo4j.driver.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -106,7 +106,7 @@ public class Neo4jServiceImpl implements Neo4jService { try { Session session = driver.session(); StringBuffer cql = new StringBuffer(); - cql.append("MATCH (n) WHERE n.id = " ).append(id).append(" AND NOT (n)--() DELETE n"); + cql.append("MATCH (n) WHERE n.id = ").append(id).append(" AND NOT (n)--() DELETE n"); log.info(cql.toString()); Result run = session.run(cql.toString()); while (run.hasNext()) { @@ -144,9 +144,7 @@ public class Neo4jServiceImpl implements Neo4jService { CaseNode node = null; try { Session session = driver.session(); - StringBuffer cql = new StringBuffer(); - cql.append("MATCH (n) where id(n) = ").append(id).append(Neo4jUtils.NODE_RETURN); - Result run = session.run(cql.toString()); + Result run = session.run("MATCH (n) where id(n) = " + id + Neo4jUtils.NODE_RETURN); node = Neo4jUtils.getOneNode(run); } catch (Exception e) { e.printStackTrace(); @@ -234,14 +232,13 @@ public class Neo4jServiceImpl implements Neo4jService { public Rel findRelation(Rel rel) { try { Session session = driver.session(); - StringBuffer cql = new StringBuffer(); Map params = new HashMap<>(); - cql.append("MATCH (a)-[rel:").append(rel.getName()).append("]->(b) where id(a) = $sourceId and id(b) = $targetId") - .append(Neo4jUtils.REL_RETURN); + String cql = "MATCH (a)-[rel:" + rel.getName() + "]->(b) where id(a) = $sourceId and id(b) = $targetId" + + Neo4jUtils.REL_RETURN; params.put("sourceId", rel.getSourceId()); params.put("targetId", rel.getTargetId()); - Result run = session.run(cql.toString(), params); + Result run = session.run(cql, params); rel = Neo4jUtils.getOneRel(run); } catch (Exception e) { e.printStackTrace(); @@ -258,14 +255,13 @@ public class Neo4jServiceImpl implements Neo4jService { Rel res = null; try { Session session = driver.session(); - StringBuffer cql = new StringBuffer(); Map params = new HashMap<>(); - cql.append("MATCH (a), (b) where id(a) = $sourceId and id(b) = $targetId CREATE(a)-[rel:").append(rel.getName()) - .append("]->(b) ").append(Neo4jUtils.REL_RETURN); + String cql = "MATCH (a), (b) where id(a) = $sourceId and id(b) = $targetId CREATE(a)-[rel:" + rel.getName() + + "]->(b) " + Neo4jUtils.REL_RETURN; params.put("sourceId", rel.getSourceId()); params.put("targetId", rel.getTargetId()); - Result run = session.run(cql.toString(), params); + Result run = session.run(cql, params); rel = Neo4jUtils.getOneRel(run); } catch (Exception e) { e.printStackTrace(); @@ -312,7 +308,7 @@ public class Neo4jServiceImpl implements Neo4jService { // 节点和关系合并 Map nodeRecordMap = electNodeRecord(nodes); - list = mergerWebRel(list,nodeRecordMap); + list = mergerWebRel(list, nodeRecordMap); nodes = mergeNode(nodes, nodeRecordMap); map.put("list", list); @@ -320,6 +316,40 @@ public class Neo4jServiceImpl implements Neo4jService { return R.ok(map); } + @Override + public R getNodeAndRelationListByCaseId(String picType, String caseId) { + Map> map = new HashMap<>(); + Set nodeLabels = new HashSet<>(); + Set relTypes = new HashSet<>(); + try (Session session = driver.session()) { + // 查询所有匹配caseId的节点及其关联关系 + String query = "MATCH (n)-[r]->(m) WHERE n.caseId = $caseId AND m.caseId = $caseId RETURN labels(n) as sourceLabels, type(r) as relName, labels(m) as targetLabels"; + session.executeRead(tx -> { + Result result = tx.run(query, Values.parameters("caseId", caseId)); + while (result.hasNext()) { + Record record = result.next(); + List sourceLabels = record.get("sourceLabels").asList(Value::asString); + List targetLabels = record.get("targetLabels").asList(Value::asString); + if (!sourceLabels.isEmpty()) { + nodeLabels.add(sourceLabels.get(0)); + } + if (!targetLabels.isEmpty()) { + nodeLabels.add(targetLabels.get(0)); + } + relTypes.add(record.get("relName").asString()); + } + return null; + }); + } catch (Exception e) { + log.error("查询失败", e); + } + log.info("查询到的节点类型{}个:{}", nodeLabels.size(), nodeLabels); + log.info("查询到的关系类型{}个:{}", relTypes.size(), relTypes); + map.put("nodeLabels", nodeLabels); + map.put("relTypes", relTypes); + return R.ok(map); + } + record NodeMapRecord(String name, String id, Set idSet) { } @@ -327,59 +357,63 @@ public class Neo4jServiceImpl implements Neo4jService { /** * 推选出代表节点信息 + * * @param nodes key: name ,entityName,id 节点信息 * @return */ - private Map electNodeRecord(List> nodes){ + private Map electNodeRecord(List> nodes) { Map nodeRecordMap = new HashMap<>(); for (Map node : nodes) { String name = node.get("name"); String id = node.get("id"); NodeMapRecord nodeMapRecord = nodeRecordMap.get(name); - if (nodeMapRecord == null){ + if (nodeMapRecord == null) { Set idSet = new HashSet<>(); idSet.add(id); - nodeRecordMap.put(name, new NodeMapRecord(name, id,idSet)); - }else { + nodeRecordMap.put(name, new NodeMapRecord(name, id, idSet)); + } else { nodeMapRecord.idSet.add(id); } } return nodeRecordMap; } + /** - *合并节点信息 + * 合并节点信息 * 合并依据: - * name为唯一标识 - * @param nodes key: name ,entityName,id + * name为唯一标识 + * + * @param nodes key: name ,entityName,id * @param nodeRecordMap 代表节点信息 * @return */ - private List> mergeNode(List> nodes,Map nodeRecordMap) { + private List> mergeNode(List> nodes, Map nodeRecordMap) { return nodes.stream().map(map -> { - Map nodeMap = new HashMap<>(); - nodeMap.put("name", map.get("name")); - nodeMap.put("entityName", map.get("entityName")); - - NodeMapRecord nodeMapRecord = nodeRecordMap.get(map.get("name")); - if (null == nodeMapRecord) { - log.warn("mergeNode:节点信息异常,nodeRecordMap中不存在节点名称为:{}的NodeMapRecord", map.get("name")); - return nodeMap; - } - if (!nodeMapRecord.idSet.contains(map.get("id"))) { - log.warn("mergeNode:节点信息异常,nodeMapRecord.idSet中不包含节点id:{},节点名称为:{}", map.get("id"), map.get("name")); - return nodeMap; - } - nodeMap.put("id", nodeMapRecord.id); - return nodeMap; - }).filter(map -> StrUtil.isNotEmpty(map.get("id"))) - .filter(distinctPredicate(m->m.get("id"))).collect(Collectors.toList()); + Map nodeMap = new HashMap<>(); + nodeMap.put("name", map.get("name")); + nodeMap.put("entityName", map.get("entityName")); + + NodeMapRecord nodeMapRecord = nodeRecordMap.get(map.get("name")); + if (null == nodeMapRecord) { + log.warn("mergeNode:节点信息异常,nodeRecordMap中不存在节点名称为:{}的NodeMapRecord", map.get("name")); + return nodeMap; + } + if (!nodeMapRecord.idSet.contains(map.get("id"))) { + log.warn("mergeNode:节点信息异常,nodeMapRecord.idSet中不包含节点id:{},节点名称为:{}", map.get("id"), map.get("name")); + return nodeMap; + } + nodeMap.put("id", nodeMapRecord.id); + return nodeMap; + }).filter(map -> StrUtil.isNotEmpty(map.get("id"))) + .filter(distinctPredicate(m -> m.get("id"))).collect(Collectors.toList()); } /** * 合并关系信息 + * * @param webRelDTOList 关系信息 - * @param nodeRecordMap 代表节点信息 + * @param nodeRecordMap 代表节点信息 * @return */ private List mergerWebRel(List webRelDTOList, Map nodeRecordMap) { @@ -387,31 +421,31 @@ public class Neo4jServiceImpl implements Neo4jService { Map idNodeRecordMap = nodeRecordMap.entrySet().stream() .collect(Collectors.toMap(entry -> entry.getValue().id, Map.Entry::getValue)); - return webRelDTOList.stream().map(webRelDTO -> { - String target = webRelDTO.getTarget(); - String source = webRelDTO.getSource(); - String name = webRelDTO.getName(); + return webRelDTOList.stream().map(webRelDTO -> { + String target = webRelDTO.getTarget(); + String source = webRelDTO.getSource(); + String name = webRelDTO.getName(); - String sourceNew = idNodeRecordMap.entrySet().stream() - .filter(entry -> entry.getValue().idSet.contains(source)) - .findAny().map(Map.Entry::getKey).orElse(""); + String sourceNew = idNodeRecordMap.entrySet().stream() + .filter(entry -> entry.getValue().idSet.contains(source)) + .findAny().map(Map.Entry::getKey).orElse(""); - String targetNew = idNodeRecordMap.entrySet().stream() - .filter(entry -> entry.getValue().idSet.contains(target)) - .findAny().map(Map.Entry::getKey).orElse(""); + String targetNew = idNodeRecordMap.entrySet().stream() + .filter(entry -> entry.getValue().idSet.contains(target)) + .findAny().map(Map.Entry::getKey).orElse(""); - if (StrUtil.isEmpty(sourceNew) || StrUtil.isEmpty(targetNew)){ - log.warn("mergerWebRel:关系信息异常,nodeRecordMap中不存在节点id:{}或节点id:{}信息,节点名称为:{}", source, target, name); - } + if (StrUtil.isEmpty(sourceNew) || StrUtil.isEmpty(targetNew)) { + log.warn("mergerWebRel:关系信息异常,nodeRecordMap中不存在节点id:{}或节点id:{}信息,节点名称为:{}", source, target, name); + } - return new WebRelDTO(sourceNew, targetNew, name); - }).filter(webRelDTO -> StrUtil.isNotEmpty(webRelDTO.getSource()) && StrUtil.isNotEmpty(webRelDTO.getTarget())) + return new WebRelDTO(sourceNew, targetNew, name); + }).filter(webRelDTO -> StrUtil.isNotEmpty(webRelDTO.getSource()) && StrUtil.isNotEmpty(webRelDTO.getTarget())) .filter(distinctPredicate(rel -> rel.getSource() + rel.getTarget())).toList(); } - private Predicate distinctPredicate(Function function){ + private Predicate distinctPredicate(Function function) { ConcurrentHashMap map = new ConcurrentHashMap<>(); - return (t)-> null == map.putIfAbsent(function.apply(t),true); + return (t) -> null == map.putIfAbsent(function.apply(t), true); }