From 9a9ef1d24b4db93ea78a5b833a5a2803b7b175ed Mon Sep 17 00:00:00 2001
From: liu <liujiatong112@163.com>
Date: Thu, 1 Aug 2024 17:00:26 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=8F=90=E4=BA=A4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../neo4j/controller/Neo4jController.java     |  5 +-
 .../neo4j/service/Neo4jService.java           |  7 ++-
 .../neo4j/service/impl/Neo4jServiceImpl.java  | 22 ++++++++-
 .../supervision/police/domain/TripleInfo.java |  5 ++
 .../impl/ModelRecordTypeServiceImpl.java      | 46 ++++++++++++++++++-
 .../police/service/impl/ModelServiceImpl.java | 23 ++++++----
 6 files changed, 92 insertions(+), 16 deletions(-)

diff --git a/src/main/java/com/supervision/neo4j/controller/Neo4jController.java b/src/main/java/com/supervision/neo4j/controller/Neo4jController.java
index e7ca8e2..338bcdf 100644
--- a/src/main/java/com/supervision/neo4j/controller/Neo4jController.java
+++ b/src/main/java/com/supervision/neo4j/controller/Neo4jController.java
@@ -1,5 +1,6 @@
 package com.supervision.neo4j.controller;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.supervision.common.domain.R;
 import com.supervision.neo4j.domain.CaseNode;
 import com.supervision.neo4j.domain.Rel;
@@ -78,8 +79,8 @@ public class Neo4jController {
 
     @PostMapping("/saveRelation")
     public R<?> saveRelation(@RequestBody Rel rel) {
-        Boolean result = neo4jService.saveRelation(rel);
-        return R.judgeResult(result, null, "保存失败");
+        Rel rel1 = neo4jService.saveRelation(rel);
+        return R.judgeResult(ObjectUtil.isNotEmpty(rel1), null, "保存失败");
     }
 
     /*************************************************************************************/
diff --git a/src/main/java/com/supervision/neo4j/service/Neo4jService.java b/src/main/java/com/supervision/neo4j/service/Neo4jService.java
index e1e8f15..77fa0c6 100644
--- a/src/main/java/com/supervision/neo4j/service/Neo4jService.java
+++ b/src/main/java/com/supervision/neo4j/service/Neo4jService.java
@@ -16,6 +16,11 @@ public interface Neo4jService {
 
     void delNode(Long id);
 
+    /**
+     * 移除不具备任何连接关系的节点
+     */
+    void deleteNoRelationNode(Long id);
+
     void deleteRel(Long relId);
 
     CaseNode findById(Long id);
@@ -26,7 +31,7 @@ public interface Neo4jService {
 
     Rel findRelation(Rel rel);
 
-    Boolean saveRelation(Rel rel);
+    Rel saveRelation(Rel rel);
 
     R<?> getNode(String picType, String caseId);
 
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 3a7e0a3..873f50e 100644
--- a/src/main/java/com/supervision/neo4j/service/impl/Neo4jServiceImpl.java
+++ b/src/main/java/com/supervision/neo4j/service/impl/Neo4jServiceImpl.java
@@ -1,6 +1,7 @@
 package com.supervision.neo4j.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.poi.excel.ExcelReader;
 import cn.hutool.poi.excel.ExcelUtil;
 import com.supervision.common.domain.R;
@@ -98,6 +99,23 @@ public class Neo4jServiceImpl implements Neo4jService {
         }
     }
 
+    @Override
+    public void deleteNoRelationNode(Long id) {
+        try {
+            Session session = driver.session();
+            StringBuffer cql = new StringBuffer();
+            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()) {
+                Record next = run.next();
+                // log.info(next.toString());
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+    }
+
     /**
      * 删除边
      *
@@ -234,7 +252,7 @@ public class Neo4jServiceImpl implements Neo4jService {
     }
 
     @Override
-    public Boolean saveRelation(Rel rel) {
+    public Rel saveRelation(Rel rel) {
         Rel res = null;
         try {
             Session session = driver.session();
@@ -250,7 +268,7 @@ public class Neo4jServiceImpl implements Neo4jService {
         } catch (Exception e) {
             e.printStackTrace();
         }
-        return rel != null;
+        return rel;
     }
 
     @Override
diff --git a/src/main/java/com/supervision/police/domain/TripleInfo.java b/src/main/java/com/supervision/police/domain/TripleInfo.java
index 1da778e..919d162 100644
--- a/src/main/java/com/supervision/police/domain/TripleInfo.java
+++ b/src/main/java/com/supervision/police/domain/TripleInfo.java
@@ -71,6 +71,11 @@ public class TripleInfo implements Serializable {
      */
     private Long startNodeGraphId;
 
+    /**
+     * 关系ID(neo4j关系id)
+     */
+    private Long relGraphId;
+
     /**
      * neo4j结束节点的ID
      */
diff --git a/src/main/java/com/supervision/police/service/impl/ModelRecordTypeServiceImpl.java b/src/main/java/com/supervision/police/service/impl/ModelRecordTypeServiceImpl.java
index cd276fb..6f3a513 100644
--- a/src/main/java/com/supervision/police/service/impl/ModelRecordTypeServiceImpl.java
+++ b/src/main/java/com/supervision/police/service/impl/ModelRecordTypeServiceImpl.java
@@ -1,6 +1,7 @@
 package com.supervision.police.service.impl;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.druid.util.StringUtils;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
@@ -431,20 +432,61 @@ public class ModelRecordTypeServiceImpl extends ServiceImpl<ModelRecordTypeMappe
                 Rel rel = new Rel(startNode.getId(), tripleInfo.getRelation(), endNode.getId());
                 Rel relation = neo4jService.findRelation(rel);
                 if (relation == null) {
-                    neo4jService.saveRelation(rel);
+                    relation = neo4jService.saveRelation(rel);
                 }
                 tripleInfo.setAddNeo4j("1");
                 tripleInfo.setStartNodeGraphId(startNode.getId());
+                tripleInfo.setRelGraphId(relation.getId());
                 tripleInfo.setEndNodeGraphId(endNode.getId());
                 boolean updateResult = tripleInfoService.updateById(tripleInfo);
                 if (updateResult) {
                     i++;
                 }
-                // TODO 重复添加的OK了,删除的呢?
             } catch (Exception e) {
                 log.error(e.getMessage(), e);
             }
         }
+        // 删除的要进行移除
+        Optional<TripleInfo> any = tripleInfos.stream().findAny();
+        if (any.isPresent()) {
+            TripleInfo anyTripleInfo = any.get();
+            String recordId = anyTripleInfo.getRecordId();
+            List<TripleInfo> existNeoList = tripleInfoService.lambdaQuery().eq(TripleInfo::getRecordId, recordId).eq(TripleInfo::getAddNeo4j, "1").list();
+            Map<String, TripleInfo> existNeoMap = existNeoList.stream().collect(Collectors.toMap(TripleInfo::getId, Function.identity()));
+            // 去掉已经添加的
+            Set<String> existNeoIdSet = existNeoMap.keySet();
+            ids.forEach(existNeoIdSet::remove);
+            // 剩下的就是需要删除的
+            for (String needDeleteId : existNeoIdSet) {
+                TripleInfo tripleInfo = existNeoMap.get(needDeleteId);
+                if (ObjectUtil.isNotEmpty(tripleInfo.getRelGraphId())) {
+                    // 先移除关系
+                    neo4jService.deleteRel(tripleInfo.getRelGraphId());
+                } else {
+                    break;
+                }
+                if (ObjectUtil.isNotEmpty(tripleInfo.getStartNodeGraphId())) {
+                    // 再移除尾节点
+                    neo4jService.delNode(tripleInfo.getEndNodeGraphId());
+                } else {
+                    break;
+                }
+                if (ObjectUtil.isNotEmpty(tripleInfo.getEndNodeGraphId())) {
+                    // 尝试删除头节点(只有头节点不存在任何关系的时候才进行删除)
+                    neo4jService.deleteNoRelationNode(tripleInfo.getStartNodeGraphId());
+                } else {
+                    break;
+                }
+                // 更新状态
+                tripleInfoService.lambdaUpdate().set(TripleInfo::getAddNeo4j, "0")
+                        .set(TripleInfo::getEndNodeGraphId, null)
+                        .set(TripleInfo::getRelGraphId, null)
+                        .set(TripleInfo::getStartNodeGraphId, null)
+                        .eq(TripleInfo::getId, needDeleteId).update();
+            }
+
+        }
+
         return ("成功插入" + i + "条信息");
     }
 }
