From 791e133780d86d5d86a0ce0921f629606eec4af7 Mon Sep 17 00:00:00 2001 From: xueqingkun Date: Fri, 27 Dec 2024 16:08:48 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E6=B7=BB=E5=8A=A0=E5=8D=95=E4=B8=AA?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=E8=AF=8D=E5=88=86=E6=9E=90=E7=AC=94=E5=BD=95?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/supervision/job/XxlJobTask.java | 27 +++++++- .../neo4j/service/Neo4jService.java | 3 + .../neo4j/service/impl/Neo4jServiceImpl.java | 36 ++++++++++- .../police/service/CasePersonService.java | 3 + .../service/ExtractTripleInfoService.java | 12 ++++ .../service/NoteRecordSplitService.java | 3 + .../police/service/TripleInfoService.java | 12 ++++ .../service/impl/CasePersonServiceImpl.java | 5 ++ .../impl/ExtractTripleInfoServiceImpl.java | 63 ++++++++++++++----- .../impl/ModelRecordTypeServiceImpl.java | 32 +--------- .../impl/NoteRecordSplitServiceImpl.java | 5 ++ .../service/impl/TripleInfoServiceImpl.java | 41 ++++++++++++ 12 files changed, 194 insertions(+), 48 deletions(-) diff --git a/src/main/java/com/supervision/job/XxlJobTask.java b/src/main/java/com/supervision/job/XxlJobTask.java index f807629..bfee574 100644 --- a/src/main/java/com/supervision/job/XxlJobTask.java +++ b/src/main/java/com/supervision/job/XxlJobTask.java @@ -1,17 +1,19 @@ package com.supervision.job; +import cn.hutool.core.collection.CollUtil; import com.alibaba.fastjson.JSON; +import com.supervision.neo4j.service.Neo4jService; import com.supervision.police.domain.NotePrompt; import com.supervision.police.domain.TaskCaseRecord; import com.supervision.police.domain.TaskRecord; +import com.supervision.police.domain.TripleInfo; import com.supervision.police.service.*; import com.xxl.job.core.context.XxlJobHelper; import com.xxl.job.core.handler.annotation.XxlJob; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; - +import java.util.List; import java.util.Map; import static com.supervision.common.constant.NotePromptConstants.TYPE_GRAPH_REASONING; @@ -22,11 +24,22 @@ import static com.supervision.common.constant.TaskRecordConstants.*; @Component @RequiredArgsConstructor public class XxlJobTask { + private final CaseEvidenceService caseEvidenceService; + private final TaskRecordService taskRecordService; - private final TaskCaseRecordService taskCaseRecordService; + private TaskCaseRecordService taskCaseRecordService; + + private final ModelCaseService modelCaseService; + private final NotePromptService notePromptService; + private final ExtractTripleInfoService extractTripleInfoService; + + private final Neo4jService neo4jService; + + private final TripleInfoService tripleInfoService; + /** * 睡觉通知 */ @@ -86,6 +99,14 @@ public class XxlJobTask { } switch (prompt.getType()) { case TYPE_GRAPH_REASONING: + List tripleInfos = extractTripleInfoService.extractTripleInfo(prompt, caseId, map.get("executeId")); + for (TripleInfo tripleInfo : tripleInfos) { + neo4jService.saveTripleInfo(tripleInfo); + } + if (CollUtil.isNotEmpty(tripleInfos)){ + tripleInfoService.updateNeo4jFlag(tripleInfos.stream().map(TripleInfo::getId).toList(), "1"); + } + log.info("【图推理】任务开始。任务ID: 【{}】", taskId); // TODO: 笔录处理 break; diff --git a/src/main/java/com/supervision/neo4j/service/Neo4jService.java b/src/main/java/com/supervision/neo4j/service/Neo4jService.java index 2d0f82a..acc81b4 100644 --- a/src/main/java/com/supervision/neo4j/service/Neo4jService.java +++ b/src/main/java/com/supervision/neo4j/service/Neo4jService.java @@ -5,6 +5,7 @@ import com.supervision.common.domain.R; import com.supervision.neo4j.domain.CaseNode; import com.supervision.neo4j.domain.Rel; import com.supervision.neo4j.dto.WebRelDTO; +import com.supervision.police.domain.TripleInfo; import org.neo4j.driver.Record; import com.supervision.police.vo.GraphReqVO; @@ -67,4 +68,6 @@ public interface Neo4jService { void mockTestGraph(String path, String sheetName, String recordId, String recordSplitId, String caseId); List executeCypher(String cypher, Map parameters); + + TripleInfo saveTripleInfo(TripleInfo tripleInfo); } 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 6145640..f29e7a8 100644 --- a/src/main/java/com/supervision/neo4j/service/impl/Neo4jServiceImpl.java +++ b/src/main/java/com/supervision/neo4j/service/impl/Neo4jServiceImpl.java @@ -10,6 +10,7 @@ import com.supervision.neo4j.domain.Rel; import com.supervision.neo4j.dto.WebRelDTO; import com.supervision.neo4j.service.Neo4jService; import com.supervision.neo4j.utils.Neo4jUtils; +import com.supervision.police.domain.TripleInfo; import com.supervision.police.vo.GraphReqVO; import lombok.Data; import lombok.extern.slf4j.Slf4j; @@ -631,6 +632,39 @@ public class Neo4jServiceImpl implements Neo4jService { @Override public List executeCypher(String cypher, Map parameters) { - return this.driver.session().run(cypher, parameters).list(); + try (Session session = this.driver.session()) { + return session.run(cypher, parameters).list(); + } + } + + @Override + public TripleInfo saveTripleInfo(TripleInfo tripleInfo) { + //开始节点 + String start = tripleInfo.getStartNode(); + // 首先看是否已经存在了,如果已经存在了,就不添加了 + CaseNode startNode = this.findOneByName(tripleInfo.getCaseId(), tripleInfo.getRecordId(), tripleInfo.getStartNodeType(), start, "1"); + if (startNode == null) { + startNode = new CaseNode(start, tripleInfo.getStartNodeType(), tripleInfo.getRecordSplitId(), tripleInfo.getRecordId(), tripleInfo.getCaseId(), "1"); + CaseNode save = this.save(startNode); + startNode.setId(save.getId()); + } + //结束节点 + String end = tripleInfo.getEndNode(); + CaseNode endNode = this.findOneByName(tripleInfo.getCaseId(), tripleInfo.getRecordId(), tripleInfo.getEndNodeType(), end, "1"); + if (endNode == null) { + endNode = new CaseNode(end, tripleInfo.getEndNodeType(), tripleInfo.getRecordSplitId(), tripleInfo.getRecordId(), tripleInfo.getCaseId(), "1"); + CaseNode save = this.save(endNode); + endNode.setId(save.getId()); + } + //关系 + Rel rel = new Rel(startNode.getId(), tripleInfo.getRelation(), endNode.getId()); + Rel relation = this.findRelation(rel); + if (relation == null) { + relation = this.saveRelation(rel); + } + tripleInfo.setStartNodeGraphId(startNode.getId()); + tripleInfo.setRelGraphId(relation.getId()); + tripleInfo.setEndNodeGraphId(endNode.getId()); + return tripleInfo; } } diff --git a/src/main/java/com/supervision/police/service/CasePersonService.java b/src/main/java/com/supervision/police/service/CasePersonService.java index 087d594..b91007c 100644 --- a/src/main/java/com/supervision/police/service/CasePersonService.java +++ b/src/main/java/com/supervision/police/service/CasePersonService.java @@ -19,4 +19,7 @@ public interface CasePersonService extends IService { List listByEvidenceId(String evidenceId); + + + CasePerson getMainActor(String caseId); } diff --git a/src/main/java/com/supervision/police/service/ExtractTripleInfoService.java b/src/main/java/com/supervision/police/service/ExtractTripleInfoService.java index 334393a..06221d3 100644 --- a/src/main/java/com/supervision/police/service/ExtractTripleInfoService.java +++ b/src/main/java/com/supervision/police/service/ExtractTripleInfoService.java @@ -1,6 +1,18 @@ package com.supervision.police.service; +import com.supervision.police.domain.CasePerson; +import com.supervision.police.domain.NotePrompt; +import com.supervision.police.domain.NoteRecordSplit; +import com.supervision.police.domain.TripleInfo; + +import java.util.List; + public interface ExtractTripleInfoService { void extractTripleInfo(String caseId, String name, String recordSplitId); + + List extractTripleInfo(NotePrompt notePrompt, CasePerson mainActor, List noteRecordSplitList); + + + List extractTripleInfo(NotePrompt notePrompt, String caseId, String recordId); } diff --git a/src/main/java/com/supervision/police/service/NoteRecordSplitService.java b/src/main/java/com/supervision/police/service/NoteRecordSplitService.java index 638b46d..efe3652 100644 --- a/src/main/java/com/supervision/police/service/NoteRecordSplitService.java +++ b/src/main/java/com/supervision/police/service/NoteRecordSplitService.java @@ -32,4 +32,7 @@ public interface NoteRecordSplitService extends IService { Map queryRecordList(NoteRecordReqVO noteRecord, Integer page, Integer size); String redoExtract(NoteRecordReqVO records) throws IOException; + + + List queryRecordSplitList(String recordId); } diff --git a/src/main/java/com/supervision/police/service/TripleInfoService.java b/src/main/java/com/supervision/police/service/TripleInfoService.java index 29ba353..175053e 100644 --- a/src/main/java/com/supervision/police/service/TripleInfoService.java +++ b/src/main/java/com/supervision/police/service/TripleInfoService.java @@ -3,5 +3,17 @@ package com.supervision.police.service; import com.baomidou.mybatisplus.extension.service.IService; import com.supervision.police.domain.TripleInfo; +import java.util.List; + public interface TripleInfoService extends IService { + + /** + * 根据业务字段或者主键id更新或新增三元组信息 + * @param tripleInfo + * @return + */ + TripleInfo saveOrUpdateByBusiness(TripleInfo tripleInfo); + + + void updateNeo4jFlag(List ids, String neo4jFlag); } diff --git a/src/main/java/com/supervision/police/service/impl/CasePersonServiceImpl.java b/src/main/java/com/supervision/police/service/impl/CasePersonServiceImpl.java index 81bec7f..377456c 100644 --- a/src/main/java/com/supervision/police/service/impl/CasePersonServiceImpl.java +++ b/src/main/java/com/supervision/police/service/impl/CasePersonServiceImpl.java @@ -58,4 +58,9 @@ public class CasePersonServiceImpl extends ServiceImpl wrapper = new QueryWrapper<>(); - wrapper.eq("case_id", caseId); - wrapper.eq("case_actor_flag", 1); - CasePerson mainActor = casePersonService.getOne(wrapper); + + CasePerson mainActor = casePersonService.getMainActor(caseId); List taskList = notePromptList.stream() .filter(prompt -> StrUtil.isNotBlank(prompt.getPrompt())) @@ -84,9 +80,15 @@ public class ExtractTripleInfoServiceImpl implements ExtractTripleInfoService { return; } + log.info("extractTripleInfo:笔录片段:{}开始提交三元组抽取任务,任务数量:{}", recordSplit.getId(),taskList.size()); + List tripleInfos = doTripleExtractTask(taskList); + log.info("extractTripleInfo:笔录片段:{}三元组抽取任务提交结束,抽取三元组个数:{}...", recordSplit.getId(), tripleInfos.size()); + } + + private List doTripleExtractTask(List taskList) { List tripleInfos = new ArrayList<>(); try { - log.info("extractTripleInfo:笔录片段:{}抽取任务成功提交{}个任务....", recordSplitId, taskList.size()); + log.info("doTripleExtractTask:抽取任务成功提交{}个任务....", taskList.size()); List> futures = TripleExtractTaskPool.executor.invokeAll(taskList); for (Future future : futures) { @@ -96,22 +98,55 @@ public class ExtractTripleInfoServiceImpl implements ExtractTripleInfoService { tripleInfos.add(tripleInfo); } } catch (ExecutionException e) { - log.error("extractTripleInfo:笔录片段:{}三元组提取任务执行失败...", recordSplitId, e); + log.error("doTripleExtractTask:三元组提取任务执行失败...", e); } } } catch (InterruptedException e) { - log.error("extractTripleInfo:笔录片段:{}三元组提取任务提交失败...", recordSplitId, e); + log.error("doTripleExtractTask:三元组提取任务提交失败...", e); } // 如果有提取到三元组信息 if (CollUtil.isNotEmpty(tripleInfos)) { for (TripleInfo tripleInfo : tripleInfos) { - log.info("extractTripleInfo:笔录片段:{}三元组提取任务执行结束...,三元组信息入库:{}", recordSplitId, JSONUtil.toJsonStr(tripleInfo)); - tripleInfoService.save(tripleInfo); + log.info("doTripleExtractTask:笔录片段:{}三元组提取任务执行结束...,三元组信息入库:{}",tripleInfo.getRecordSplitId(), JSONUtil.toJsonStr(tripleInfo)); + tripleInfoService.saveOrUpdateByBusiness(tripleInfo); } - } else { - log.info("extractTripleInfo:笔录片段:{}三元组提取任务执行结束...,未提取到任何三元组信息...", recordSplitId); } + return tripleInfos; + } + + @Override + public List extractTripleInfo(NotePrompt notePrompt,CasePerson mainActor,List noteRecordSplitList) { + Assert.notEmpty(noteRecordSplitList, "noteRecordSplitList不能为空"); + Assert.notNull(notePrompt, "notePrompt不能为空"); + + List taskList = noteRecordSplitList.stream().map( + noteRecordSplit -> + new TripleExtractTask(chatClient, notePrompt, noteRecordSplit, postExtractTriple(), mainActor) + ).toList(); + + if (CollUtil.isEmpty(taskList)){ + return new ArrayList<>(); + } + + log.info("extractTripleInfo:提示词:{}开始提交三元组抽取任务,任务数量:{}", notePrompt.getName(),taskList.size()); + List tripleInfos = doTripleExtractTask(taskList); + log.info("extractTripleInfo:提示词:{}三元组抽取任务提交结束,抽取三元组个数:{}...", notePrompt.getName(), tripleInfos.size()); + + return tripleInfos; + + } + + @Override + public List extractTripleInfo(NotePrompt notePrompt, String caseId, String recordId) { + + Assert.notNull(notePrompt, "notePrompt不能为空"); + Assert.notEmpty(recordId, "recordId不能为空"); + Assert.notEmpty(caseId, "caseId不能为空"); + + CasePerson mainActor = casePersonService.getMainActor(caseId); + List noteRecordSplits = noteRecordSplitService.queryRecordSplitList(recordId); + return extractTripleInfo(notePrompt, mainActor, noteRecordSplits); } private Consumer postExtractTriple() { 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 80731ec..aeb7062 100644 --- a/src/main/java/com/supervision/police/service/impl/ModelRecordTypeServiceImpl.java +++ b/src/main/java/com/supervision/police/service/impl/ModelRecordTypeServiceImpl.java @@ -336,36 +336,8 @@ public class ModelRecordTypeServiceImpl extends ServiceImpl tripleInfos = tripleInfoService.listByIds(ids); for (TripleInfo tripleInfo : tripleInfos) { try { - //开始节点 - String start = tripleInfo.getStartNode(); - // 首先看是否已经存在了,如果已经存在了,就不添加了 - CaseNode startNode = neo4jService.findOneByName(tripleInfo.getCaseId(), tripleInfo.getRecordId(), tripleInfo.getStartNodeType(), start, "1"); - if (startNode == null) { - startNode = new CaseNode(start, tripleInfo.getStartNodeType(), tripleInfo.getRecordSplitId(), tripleInfo.getRecordId(), tripleInfo.getCaseId(), "1"); - CaseNode save = neo4jService.save(startNode); - startNode.setId(save.getId()); - } - //结束节点 - String end = tripleInfo.getEndNode(); - CaseNode endNode = neo4jService.findOneByName(tripleInfo.getCaseId(), tripleInfo.getRecordId(), tripleInfo.getEndNodeType(), end, "1"); - if (endNode == null) { - endNode = new CaseNode(end, tripleInfo.getEndNodeType(), tripleInfo.getRecordSplitId(), tripleInfo.getRecordId(), tripleInfo.getCaseId(), "1"); - CaseNode save = neo4jService.save(endNode); - endNode.setId(save.getId()); - } - //关系 - Rel rel = new Rel(startNode.getId(), tripleInfo.getRelation(), endNode.getId()); - Rel relation = neo4jService.findRelation(rel); - if (relation == null) { - 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) { - } + TripleInfo neo4jTripleInfo = neo4jService.saveTripleInfo(tripleInfo); + tripleInfoService.updateNeo4jFlag(List.of(neo4jTripleInfo.getId()), "1"); } catch (Exception e) { log.error(e.getMessage(), e); } diff --git a/src/main/java/com/supervision/police/service/impl/NoteRecordSplitServiceImpl.java b/src/main/java/com/supervision/police/service/impl/NoteRecordSplitServiceImpl.java index 4961e7e..c06ae70 100644 --- a/src/main/java/com/supervision/police/service/impl/NoteRecordSplitServiceImpl.java +++ b/src/main/java/com/supervision/police/service/impl/NoteRecordSplitServiceImpl.java @@ -384,6 +384,11 @@ public class NoteRecordSplitServiceImpl extends ServiceImpl queryRecordSplitList(String recordId) { + return super.lambdaQuery().eq(NoteRecordSplit::getNoteRecordId, recordId).list(); + } + private void setRecordDetailSerialNumber(List noteRecordDetailDTOList) { List> pairs = new ArrayList<>(); diff --git a/src/main/java/com/supervision/police/service/impl/TripleInfoServiceImpl.java b/src/main/java/com/supervision/police/service/impl/TripleInfoServiceImpl.java index 347f093..cad82bc 100644 --- a/src/main/java/com/supervision/police/service/impl/TripleInfoServiceImpl.java +++ b/src/main/java/com/supervision/police/service/impl/TripleInfoServiceImpl.java @@ -1,12 +1,53 @@ package com.supervision.police.service.impl; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.supervision.police.domain.TripleInfo; import com.supervision.police.mapper.TripleInfoMapper; import com.supervision.police.service.TripleInfoService; import org.springframework.stereotype.Service; +import java.util.List; + @Service public class TripleInfoServiceImpl extends ServiceImpl implements TripleInfoService { + @Override + public TripleInfo saveOrUpdateByBusiness(TripleInfo tripleInfo) { + if (StrUtil.isNotEmpty(tripleInfo.getId())) { + TripleInfo dbTripleInfo = super.getById(tripleInfo.getId()); + if (null != dbTripleInfo) { + super.updateById(tripleInfo); + } else { + super.save(tripleInfo); + } + } + if (StrUtil.isEmpty(tripleInfo.getId())) { + TripleInfo one = super.lambdaQuery() + .eq(TripleInfo::getStartNode, tripleInfo.getStartNode()) + .eq(TripleInfo::getEndNode, tripleInfo.getEndNode()) + .eq(TripleInfo::getRelation, tripleInfo.getRelation()) + .eq(TripleInfo::getCaseId, tripleInfo.getCaseId()) + .eq(TripleInfo::getStartNodeType, tripleInfo.getStartNodeType()) + .eq(TripleInfo::getEndNodeType, tripleInfo.getEndNodeType()) + .eq(TripleInfo::getRecordSplitId, tripleInfo.getRecordSplitId()).one(); + if (null != one) { + tripleInfo.setId(one.getId()); + super.updateById(tripleInfo); + } else { + super.save(tripleInfo); + } + } + + return tripleInfo; + } + + @Override + public void updateNeo4jFlag(List ids, String neo4jFlag) { + if (CollUtil.isEmpty(ids)){ + return; + } + super.lambdaUpdate().in(TripleInfo::getId, ids).set(TripleInfo::getAddNeo4j, neo4jFlag).update(); + } }