فهرست منبع

实体合并接口修改

yuchengwei 5 ماه پیش
والد
کامیت
c12a8b19a7

+ 24 - 19
src/main/java/com/qizhen/healsphere/repository/neo4j/BaseNodeRepository.java

@@ -186,30 +186,35 @@ public class BaseNodeRepository {
 
     /**
      * 实体合并
-     * @param label
-     * @param properties
-     * @return 实体map
      */
-    public Map<String, Object> mergeNode(String label, Map<String, Object> properties) {
-        StringBuilder createClause = new StringBuilder();
-        if (CollUtil.isEmpty(properties)) {
-            properties = new HashMap<>();
-        }
-        properties.put("is_deleted","N");
-        properties.forEach((key, value) -> createClause.append(key).append(": '").append(value).append("'").append(", "));
-
-        // 移除最后的逗号
-        if (createClause.length() > 0) {
-            createClause.setLength(createClause.length() - 2);
-        }
-
-        String query = String.format("MERGE (n:`%s` { %s }) RETURN n", label, createClause);
+    public Map<String, Object> mergeNode(String firstLabel,Long firstId,String secondLabel,Long secondId,String newName,String newLabel) {
+
+        String query = String.format("MATCH (a:`%s`), (b:`%s`)\n" +
+                "WHERE id(a) = $firstId AND id(b) = $secondId\n" +
+                "// 创建一个新的节点 MergedNode 并合并属性\n" +
+                "MERGE (m:`%s` {name: $newName})\n" +
+                "// 合并节点 A 和节点 B 的所有关系到新的节点\n" +
+                "// 从 A 到其他节点的关系\n" +
+                "WITH a, b, m\n" +
+                "MATCH (a)-[rA]->(target)\n" +
+                "MERGE (m)-[rAMerged]->(target)\n" +
+                "SET rAMerged = rA\n" +
+                "\n" +
+                "// 从 B 到其他节点的关系\n" +
+                "MATCH (b)-[rB]->(target2)\n" +
+                "MERGE (m)-[rBMerged]->(target2)\n" +
+                "SET rBMerged = rB\n" +
+                "\n" +
+                "// 删除原有的两个节点\n" +
+                "WITH m, a, b\n" +
+                "DETACH DELETE a, b\n" +
+                "RETURN m\n", firstLabel, secondLabel, newLabel);
 
         try(Session session = neo4jUtil.getSession()) {
-            StatementResult result = session.run(query);
+            StatementResult result = session.run(query,Values.parameters("firstId", firstId,"secondId", secondId,"newName",newName));
             Map<String,Object> map = new HashMap<>();
             if(result.hasNext()) {
-                Node node = result.single().get("n").asNode();
+                Node node = result.single().get("m").asNode();
                 map.put("id", node.id());
                 map.put("labels", node.labels());
                 map.put("properties", node.asMap());

+ 3 - 0
src/main/java/com/qizhen/healsphere/service/EntityService.java

@@ -3,6 +3,7 @@ package com.qizhen.healsphere.service;
 import com.qizhen.healsphere.repository.neo4j.entity.BaseEntity;
 import com.qizhen.healsphere.web.vo.CreateEntityVO;
 import com.qizhen.healsphere.web.vo.EntityVO;
+import com.qizhen.healsphere.web.vo.MergeEntityVO;
 import com.qizhen.healsphere.web.vo.UpdateEntityVO;
 import org.springframework.web.bind.annotation.RequestBody;
 
@@ -24,4 +25,6 @@ public interface EntityService {
     BaseEntity findNodeByName(String label, String name);
 
     BaseEntity create(CreateEntityVO createEntity);
+
+    Map<String, Object> mergeEntity(MergeEntityVO mergeEntity);
 }

+ 7 - 0
src/main/java/com/qizhen/healsphere/service/impl/EntityServiceImpl.java

@@ -5,6 +5,7 @@ import com.qizhen.healsphere.repository.neo4j.entity.BaseEntity;
 import com.qizhen.healsphere.service.EntityService;
 import com.qizhen.healsphere.web.vo.CreateEntityVO;
 import com.qizhen.healsphere.web.vo.EntityVO;
+import com.qizhen.healsphere.web.vo.MergeEntityVO;
 import com.qizhen.healsphere.web.vo.UpdateEntityVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -110,4 +111,10 @@ public class EntityServiceImpl implements EntityService {
         entityVO.setLabel(createEntity.getLabel());
         return nodeRepository.create(entityVO.getLabel(), entityVO.getProperty());
     }
+
+    @Override
+    public Map<String, Object> mergeEntity(MergeEntityVO mergeEntity) {
+//        nodeRepository.mergeNode(mergeEntity)
+        return null;
+    }
 }

+ 10 - 0
src/main/java/com/qizhen/healsphere/web/EntityController.java

@@ -76,4 +76,14 @@ public class EntityController {
         Map<String, Object> entity = entityService.findEntityById(id);
         return RespDTO.onSuc(entity);
     }
+
+    @ApiOperation(value = "实体合并",
+            notes = "")
+    @RequestMapping(value = "/mergeEntity",method = RequestMethod.POST)
+    @ResponseBody
+    public RespDTO<Map<String, Object>> mergeEntity(@RequestBody Long id) {
+
+        Map<String, Object> entity = entityService.findEntityById(id);
+        return RespDTO.onSuc(entity);
+    }
 }

+ 18 - 0
src/main/java/com/qizhen/healsphere/web/vo/MergeEntityVO.java

@@ -0,0 +1,18 @@
+package com.qizhen.healsphere.web.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Map;
+
+@Getter
+@Setter
+public class MergeEntityVO {
+    private Long firstId;
+    private String firstLabel;
+    private Long secondId;
+    private String secondLabel;
+    private String newName;
+    private String newLabel;
+    private Map<String,Object> newType;
+}