diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/KgStatus.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/KgStatus.java new file mode 100644 index 00000000..76a598e7 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/KgStatus.java @@ -0,0 +1,30 @@ +package com.ruoyi.common.core.enums; + +/** + * 用户状态 + * + * @author ruoyi + */ +public enum KgStatus +{ + ONLINE(1, "在线"), OFFLINE(0, "离线"); + + private final Integer code; + private final String info; + + KgStatus(Integer code, String info) + { + this.code = code; + this.info = info; + } + + public Integer getCode() + { + return code; + } + + public String getInfo() + { + return info; + } +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/KgUpdateMethod.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/KgUpdateMethod.java new file mode 100644 index 00000000..07389fcb --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/enums/KgUpdateMethod.java @@ -0,0 +1,30 @@ +package com.ruoyi.common.core.enums; + +/** + * 用户状态 + * + * @author ruoyi + */ +public enum KgUpdateMethod +{ + PENDING_UPDATE(0, "待更新"), INCREMENTAL_UPDATE(1, "增量更新"), FULL_UPDATE(2, "全量更新"); + + private final Integer code; + private final String info; + + KgUpdateMethod(Integer code, String info) + { + this.code = code; + this.info = info; + } + + public Integer getCode() + { + return code; + } + + public String getInfo() + { + return info; + } +} diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/kg/KgInfoController.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/kg/KgInfoController.java index 4bd2fee2..2d102907 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/kg/KgInfoController.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/kg/KgInfoController.java @@ -87,70 +87,4 @@ public class KgInfoController extends BaseController { return R.ok(); } - /** - * 图谱版本列表 - * - * @param kgInfoIdDTO - * @return - */ - @GetMapping("/version/list") - public TableDataInfo versionList(KgInfoIdDTO kgInfoIdDTO) { - startPage(); - List kgInfo = kgInfoService.versionList(kgInfoIdDTO); - return getDataTable(kgInfo); - } - - /** - * 图谱版本导出 - * - * @param response - * @param kgInfoIdDTO - */ - @GetMapping("/version/export") - public void versionExport(HttpServletResponse response, KgInfoIdDTO kgInfoIdDTO) { - KgInfo KgInfo = kgInfoService.getKgInfo(kgInfoIdDTO); - ExcelUtil util = new ExcelUtil(SysDictData.class); - util.exportExcel(response, null, "图谱数据"); - } - - /** - * 图谱版本导入 - * - * @param file - * @param kgId - */ - @PostMapping("/version/upload") - public R uploadCsv(@RequestParam("file") MultipartFile file,@RequestParam("kgId") String kgId) { - if (file == null || file.isEmpty()) { - throw new IllegalArgumentException("文件不能为空"); - } - - if (!file.getOriginalFilename().endsWith(".csv")) { - throw new IllegalArgumentException("仅支持 CSV 文件"); - } - kgInfoService.uploadCsv(file, kgId); - return R.ok(); - } - - - /** - * 图谱版本全量更新 - * - * @param id 版本id - */ - @PostMapping("/version/fullUpdate") - public R fullUpdate(@RequestParam("id") Long id) { - kgInfoService.fullUpdate(id); - return R.ok(); - } - - /** - * 图谱版本增量更新 - * - * @param id - */ - @PostMapping("/version/incrementalUpdate") - public void incrementalUpdate(@RequestParam("id") Long id) { - kgInfoService.incrementalUpdate(id); - } } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/kg/KgVersionController.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/kg/KgVersionController.java new file mode 100644 index 00000000..01468bd0 --- /dev/null +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/kg/KgVersionController.java @@ -0,0 +1,118 @@ +package com.ruoyi.platform.controller.kg; + +import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.utils.poi.ExcelUtil; +import com.ruoyi.common.core.web.controller.BaseController; +import com.ruoyi.common.core.web.page.TableDataInfo; +import com.ruoyi.platform.domain.kg.KgInfo; +import com.ruoyi.platform.domain.kg.KnowledgeGraphVersion; +import com.ruoyi.platform.domain.kg.dto.KgInfoIdDTO; +import com.ruoyi.platform.service.KgVersionService; +import com.ruoyi.system.api.domain.SysDictData; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +/** + * 知识图谱版本管理 + */ +@RestController +@RequestMapping("/kg/version") +public class KgVersionController extends BaseController { + + @Autowired + private KgVersionService kgVersionService; + + /** + * 图谱版本列表 + * + * @param kgInfoIdDTO + * @return + */ + @GetMapping("/list") + public TableDataInfo versionList(KgInfoIdDTO kgInfoIdDTO) { + startPage(); + List kgInfo = kgVersionService.versionList(kgInfoIdDTO); + return getDataTable(kgInfo); + } + + /** + * 图谱版本导出 + * + * @param response + * @param kgInfoIdDTO + */ + @GetMapping("/export") + public void versionExport(HttpServletResponse response, KgInfoIdDTO kgInfoIdDTO) { +// KgInfo KgInfo = kgVersionService.getKgInfo(kgInfoIdDTO); + ExcelUtil util = new ExcelUtil(SysDictData.class); + util.exportExcel(response, null, "图谱数据"); + } + + /** + * 图谱版本导入 + * + * @param file + * @param kgId + */ + @PostMapping("/upload") + public R uploadCsv(@RequestParam("file") MultipartFile file,@RequestParam("kgId") String kgId) { + if (file == null || file.isEmpty()) { + throw new IllegalArgumentException("文件不能为空"); + } + + if (!file.getOriginalFilename().endsWith(".csv")) { + throw new IllegalArgumentException("仅支持 CSV 文件"); + } + kgVersionService.uploadCsv(file, kgId); + return R.ok("操作成功"); + } + + + /** + * 图谱版本全量更新 + * + * @param id 版本id + */ + @PostMapping("/fullUpdate") + public R fullUpdate(@RequestParam("id") Long id) { + kgVersionService.fullUpdate(id); + return R.ok("操作成功"); + } + + /** + * 图谱版本增量更新 + * + * @param id + */ + @PostMapping("/incrementalUpdate") + public R incrementalUpdate(@RequestParam("id") Long id) { + kgVersionService.incrementalUpdate(id); + return R.ok("操作成功"); + } + + /** + * 图谱版本回退 + * + * @param versionId + */ + @PostMapping("/rollback") + public R rollback(@RequestParam("id") Long versionId) { + kgVersionService.rollback(versionId); + return R.ok("操作成功"); + } + + /** + * 图谱版本删除 + * + * @param versionId + */ + @DeleteMapping("/{versionId}") + public R delete(@PathVariable Long versionId) { + kgVersionService.rollback(versionId); + return R.ok("操作成功"); + } +} diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/kg/KnowledgeGraphVersionDao.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/kg/KnowledgeGraphVersionDao.java index 20ffc3a7..1c9fe8bd 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/kg/KnowledgeGraphVersionDao.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/kg/KnowledgeGraphVersionDao.java @@ -92,5 +92,8 @@ public interface KnowledgeGraphVersionDao { int deleteById(Long id); Integer queryMaxVersion(String kgId); + + KnowledgeGraphVersion onlineFind(); + } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/KgInfoService.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/KgInfoService.java index 9742c9c1..c50c4562 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/KgInfoService.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/KgInfoService.java @@ -20,12 +20,4 @@ public interface KgInfoService { KgInfo getKgInfo(KgInfoIdDTO kgInfoIdDTO); void deleteKgInfoById(Long id); - - List versionList(KgInfoIdDTO kgInfoIdDTO); - - void uploadCsv(MultipartFile file,String kgId); - - void fullUpdate(Long id); - - void incrementalUpdate(Long id); } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/KgVersionService.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/KgVersionService.java new file mode 100644 index 00000000..99cb103c --- /dev/null +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/KgVersionService.java @@ -0,0 +1,21 @@ +package com.ruoyi.platform.service; + +import com.ruoyi.platform.domain.kg.KnowledgeGraphVersion; +import com.ruoyi.platform.domain.kg.dto.KgInfoIdDTO; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + + +public interface KgVersionService { + + List versionList(KgInfoIdDTO kgInfoIdDTO); + + void uploadCsv(MultipartFile file,String kgId); + + void fullUpdate(Long id); + + void incrementalUpdate(Long id); + + void rollback(Long versionId); +} diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/KgInfoServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/KgInfoServiceImpl.java index 71ce113c..be31b5bb 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/KgInfoServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/KgInfoServiceImpl.java @@ -1,13 +1,15 @@ package com.ruoyi.platform.service.impl; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.text.csv.*; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSONArray; -import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; +import com.ruoyi.common.core.enums.KgStatus; +import com.ruoyi.common.core.enums.KgUpdateMethod; import com.ruoyi.platform.domain.kg.KgInfo; import com.ruoyi.platform.domain.kg.KgInfoPageVo; import com.ruoyi.platform.domain.kg.KnowledgeGraphVersion; @@ -39,25 +41,6 @@ public class KgInfoServiceImpl implements KgInfoService { @Autowired private KgInfoMapper kgInfoMapper; - @Autowired - private KnowledgeGraphVersionDao knowledgeGraphVersionDao; - - @Autowired - private Neo4jClient neo4jClient; - - @Autowired - private PersonRepository personRepository; - - private static final Logger log = LoggerFactory.getLogger(KgInfoServiceImpl.class); - - // 关系映射配置(可扩展) - private static final Map RELATION_MAPPING = new HashMap<>(); - - static { - RELATION_MAPPING.put("导演", "DIRECTED_BY"); - RELATION_MAPPING.put("主演", "ACTED_IN"); - } - @Override public void insertKgInfo(KgInfo KgInfo) { KgInfo.setVersion("1"); @@ -88,98 +71,4 @@ public class KgInfoServiceImpl implements KgInfoService { kgInfoMapper.deleteByPrimaryKey(id); } - @Override - public List versionList(KgInfoIdDTO kgInfoIdDTO) { - return knowledgeGraphVersionDao.queryAll(kgInfoIdDTO); - } - - @Override - public void uploadCsv(MultipartFile file, String kgId) { - try (InputStreamReader reader = new InputStreamReader(file.getInputStream())) { - // 创建 CsvReader - CsvReader csvReader = CsvUtil.getReader(); - // 读取所有行 - CsvData rows = csvReader.read(reader); - - KnowledgeGraphVersion knowledgeGraphVersion = new KnowledgeGraphVersion(); - knowledgeGraphVersion.setStatus(0); - knowledgeGraphVersion.setKgId(kgId); - knowledgeGraphVersion.setUpdateMethod(0); - knowledgeGraphVersion.setVersion(maxVersion(kgId)); - knowledgeGraphVersion.setName(file.getOriginalFilename()); - knowledgeGraphVersion.setTransactionId(IdUtil.simpleUUID()); - knowledgeGraphVersion.setContent(JSONUtil.toJsonStr(rows.getRows())); - knowledgeGraphVersionDao.insert(knowledgeGraphVersion); - } catch (Exception e) { - log.error("e={}",e.getMessage()); - } - } - - @Override - @Transactional - public void fullUpdate(Long id) { - KnowledgeGraphVersion knowledgeGraphVersion = knowledgeGraphVersionDao.queryById(id); - String transactionId = knowledgeGraphVersion.getTransactionId(); - Integer version = knowledgeGraphVersion.getVersion(); - JSONArray neo4jContents = JSONUtil.parseArray(knowledgeGraphVersion.getContent()); - List objects = neo4jContents.subList(1, neo4jContents.size() - 1); - - // 用于存储已解析的 Person 节点 - Map personMap = new HashMap<>(); - objects.forEach(item->{ - JSONArray lineData = JSONUtil.parseArray(item); - String name = String.valueOf(lineData.get(0)); - String age = String.valueOf((lineData.get(1))); - String relationType = String.valueOf(lineData.get(2)); - String relatedPerson = String.valueOf(lineData.get(3)); - String since = lineData.get(4) != null ? String.valueOf(lineData.get(4)) : "0"; - - // 创建或获取 Person 节点 - Person person = personMap.computeIfAbsent(name, k -> new Person(name, age, new ArrayList<>())); - person.setVersion(version); - person.setTransactionId(transactionId); - - // 如果存在关系,则创建关系 - if (relationType != null && relatedPerson != null ) { - Person related = personMap.computeIfAbsent(relatedPerson, k -> new Person(relatedPerson, "0", new ArrayList<>())); - FriendsWith relation = new FriendsWith(related, since); - related.setTransactionId(transactionId); - related.setVersion(version); - relation.setTransactionId(transactionId); - relation.setVersion(version); - relation.setRelationType(relationType); // 动态设置关系类型 - person.getRelations().add(relation); - } - // 保存 Person 节点 - personRepository.save(person); - }); - - KnowledgeGraphVersion online = new KnowledgeGraphVersion(); - online.setStatus(1); - online.setUpdateMethod(1); - online.setId(id); - knowledgeGraphVersionDao.update(online); - } - - @Override - public void incrementalUpdate(Long id) { - - } - - /** - * 根据名称和事务id生成实体和关系的唯一id - * @param input - * @return - */ - private Long createUUID(String input) { - CRC32 crc32 = new CRC32(); - crc32.update(input.getBytes()); - return crc32.getValue(); - } - - private int maxVersion(String kgId) { - Integer maxVersion =knowledgeGraphVersionDao.queryMaxVersion(kgId); - return ObjectUtil.isNull(maxVersion)?1:++maxVersion; - } - } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/KgVersionServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/KgVersionServiceImpl.java new file mode 100644 index 00000000..e68c2f5b --- /dev/null +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/KgVersionServiceImpl.java @@ -0,0 +1,226 @@ +package com.ruoyi.platform.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.text.csv.CsvData; +import cn.hutool.core.text.csv.CsvReader; +import cn.hutool.core.text.csv.CsvUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONUtil; +import com.ruoyi.common.core.enums.KgStatus; +import com.ruoyi.common.core.enums.KgUpdateMethod; +import com.ruoyi.platform.domain.kg.KnowledgeGraphVersion; +import com.ruoyi.platform.domain.kg.dto.KgInfoIdDTO; +import com.ruoyi.platform.mapper.kg.KnowledgeGraphVersionDao; +import com.ruoyi.platform.service.KgVersionService; +import com.ruoyi.platform.service.kg.FriendsWith; +import com.ruoyi.platform.service.kg.Person; +import com.ruoyi.platform.service.kg.PersonRepository; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.zip.CRC32; + +@Service +public class KgVersionServiceImpl implements KgVersionService { + + @Autowired + private KnowledgeGraphVersionDao knowledgeGraphVersionDao; + + @Autowired + private PersonRepository personRepository; + + private static final Logger log = LoggerFactory.getLogger(KgVersionServiceImpl.class); + + @Override + public List versionList(KgInfoIdDTO kgInfoIdDTO) { + return knowledgeGraphVersionDao.queryAll(kgInfoIdDTO); + } + + @Override + public void uploadCsv(MultipartFile file, String kgId) { + try (InputStreamReader reader = new InputStreamReader(file.getInputStream())) { + // 创建 CsvReader + CsvReader csvReader = CsvUtil.getReader(); + // 读取所有行 + CsvData rows = csvReader.read(reader); + + KnowledgeGraphVersion knowledgeGraphVersion = new KnowledgeGraphVersion(); + knowledgeGraphVersion.setKgId(kgId); + knowledgeGraphVersion.setVersion(maxVersion(kgId)); + knowledgeGraphVersion.setName(file.getOriginalFilename()); + knowledgeGraphVersion.setTransactionId(IdUtil.simpleUUID()); + knowledgeGraphVersion.setStatus(KgStatus.OFFLINE.getCode()); + knowledgeGraphVersion.setContent(JSONUtil.toJsonStr(rows.getRows())); + knowledgeGraphVersion.setUpdateMethod(KgUpdateMethod.PENDING_UPDATE.getCode()); + knowledgeGraphVersionDao.insert(knowledgeGraphVersion); + } catch (Exception e) { + log.error("e={}", e.getMessage()); + } + } + + @Override + @Transactional + public void fullUpdate(Long id) { + KnowledgeGraphVersion knowledgeGraphVersion = knowledgeGraphVersionDao.queryById(id); + String transactionId = knowledgeGraphVersion.getTransactionId(); + Integer version = knowledgeGraphVersion.getVersion(); + JSONArray neo4jContents = JSONUtil.parseArray(knowledgeGraphVersion.getContent()); + if (CollectionUtil.isEmpty(neo4jContents)||neo4jContents.size()<=1){ + return; + } + //去掉表头 + neo4jContents.remove(0); + // 用于存储已解析的 Person 节点 + Map personMap = new HashMap<>(); + neo4jContents.forEach(item -> { + JSONArray lineData = JSONUtil.parseArray(item); + String name = String.valueOf(lineData.get(0)); + String age = String.valueOf((lineData.get(1))); + String relationType = String.valueOf(lineData.get(2)); + String relatedPerson = String.valueOf(lineData.get(3)); + String since = lineData.get(4) != null ? String.valueOf(lineData.get(4)) : "0"; + + // 创建或获取 Person 节点 + Person person = personMap.computeIfAbsent(name, k -> new Person(name, age, new ArrayList<>())); + person.setVersion(version); + person.setTransactionId(transactionId); + + // 如果存在关系,则创建关系 + if (relationType != null && relatedPerson != null) { + Person related = personMap.computeIfAbsent(relatedPerson, k -> new Person(relatedPerson, "0", new ArrayList<>())); + FriendsWith relation = new FriendsWith(related, since); + related.setTransactionId(transactionId); + related.setVersion(version); + relation.setTransactionId(transactionId); + relation.setVersion(version); + relation.setRelationType(relationType); // 动态设置关系类型 + person.getRelations().add(relation); + } + // 保存 Person 节点 + personRepository.save(person); + }); + + KnowledgeGraphVersion online = new KnowledgeGraphVersion(); + online.setStatus(KgStatus.ONLINE.getCode()); + online.setUpdateMethod(KgUpdateMethod.INCREMENTAL_UPDATE.getCode()); + online.setId(id); + knowledgeGraphVersionDao.update(online); + } + + @Override + @Transactional + public void incrementalUpdate(Long id) { + //当前版本 + KnowledgeGraphVersion currentVersion = knowledgeGraphVersionDao.queryById(id); + String transactionId = currentVersion.getTransactionId(); + Integer version = currentVersion.getVersion(); + // 找出在线的版本 + KnowledgeGraphVersion onlineVersion = knowledgeGraphVersionDao.onlineFind(); + if (ObjectUtil.isNotNull(onlineVersion)&&ObjectUtil.isNotEmpty(onlineVersion.getTransactionId()) + &&ObjectUtil.isNotNull(onlineVersion.getVersion())) { +// 存在在线的版本,则取在线版本的version和transactionId + transactionId = onlineVersion.getTransactionId(); + version = onlineVersion.getVersion(); + //当前版本更新方式改为增量更新 + currentVersion.setUpdateMethod(KgUpdateMethod.INCREMENTAL_UPDATE.getCode()); + currentVersion.setVersion(onlineVersion.getVersion()); + knowledgeGraphVersionDao.update(currentVersion); + }else { + //当前版本为在线版本 + currentVersion.setUpdateMethod(KgUpdateMethod.INCREMENTAL_UPDATE.getCode()); + currentVersion.setStatus(KgStatus.ONLINE.getCode()); + knowledgeGraphVersionDao.update(currentVersion); + } + //解析表格数据保存到neo4j + saveToNeo4j(currentVersion.getContent(), version, transactionId); + } + + @Override + @Transactional + public void rollback(Long versionId) { + //在线的版本置为离线 + KnowledgeGraphVersion knowledgeGraphVersion = knowledgeGraphVersionDao.onlineFind(); + knowledgeGraphVersion.setStatus(KgStatus.OFFLINE.getCode()); + knowledgeGraphVersionDao.update(knowledgeGraphVersion); + //该版本置为在线 + KnowledgeGraphVersion onlineVersion = new KnowledgeGraphVersion(); + onlineVersion.setId(versionId); + onlineVersion.setStatus(KgStatus.ONLINE.getCode()); + knowledgeGraphVersionDao.update(knowledgeGraphVersion); + } + + /** + * 解析表格数据保存到neo4j + */ + private void saveToNeo4j(String content,int version,String transactionId) { + JSONArray neo4jContents = JSONUtil.parseArray(content); + if (CollectionUtil.isEmpty(neo4jContents)||neo4jContents.size()<=1){ + return; + } + //去掉表头 + neo4jContents.remove(0); + Map personMap = new HashMap<>(); + // 把当前内容合并到在线版本 + neo4jContents.forEach(item -> { + JSONArray lineData = JSONUtil.parseArray(item); + String name = String.valueOf(lineData.get(0)); + String age = String.valueOf((lineData.get(1))); + String relationType = String.valueOf(lineData.get(2)); + String relatedPerson = String.valueOf(lineData.get(3)); + String since = lineData.get(4) != null ? String.valueOf(lineData.get(4)) : "0"; + + // 创建或获取 Person 节点 + Person person = personMap.computeIfAbsent(name, k -> new Person(name, age, new ArrayList<>())); + person.setVersion(version); + person.setTransactionId(transactionId); + + // 如果存在关系,则创建关系 + if (relationType != null && relatedPerson != null) { + Person related = personMap.computeIfAbsent(relatedPerson, k -> new Person(relatedPerson, "0", new ArrayList<>())); + FriendsWith relation = new FriendsWith(related, since); + related.setTransactionId(transactionId); + related.setVersion(version); + relation.setTransactionId(transactionId); + relation.setVersion(version); + relation.setRelationType(relationType); // 动态设置关系类型 + person.getRelations().add(relation); + } + // 保存 Person 节点 + personRepository.save(person); + }); + } + + /** + * 根据名称和事务id生成实体和关系的唯一id + * + * @param input + * @return + */ + private Long createUUID(String input) { + CRC32 crc32 = new CRC32(); + crc32.update(input.getBytes()); + return crc32.getValue(); + } + + /** + * 下一个升级的版本 + * @param kgId + * @return + */ + private int maxVersion(String kgId) { + Integer maxVersion = knowledgeGraphVersionDao.queryMaxVersion(kgId); + return ObjectUtil.isNull(maxVersion) ? 1 : ++maxVersion; + } + +} diff --git a/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/KnowledgeGraphVersionDao.xml b/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/KnowledgeGraphVersionDao.xml index eb2129fa..131594c6 100644 --- a/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/KnowledgeGraphVersionDao.xml +++ b/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/KnowledgeGraphVersionDao.xml @@ -9,7 +9,7 @@ - + @@ -20,18 +20,20 @@ - - + where id = #{id} select max(version) from knowledge_graph_version where kg_id=#{kgId}; + +