原子指标判断代码提交

topo_dev
liu 10 months ago
parent 52cc84bcaf
commit b2a802d47b

@ -5,9 +5,12 @@ import com.supervision.neo4j.domain.Rel;
import com.supervision.neo4j.dto.ResultDTO; import com.supervision.neo4j.dto.ResultDTO;
import org.neo4j.driver.Record; import org.neo4j.driver.Record;
import org.neo4j.driver.Result; import org.neo4j.driver.Result;
import org.neo4j.driver.Value;
import org.neo4j.driver.internal.value.NullValue;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Optional;
public class Neo4jUtils { public class Neo4jUtils {
@ -74,16 +77,32 @@ public class Neo4jUtils {
return list; return list;
} }
public static List<ResultDTO> getResultDTOList(Result run) { public static List<ResultDTO> getResultDTOList(Result result) {
List<ResultDTO> list = new ArrayList<>(); List<ResultDTO> list = new ArrayList<>();
while (run.hasNext()) { while (result.hasNext()) {
Record record = run.next(); Record record = result.next();
String startId = record.get("startId").asLong() + ""; ResultDTO resultDTO = new ResultDTO();
String endId = record.get("endId").asLong() + ""; if (!(record.get("startId") instanceof NullValue)) {
String relId = record.get("relId").asLong() + ""; resultDTO.setStartId(String.valueOf(record.get("startId")));
String recordId = record.get("recordId").asString(); }
String recordsId = record.get("recordsId").asString(); if (!(record.get("endId") instanceof NullValue)) {
list.add(new ResultDTO(startId, endId, relId, recordId, recordsId)); 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; return list;
} }

@ -133,4 +133,5 @@ public class RecordController {
} }
} }

@ -8,12 +8,24 @@ import java.util.List;
@Data @Data
public class AnalyseCaseDTO { public class AnalyseCaseDTO {
/**
* ID
*/
private String caseId; private String caseId;
/**
*
*/
private String lawActor; private String lawActor;
/**
*
*/
private String lawParty; private String lawParty;
/**
*
*/
List<ModelAtomicIndex> atomicIndexList; List<ModelAtomicIndex> atomicIndexList;
} }

@ -15,6 +15,11 @@ public class AtomicData {
/** /**
* *
* 1
* 2
* 3
* 4
* 5
*/ */
private String relationalSymbol; private String relationalSymbol;

@ -12,11 +12,15 @@ public class JudgeLogic {
/** /**
* *
* 1
* 2
*/ */
private String groupLogic; private String groupLogic;
/** /**
* *
* 1
* 2
*/ */
private String rowLogic; private String rowLogic;

@ -118,6 +118,14 @@ public class ModelRecordTypeServiceImpl extends ServiceImpl<ModelRecordTypeMappe
} }
} }
@Override
public List<TripleInfo> getThreeInfo(String caseId, String name, String recordId) {
// TODO 这里应该改成异步的形式,通过异步的形式来进行提取三元组信息,不能每次点击就跑一遍
return extractTripleInfo(caseId, name, recordId);
}
private List<TripleInfo> extractTripleInfo(String caseId, String name, String recordId) { private List<TripleInfo> extractTripleInfo(String caseId, String name, String recordId) {
List<NoteRecordSplit> records = noteRecordSplitMapper.selectRecord(caseId, name, recordId); List<NoteRecordSplit> records = noteRecordSplitMapper.selectRecord(caseId, name, recordId);
List<TripleInfo> tripleInfos = new ArrayList<>(); List<TripleInfo> tripleInfos = new ArrayList<>();
@ -163,12 +171,6 @@ public class ModelRecordTypeServiceImpl extends ServiceImpl<ModelRecordTypeMappe
return tripleInfos; return tripleInfos;
} }
@Override
public List<TripleInfo> getThreeInfo(String caseId, String name, String recordId) {
// TODO 这里应该改成异步的形式,通过异步的形式来进行提取三元组信息,不能每次点击就跑一遍
return extractTripleInfo(caseId, name, recordId);
}
@Override @Override
public String addNeo4j(List<String> ids) { public String addNeo4j(List<String> ids) {
List<TripleInfo> tripleInfos = tripleInfoMapper.selectByIds(ids); List<TripleInfo> tripleInfos = tripleInfoMapper.selectByIds(ids);

@ -1,5 +1,6 @@
package com.supervision.police.service.impl; package com.supervision.police.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.supervision.common.domain.R; import com.supervision.common.domain.R;
import com.supervision.common.utils.StringUtils; 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.dto.JudgeLogic;
import com.supervision.police.mapper.*; import com.supervision.police.mapper.*;
import com.supervision.police.service.ModelService; import com.supervision.police.service.ModelService;
import lombok.extern.slf4j.Slf4j;
import org.neo4j.driver.Driver; import org.neo4j.driver.Driver;
import org.neo4j.driver.Result; import org.neo4j.driver.Result;
import org.neo4j.driver.Session; import org.neo4j.driver.Session;
@ -19,6 +21,7 @@ import org.springframework.stereotype.Service;
import java.util.*; import java.util.*;
@Slf4j
@Service @Service
public class ModelServiceImpl implements ModelService { public class ModelServiceImpl implements ModelService {
@ -29,6 +32,7 @@ public class ModelServiceImpl implements ModelService {
private ModelAtomicIndexMapper modelAtomicIndexMapper; private ModelAtomicIndexMapper modelAtomicIndexMapper;
private final Driver driver; private final Driver driver;
@Autowired @Autowired
private ModelServiceImpl(Driver driver) { private ModelServiceImpl(Driver driver) {
this.driver = driver; this.driver = driver;
@ -56,9 +60,7 @@ public class ModelServiceImpl implements ModelService {
result.setAtomicId(atomicIndex.getId()); result.setAtomicId(atomicIndex.getId());
//查询语句 //查询语句
String ql = atomicIndex.getQueryLang(); String ql = atomicIndex.getQueryLang();
Map<String, Object> params = new HashMap<>();
params.put("lawActor", analyseCaseDTO.getLawActor());
params.put("caseId", analyseCaseDTO.getCaseId());
//原子指标结果表 //原子指标结果表
try { try {
// index_source==1 // index_source==1
@ -71,34 +73,8 @@ public class ModelServiceImpl implements ModelService {
} else if ("2".endsWith(atomicIndex.getIndexSource()) && StringUtils.isNotEmpty(ql)) { } else if ("2".endsWith(atomicIndex.getIndexSource()) && StringUtils.isNotEmpty(ql)) {
// //
} else if ("3".endsWith(atomicIndex.getIndexSource()) && StringUtils.isNotEmpty(ql)) { } else if ("3".endsWith(atomicIndex.getIndexSource()) && StringUtils.isNotEmpty(ql)) {
//图谱 // 使用知识图谱进行计算
int i = 1; analyseGraphCase(analyseCaseDTO, result, ql, session);
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<ResultDTO> 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");
}
}
}
} else if ("4".endsWith(atomicIndex.getIndexSource())) { } else if ("4".endsWith(atomicIndex.getIndexSource())) {
// //
} }
@ -119,51 +95,55 @@ public class ModelServiceImpl implements ModelService {
// 计算指标结果 // 计算指标结果
int score = 0; int score = 0;
// 根据案件类型获取所有的指标
List<ModelIndex> modelIndices = modelIndexMapper.selectByCaseType(modelCase.getCaseType()); List<ModelIndex> modelIndices = modelIndexMapper.selectByCaseType(modelCase.getCaseType());
for (ModelIndex modelIndex : modelIndices) { for (ModelIndex modelIndex : modelIndices) {
ModelIndexResult result = new ModelIndexResult(); ModelIndexResult result = new ModelIndexResult();
result.setCaseId(analyseCaseDTO.getCaseId()); result.setCaseId(analyseCaseDTO.getCaseId());
result.setIndexId(modelIndex.getId()); result.setIndexId(modelIndex.getId());
Set<String> atomicIds = new HashSet<>(); Set<String> atomicIds = new HashSet<>();
// 判断逻辑是否为空,如果不为空,就根据判断逻辑进行判断
if (StringUtils.isNotEmpty(modelIndex.getJudgeLogic())) { if (StringUtils.isNotEmpty(modelIndex.getJudgeLogic())) {
List<JudgeLogic> judgeLogics = JSONUtil.toList(modelIndex.getJudgeLogic(), JudgeLogic.class); List<JudgeLogic> judgeLogics = JSONUtil.toList(modelIndex.getJudgeLogic(), JudgeLogic.class);
boolean res = false; if (CollUtil.isNotEmpty(judgeLogics)) {
for (int i = 0; i < judgeLogics.size(); i++) { boolean res = false;
boolean group = false; for (int i = 0; i < judgeLogics.size(); i++) {
JudgeLogic logic = judgeLogics.get(i); boolean group = false;
String rowLogic = logic.getRowLogic(); JudgeLogic logic = judgeLogics.get(i);
List<AtomicData> atomicData = logic.getAtomicData(); String rowLogic = logic.getRowLogic();
for (int j = 0; j < atomicData.size(); j++) { List<AtomicData> atomicData = logic.getAtomicData();
AtomicData data = atomicData.get(j); for (int j = 0; j < atomicData.size(); j++) {
atomicIds.add(data.getAtomicIndex()); AtomicData data = atomicData.get(j);
Boolean ato = atomic.get(data.getAtomicIndex()); atomicIds.add(data.getAtomicIndex());
String relationalSymbol = data.getRelationalSymbol(); Boolean ato = atomic.get(data.getAtomicIndex());
if ("2".equals(relationalSymbol) || "4".equals(relationalSymbol) || "5".equals(relationalSymbol)) { String relationalSymbol = data.getRelationalSymbol();
ato = !ato; 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) { String groupLogic = logic.getGroupLogic();
group = ato; if (i == 0) {
res = group;
} else { } else {
if ("1".equals(rowLogic)) { if ("1".equals(groupLogic)) {
group = group && ato; res = res && group;
} else if ("2".equals(rowLogic)) { } else if ("2".equals(groupLogic)) {
group = group || ato; res = res || group;
} }
} }
} }
String groupLogic = logic.getGroupLogic(); result.setIndexResult(res ? "true" : "false");
if (i == 0) { result.setAtomicIds(StringUtils.join(atomicIds, ","));
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, ","));
} }
ModelIndexResult exist = modelIndexResultMapper.selectByCaseIdAndIndexId(analyseCaseDTO.getCaseId(), modelIndex.getId()); ModelIndexResult exist = modelIndexResultMapper.selectByCaseIdAndIndexId(analyseCaseDTO.getCaseId(), modelIndex.getId());
if (exist == null) { if (exist == null) {
@ -182,4 +162,49 @@ public class ModelServiceImpl implements ModelService {
return R.ok(); return R.ok();
} }
private void analyseGraphCase(AnalyseCaseDTO analyseCaseDTO, ModelAtomicResult result, String ql, Session session) {
//图谱
int i = 1;
Map<String, Object> 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<ResultDTO> 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");
}
}
}
}
} }

@ -1,5 +1,6 @@
package com.supervision.police.service.impl; package com.supervision.police.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@ -56,6 +57,19 @@ public class RecordServiceImpl extends ServiceImpl<NoteRecordSplitMapper, NoteRe
private final ModelRecordTypeMapper modelRecordTypeMapper; private final ModelRecordTypeMapper modelRecordTypeMapper;
private static final String TYPE_TEMPLATE = """
: : {allTypes}"
:
: :
便QQ
: { type: '' }
:
1.
2.
3.
{question} {answer}
""";
@Override @Override
// @Transactional(rollbackFor = Exception.class) // @Transactional(rollbackFor = Exception.class)
public String uploadRecords(NoteRecord records, List<MultipartFile> fileList) throws IOException { public String uploadRecords(NoteRecord records, List<MultipartFile> fileList) throws IOException {
@ -113,23 +127,12 @@ public class RecordServiceImpl extends ServiceImpl<NoteRecordSplitMapper, NoteRe
noteRecord.setQuestion(qa.getQuestion()); noteRecord.setQuestion(qa.getQuestion());
noteRecord.setAnswer(qa.getAnswer()); noteRecord.setAnswer(qa.getAnswer());
noteRecord.setCreateTime(LocalDateTime.now()); noteRecord.setCreateTime(LocalDateTime.now());
// 开始对笔录进行分类
Map<String, String> paramMap = new HashMap<>(); Map<String, String> paramMap = new HashMap<>();
paramMap.put("allTypes", allTypes.toString()); paramMap.put("allTypes", CollUtil.join(allTypes, ";"));
paramMap.put("question", qa.getQuestion()); paramMap.put("question", qa.getQuestion());
paramMap.put("answer", qa.getAnswer()); paramMap.put("answer", qa.getAnswer());
String template = """ Prompt prompt = new Prompt(new UserMessage(StrUtil.format(TYPE_TEMPLATE, paramMap)));
: : {allTypes}"
:
: :
便QQ
: { type: '' }
:
1.
2.
3.
{question} {answer}
""";
Prompt prompt = new Prompt(new UserMessage(StrUtil.format(template, paramMap)));
StopWatch stopWatch = new StopWatch(); StopWatch stopWatch = new StopWatch();
stopWatch.start(); stopWatch.start();
log.info("开始分析:"); log.info("开始分析:");
@ -154,7 +157,7 @@ public class RecordServiceImpl extends ServiceImpl<NoteRecordSplitMapper, NoteRe
noteRecord.setRecordType(type); noteRecord.setRecordType(type);
noteRecordSplitMapper.insert(noteRecord); noteRecordSplitMapper.insert(noteRecord);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); log.error(e.getMessage(), e);
} }
// ModelRecordType exist = modelRecordTypeMapper.queryByName(type); // ModelRecordType exist = modelRecordTypeMapper.queryByName(type);
// if (exist == null) { // if (exist == null) {

@ -51,11 +51,16 @@ spring:
neo4j: neo4j:
database: neo4j database: neo4j
# neo4j:
# uri: bolt://113.128.242.110:7687
# authentication:
# username: neo4j
# password: Sushengtian@sdjn2023
neo4j: neo4j:
uri: bolt://113.128.242.110:7687 uri: bolt://192.168.10.137:7687
authentication: authentication:
username: neo4j username: neo4j
password: Sushengtian@sdjn2023 password: 123456
minio: minio:
endpoint: http:192.168.10.137:9002 endpoint: http:192.168.10.137:9002

Loading…
Cancel
Save