diff --git a/src/main/java/com/supervision/police/service/impl/ModelServiceImpl.java b/src/main/java/com/supervision/police/service/impl/ModelServiceImpl.java
index 27c14e2..16b6a48 100644
--- a/src/main/java/com/supervision/police/service/impl/ModelServiceImpl.java
+++ b/src/main/java/com/supervision/police/service/impl/ModelServiceImpl.java
@@ -308,6 +308,8 @@ public class ModelServiceImpl implements ModelService {
         if (ql.contains("$lawParty") && split.length > 1) {
             i = split.length;
         }
+        // 只有有符合的,就认为符合,不进行遍历了
+        judge:
         for (int j = 0; j < i; j++) {
             if (split.length > 0) {
                 params.put("lawParty", split[j]);
@@ -324,15 +326,18 @@ public class ModelServiceImpl implements ModelService {
             if (res.isEmpty()) {
                 result.setAtomicResult("-1");
             } else {
-                ResultDTO resultDTO = res.get(0);
-                if (StringUtils.isNotEmpty(resultDTO.getRelId())) {
-                    //存在关系
-                    result.setAtomicResult("1");
-                    result.setRecordSplitId(resultDTO.getRecordSplitId());
-                    result.setRecordId(resultDTO.getRecordId());
-                    break;
-                } else {
-                    result.setAtomicResult("0");
+                // 设置为0,不符合
+                result.setAtomicResult("0");
+                // 进行遍历,如果有存在的,就设置为有
+                for (ResultDTO resultDTO : res) {
+                    if (StringUtils.isNotEmpty(resultDTO.getRelId())) {
+                        //存在关系
+                        result.setAtomicResult("1");
+                        result.setRecordSplitId(resultDTO.getRecordSplitId());
+                        result.setRecordId(resultDTO.getRecordId());
+                        // 如果只要存在,就不进行校验了,直接跳出循环
+                        break judge;
+                    }
                 }
             }
         }