From b2a802d47b09de2f13a8c847d56cb853b9eec273 Mon Sep 17 00:00:00 2001 From: liu Date: Wed, 17 Jul 2024 16:10:36 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8E=9F=E5=AD=90=E6=8C=87=E6=A0=87=E5=88=A4?= =?UTF-8?q?=E6=96=AD=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 --- .../supervision/neo4j/utils/Neo4jUtils.java | 37 +++-- .../police/controller/RecordController.java | 1 + .../police/dto/AnalyseCaseDTO.java | 12 ++ .../supervision/police/dto/AtomicData.java | 5 + .../supervision/police/dto/JudgeLogic.java | 4 + .../impl/ModelRecordTypeServiceImpl.java | 14 +- .../police/service/impl/ModelServiceImpl.java | 149 ++++++++++-------- .../service/impl/RecordServiceImpl.java | 33 ++-- src/main/resources/application-dev.yml | 9 +- 9 files changed, 170 insertions(+), 94 deletions(-) diff --git a/src/main/java/com/supervision/neo4j/utils/Neo4jUtils.java b/src/main/java/com/supervision/neo4j/utils/Neo4jUtils.java index 556704f..59ea1d3 100644 --- a/src/main/java/com/supervision/neo4j/utils/Neo4jUtils.java +++ b/src/main/java/com/supervision/neo4j/utils/Neo4jUtils.java @@ -5,9 +5,12 @@ import com.supervision.neo4j.domain.Rel; import com.supervision.neo4j.dto.ResultDTO; import org.neo4j.driver.Record; import org.neo4j.driver.Result; +import org.neo4j.driver.Value; +import org.neo4j.driver.internal.value.NullValue; import java.util.ArrayList; import java.util.List; +import java.util.Optional; public class Neo4jUtils { @@ -74,16 +77,32 @@ public class Neo4jUtils { return list; } - public static List getResultDTOList(Result run) { + public static List getResultDTOList(Result result) { + + List list = new ArrayList<>(); - while (run.hasNext()) { - Record record = run.next(); - String startId = record.get("startId").asLong() + ""; - String endId = record.get("endId").asLong() + ""; - String relId = record.get("relId").asLong() + ""; - String recordId = record.get("recordId").asString(); - String recordsId = record.get("recordsId").asString(); - list.add(new ResultDTO(startId, endId, relId, recordId, recordsId)); + while (result.hasNext()) { + Record record = result.next(); + ResultDTO resultDTO = new ResultDTO(); + if (!(record.get("startId") instanceof NullValue)) { + resultDTO.setStartId(String.valueOf(record.get("startId"))); + } + if (!(record.get("endId") instanceof NullValue)) { + resultDTO.setEndId(String.valueOf(record.get("endId"))); + } + if (!(record.get("relId") instanceof NullValue)) { + resultDTO.setRelId(String.valueOf(record.get("relId"))); + } + if (!(record.get("relId") instanceof NullValue)) { + resultDTO.setRelId(String.valueOf(record.get("relId"))); + } + if (!(record.get("recordId") instanceof NullValue)) { + resultDTO.setRecordId(String.valueOf(record.get("recordId"))); + } + if (!(record.get("recordsId") instanceof NullValue)) { + resultDTO.setRecordId(String.valueOf(record.get("recordsId"))); + } + list.add(resultDTO); } return list; } diff --git a/src/main/java/com/supervision/police/controller/RecordController.java b/src/main/java/com/supervision/police/controller/RecordController.java index ad4d6b5..3868319 100644 --- a/src/main/java/com/supervision/police/controller/RecordController.java +++ b/src/main/java/com/supervision/police/controller/RecordController.java @@ -133,4 +133,5 @@ public class RecordController { } + } diff --git a/src/main/java/com/supervision/police/dto/AnalyseCaseDTO.java b/src/main/java/com/supervision/police/dto/AnalyseCaseDTO.java index 4d10207..adfa2e3 100644 --- a/src/main/java/com/supervision/police/dto/AnalyseCaseDTO.java +++ b/src/main/java/com/supervision/police/dto/AnalyseCaseDTO.java @@ -8,12 +8,24 @@ import java.util.List; @Data public class AnalyseCaseDTO { + /** + * 案例案件ID + */ private String caseId; + /** + * 行为人 + */ private String lawActor; + /** + * 受害人 + */ private String lawParty; + /** + * 原子指标列表 + */ List atomicIndexList; } diff --git a/src/main/java/com/supervision/police/dto/AtomicData.java b/src/main/java/com/supervision/police/dto/AtomicData.java index b48a8e5..8251dc2 100644 --- a/src/main/java/com/supervision/police/dto/AtomicData.java +++ b/src/main/java/com/supervision/police/dto/AtomicData.java @@ -15,6 +15,11 @@ public class AtomicData { /** * 原子指标逻辑 + * 1 真实 + * 2 虚构 + * 3 存在 + * 4 不存在 + * 5 未知 */ private String relationalSymbol; diff --git a/src/main/java/com/supervision/police/dto/JudgeLogic.java b/src/main/java/com/supervision/police/dto/JudgeLogic.java index ee6b67b..286d9f0 100644 --- a/src/main/java/com/supervision/police/dto/JudgeLogic.java +++ b/src/main/java/com/supervision/police/dto/JudgeLogic.java @@ -12,11 +12,15 @@ public class JudgeLogic { /** * 与上一组之间的逻辑关系 + * 1 且 + * 2 或 */ private String groupLogic; /** * 组内逻辑关系 + * 1 且 + * 2 或 */ private String rowLogic; 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 e6ef5c8..14f4f1e 100644 --- a/src/main/java/com/supervision/police/service/impl/ModelRecordTypeServiceImpl.java +++ b/src/main/java/com/supervision/police/service/impl/ModelRecordTypeServiceImpl.java @@ -118,6 +118,14 @@ public class ModelRecordTypeServiceImpl extends ServiceImpl getThreeInfo(String caseId, String name, String recordId) { + // TODO 这里应该改成异步的形式,通过异步的形式来进行提取三元组信息,不能每次点击就跑一遍 + return extractTripleInfo(caseId, name, recordId); + } + private List extractTripleInfo(String caseId, String name, String recordId) { List records = noteRecordSplitMapper.selectRecord(caseId, name, recordId); List tripleInfos = new ArrayList<>(); @@ -163,12 +171,6 @@ public class ModelRecordTypeServiceImpl extends ServiceImpl getThreeInfo(String caseId, String name, String recordId) { - // TODO 这里应该改成异步的形式,通过异步的形式来进行提取三元组信息,不能每次点击就跑一遍 - return extractTripleInfo(caseId, name, recordId); - } - @Override public String addNeo4j(List ids) { List tripleInfos = tripleInfoMapper.selectByIds(ids); 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 68b431f..9e0ea79 100644 --- a/src/main/java/com/supervision/police/service/impl/ModelServiceImpl.java +++ b/src/main/java/com/supervision/police/service/impl/ModelServiceImpl.java @@ -1,5 +1,6 @@ package com.supervision.police.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.json.JSONUtil; import com.supervision.common.domain.R; import com.supervision.common.utils.StringUtils; @@ -11,6 +12,7 @@ import com.supervision.police.dto.AtomicData; import com.supervision.police.dto.JudgeLogic; import com.supervision.police.mapper.*; import com.supervision.police.service.ModelService; +import lombok.extern.slf4j.Slf4j; import org.neo4j.driver.Driver; import org.neo4j.driver.Result; import org.neo4j.driver.Session; @@ -19,6 +21,7 @@ import org.springframework.stereotype.Service; import java.util.*; +@Slf4j @Service public class ModelServiceImpl implements ModelService { @@ -29,6 +32,7 @@ public class ModelServiceImpl implements ModelService { private ModelAtomicIndexMapper modelAtomicIndexMapper; private final Driver driver; + @Autowired private ModelServiceImpl(Driver driver) { this.driver = driver; @@ -56,9 +60,7 @@ public class ModelServiceImpl implements ModelService { result.setAtomicId(atomicIndex.getId()); //查询语句 String ql = atomicIndex.getQueryLang(); - Map params = new HashMap<>(); - params.put("lawActor", analyseCaseDTO.getLawActor()); - params.put("caseId", analyseCaseDTO.getCaseId()); + //原子指标结果表 try { // index_source==1 @@ -71,34 +73,8 @@ public class ModelServiceImpl implements ModelService { } else if ("2".endsWith(atomicIndex.getIndexSource()) && StringUtils.isNotEmpty(ql)) { // } else if ("3".endsWith(atomicIndex.getIndexSource()) && StringUtils.isNotEmpty(ql)) { - //图谱 - int i = 1; - String lawPartys = analyseCaseDTO.getLawParty(); - String[] split = StringUtils.isEmpty(lawPartys) ? new String[0] : lawPartys.split(","); - if (ql.contains("$lawParty") && split.length > 1) { - i = split.length; - } - for (int j = 0; j < i; j++) { - if (split.length > 0) { - params.put("lawParty", split[j]); - } - Result run = session.run(ql, params); - List res = Neo4jUtils.getResultDTOList(run); - if (res.isEmpty()) { - result.setAtomicResult("-1"); - } else { - ResultDTO resultDTO = res.get(0); - if (StringUtils.isNotEmpty(resultDTO.getRelId())) { - //存在关系 - result.setAtomicResult("1"); - result.setRecordId(resultDTO.getRecordId()); - result.setRecordsId(resultDTO.getRecordsId()); - break; - } else { - result.setAtomicResult("0"); - } - } - } + // 使用知识图谱进行计算 + analyseGraphCase(analyseCaseDTO, result, ql, session); } else if ("4".endsWith(atomicIndex.getIndexSource())) { // } @@ -119,51 +95,55 @@ public class ModelServiceImpl implements ModelService { // 计算指标结果 int score = 0; + // 根据案件类型获取所有的指标 List modelIndices = modelIndexMapper.selectByCaseType(modelCase.getCaseType()); for (ModelIndex modelIndex : modelIndices) { ModelIndexResult result = new ModelIndexResult(); result.setCaseId(analyseCaseDTO.getCaseId()); result.setIndexId(modelIndex.getId()); Set atomicIds = new HashSet<>(); + // 判断逻辑是否为空,如果不为空,就根据判断逻辑进行判断 if (StringUtils.isNotEmpty(modelIndex.getJudgeLogic())) { List judgeLogics = JSONUtil.toList(modelIndex.getJudgeLogic(), JudgeLogic.class); - boolean res = false; - for (int i = 0; i < judgeLogics.size(); i++) { - boolean group = false; - JudgeLogic logic = judgeLogics.get(i); - String rowLogic = logic.getRowLogic(); - List atomicData = logic.getAtomicData(); - for (int j = 0; j < atomicData.size(); j++) { - AtomicData data = atomicData.get(j); - atomicIds.add(data.getAtomicIndex()); - Boolean ato = atomic.get(data.getAtomicIndex()); - String relationalSymbol = data.getRelationalSymbol(); - if ("2".equals(relationalSymbol) || "4".equals(relationalSymbol) || "5".equals(relationalSymbol)) { - ato = !ato; + if (CollUtil.isNotEmpty(judgeLogics)) { + boolean res = false; + for (int i = 0; i < judgeLogics.size(); i++) { + boolean group = false; + JudgeLogic logic = judgeLogics.get(i); + String rowLogic = logic.getRowLogic(); + List atomicData = logic.getAtomicData(); + for (int j = 0; j < atomicData.size(); j++) { + AtomicData data = atomicData.get(j); + atomicIds.add(data.getAtomicIndex()); + Boolean ato = atomic.get(data.getAtomicIndex()); + String relationalSymbol = data.getRelationalSymbol(); + if ("2".equals(relationalSymbol) || "4".equals(relationalSymbol) || "5".equals(relationalSymbol)) { + ato = !ato; + } + if (j == 0) { + group = ato; + } else { + if ("1".equals(rowLogic)) { + group = group && ato; + } else if ("2".equals(rowLogic)) { + group = group || ato; + } + } } - if (j == 0) { - group = ato; + String groupLogic = logic.getGroupLogic(); + if (i == 0) { + res = group; } else { - if ("1".equals(rowLogic)) { - group = group && ato; - } else if ("2".equals(rowLogic)) { - group = group || ato; + if ("1".equals(groupLogic)) { + res = res && group; + } else if ("2".equals(groupLogic)) { + res = res || group; } } } - String groupLogic = logic.getGroupLogic(); - if (i == 0) { - res = group; - } else { - if ("1".equals(groupLogic)) { - res = res && group; - } else if ("2".equals(groupLogic)) { - res = res || group; - } - } + result.setIndexResult(res ? "true" : "false"); + result.setAtomicIds(StringUtils.join(atomicIds, ",")); } - result.setIndexResult(res? "true" : "false"); - result.setAtomicIds(StringUtils.join(atomicIds, ",")); } ModelIndexResult exist = modelIndexResultMapper.selectByCaseIdAndIndexId(analyseCaseDTO.getCaseId(), modelIndex.getId()); if (exist == null) { @@ -182,4 +162,49 @@ public class ModelServiceImpl implements ModelService { return R.ok(); } + private void analyseGraphCase(AnalyseCaseDTO analyseCaseDTO, ModelAtomicResult result, String ql, Session session) { + //图谱 + int i = 1; + Map params = new HashMap<>(); + // 行为人 + params.put("lawActor", analyseCaseDTO.getLawActor()); + // 案号 + params.put("caseId", analyseCaseDTO.getCaseId()); + // 参数中是否传了受害人 + String lawPartys = analyseCaseDTO.getLawParty(); + // 如果有受害人的话就进行分割 + String[] split = StringUtils.isEmpty(lawPartys) ? new String[0] : lawPartys.split(","); + if (ql.contains("$lawParty") && split.length > 1) { + i = split.length; + } + for (int j = 0; j < i; j++) { + if (split.length > 0) { + params.put("lawParty", split[j]); + } + Result run = null; + try { + run = session.run(ql, params); + } catch (Exception e) { + log.info("图数据库查询出现错误,查询语句{},参数{}", ql, JSONUtil.toJsonStr(params)); + return; + } + + List res = Neo4jUtils.getResultDTOList(run); + if (res.isEmpty()) { + result.setAtomicResult("-1"); + } else { + ResultDTO resultDTO = res.get(0); + if (StringUtils.isNotEmpty(resultDTO.getRelId())) { + //存在关系 + result.setAtomicResult("1"); + result.setRecordId(resultDTO.getRecordId()); + result.setRecordsId(resultDTO.getRecordsId()); + break; + } else { + result.setAtomicResult("0"); + } + } + } + } + } diff --git a/src/main/java/com/supervision/police/service/impl/RecordServiceImpl.java b/src/main/java/com/supervision/police/service/impl/RecordServiceImpl.java index d59a865..9013d45 100644 --- a/src/main/java/com/supervision/police/service/impl/RecordServiceImpl.java +++ b/src/main/java/com/supervision/police/service/impl/RecordServiceImpl.java @@ -1,5 +1,6 @@ package com.supervision.police.service.impl; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -56,6 +57,19 @@ public class RecordServiceImpl extends ServiceImpl fileList) throws IOException { @@ -113,23 +127,12 @@ public class RecordServiceImpl extends ServiceImpl paramMap = new HashMap<>(); - paramMap.put("allTypes", allTypes.toString()); + paramMap.put("allTypes", CollUtil.join(allTypes, ";")); paramMap.put("question", qa.getQuestion()); paramMap.put("answer", qa.getAnswer()); - String template = """ - 分类任务: 对话笔记录文本分类。目标: 将给定的对话笔记录分配到预定义的类别中,这些类别包括但不限于:{allTypes}。" - 说明: 提供一段对话笔记录文本,分类器应该识别出对话的主题,并将其归类到上述类别中的一个。 - 示例输入: 文本: - 办案警官问:你为了骗取更多的钱都做了哪些准备?。裴金禄回答:我刚开始我就是自己想了一些关于骗钱的点子,后面为了更不容易让别人识破我为了更佳逼真,我就从网上随便搜了一家租赁公司,我就搜到了兰州胜利机械租赁有限公司,我又想到了我管理的中铁北京局和中铁电气化局施工公司。我先是通过百度搜索了“办证”之后就在网页上面弹出了一个页面上面有一个QQ号,我就加上了。加上之后我就将我的要求给他说了,要求他给我刻两个假的公章,一个是兰州胜利机械租赁有限公司合同专用章,另一个是中铁北京局集团有限公司合同专用章。我还要求他给我伪造了一张兰州胜利机械租赁有限公司的营业执照 - 预期输出: { type: '诈骗准备' } - 任务要求: - 1. 分类器应当准确地识别对话的主题。 - 2. 如果一段对话笔记录包含多个主题,请选择最相关的类别。 - 3. 必须考虑上下文语境和专业术语来确定正确的分类。 - 对话内容为:{question} {answer} - """; - Prompt prompt = new Prompt(new UserMessage(StrUtil.format(template, paramMap))); + Prompt prompt = new Prompt(new UserMessage(StrUtil.format(TYPE_TEMPLATE, paramMap))); StopWatch stopWatch = new StopWatch(); stopWatch.start(); log.info("开始分析:"); @@ -154,7 +157,7 @@ public class RecordServiceImpl extends ServiceImpl