优化三元组提取

topo_dev
liu 1 year ago
parent 26b373f416
commit 7f05256946

@ -96,7 +96,7 @@ public class RecordController {
@ApiOperation("将三元组信息保存到知识图谱") @ApiOperation("将三元组信息保存到知识图谱")
@PostMapping("/addNeo4j") @PostMapping("/addNeo4j")
public R<String> addNeo4j(@RequestBody ListDTO list) { public R<String> addNeo4j(@RequestBody ListDTO list) {
return R.ok(modelRecordTypeService.addNeo4j(list.getIds())); return R.ok(modelRecordTypeService.addNeo4j(list.getIds(),list.getRecordId()));
} }
/** /**

@ -9,4 +9,6 @@ public class ListDTO {
public List<String> ids; public List<String> ids;
private String recordId;
} }

@ -27,5 +27,5 @@ public interface ModelRecordTypeService extends IService<ModelRecordType> {
void testExtractThreeInfo(); void testExtractThreeInfo();
String addNeo4j(List<String> ids); String addNeo4j(List<String> ids,String recordId);
} }

@ -403,90 +403,86 @@ public class ModelRecordTypeServiceImpl extends ServiceImpl<ModelRecordTypeMappe
@Override @Override
public String addNeo4j(List<String> ids) { public String addNeo4j(List<String> ids, String recordId) {
if (CollUtil.isEmpty(ids)) { if (StrUtil.isBlank(recordId)){
return "成功插入0条信息"; throw new BusinessException("记录ID不能为空");
} }
List<TripleInfo> tripleInfos = tripleInfoService.listByIds(ids); if (CollUtil.isNotEmpty(ids)) {
int i = 0; List<TripleInfo> tripleInfos = tripleInfoService.listByIds(ids);
for (TripleInfo tripleInfo : tripleInfos) { int i = 0;
try { for (TripleInfo tripleInfo : tripleInfos) {
//开始节点 try {
String start = tripleInfo.getStartNode(); //开始节点
// 首先看是否已经存在了,如果已经存在了,就不添加了 String start = tripleInfo.getStartNode();
CaseNode startNode = neo4jService.findOneByName(tripleInfo.getCaseId(), tripleInfo.getRecordId(), tripleInfo.getStartNodeType(), start, "1"); // 首先看是否已经存在了,如果已经存在了,就不添加了
if (startNode == null) { CaseNode startNode = neo4jService.findOneByName(tripleInfo.getCaseId(), tripleInfo.getRecordId(), tripleInfo.getStartNodeType(), start, "1");
startNode = new CaseNode(start, tripleInfo.getStartNodeType(), tripleInfo.getRecordSplitId(), tripleInfo.getRecordId(), tripleInfo.getCaseId(), "1"); if (startNode == null) {
CaseNode save = neo4jService.save(startNode); startNode = new CaseNode(start, tripleInfo.getStartNodeType(), tripleInfo.getRecordSplitId(), tripleInfo.getRecordId(), tripleInfo.getCaseId(), "1");
startNode.setId(save.getId()); 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"); String end = tripleInfo.getEndNode();
if (endNode == null) { CaseNode endNode = neo4jService.findOneByName(tripleInfo.getCaseId(), tripleInfo.getRecordId(), tripleInfo.getEndNodeType(), end, "1");
endNode = new CaseNode(end, tripleInfo.getEndNodeType(), tripleInfo.getRecordSplitId(), tripleInfo.getRecordId(), tripleInfo.getCaseId(), "1"); if (endNode == null) {
CaseNode save = neo4jService.save(endNode); endNode = new CaseNode(end, tripleInfo.getEndNodeType(), tripleInfo.getRecordSplitId(), tripleInfo.getRecordId(), tripleInfo.getCaseId(), "1");
endNode.setId(save.getId()); CaseNode save = neo4jService.save(endNode);
} endNode.setId(save.getId());
//关系 }
Rel rel = new Rel(startNode.getId(), tripleInfo.getRelation(), endNode.getId()); //关系
Rel relation = neo4jService.findRelation(rel); Rel rel = new Rel(startNode.getId(), tripleInfo.getRelation(), endNode.getId());
if (relation == null) { Rel relation = neo4jService.findRelation(rel);
relation = neo4jService.saveRelation(rel); if (relation == null) {
} relation = neo4jService.saveRelation(rel);
tripleInfo.setAddNeo4j("1"); }
tripleInfo.setStartNodeGraphId(startNode.getId()); tripleInfo.setAddNeo4j("1");
tripleInfo.setRelGraphId(relation.getId()); tripleInfo.setStartNodeGraphId(startNode.getId());
tripleInfo.setEndNodeGraphId(endNode.getId()); tripleInfo.setRelGraphId(relation.getId());
boolean updateResult = tripleInfoService.updateById(tripleInfo); tripleInfo.setEndNodeGraphId(endNode.getId());
if (updateResult) { boolean updateResult = tripleInfoService.updateById(tripleInfo);
i++; if (updateResult) {
i++;
}
} catch (Exception e) {
log.error(e.getMessage(), e);
} }
} catch (Exception e) {
log.error(e.getMessage(), e);
} }
} }
// 删除的要进行移除 // 删除的要进行移除
Optional<TripleInfo> any = tripleInfos.stream().findAny(); List<TripleInfo> existNeoList = tripleInfoService.lambdaQuery().eq(TripleInfo::getRecordId, recordId).eq(TripleInfo::getAddNeo4j, "1").list();
if (any.isPresent()) { Map<String, TripleInfo> existNeoMap = existNeoList.stream().collect(Collectors.toMap(TripleInfo::getId, Function.identity()));
TripleInfo anyTripleInfo = any.get(); // 去掉已经添加的
String recordId = anyTripleInfo.getRecordId(); Set<String> existNeoIdSet = existNeoMap.keySet();
List<TripleInfo> existNeoList = tripleInfoService.lambdaQuery().eq(TripleInfo::getRecordId, recordId).eq(TripleInfo::getAddNeo4j, "1").list(); ids.forEach(existNeoIdSet::remove);
Map<String, TripleInfo> existNeoMap = existNeoList.stream().collect(Collectors.toMap(TripleInfo::getId, Function.identity())); // 剩下的就是需要删除的
// 去掉已经添加的 for (String needDeleteId : existNeoIdSet) {
Set<String> existNeoIdSet = existNeoMap.keySet(); TripleInfo tripleInfo = existNeoMap.get(needDeleteId);
ids.forEach(existNeoIdSet::remove); if (ObjectUtil.isNotEmpty(tripleInfo.getRelGraphId())) {
// 剩下的就是需要删除的 // 先移除关系
for (String needDeleteId : existNeoIdSet) { neo4jService.deleteRel(tripleInfo.getRelGraphId());
TripleInfo tripleInfo = existNeoMap.get(needDeleteId); } else {
if (ObjectUtil.isNotEmpty(tripleInfo.getRelGraphId())) { break;
// 先移除关系 }
neo4jService.deleteRel(tripleInfo.getRelGraphId()); if (ObjectUtil.isNotEmpty(tripleInfo.getEndNodeGraphId())) {
} else { // 再移除尾节点
break; neo4jService.delNode(tripleInfo.getEndNodeGraphId());
} } else {
if (ObjectUtil.isNotEmpty(tripleInfo.getEndNodeGraphId())) { break;
// 再移除尾节点 }
neo4jService.delNode(tripleInfo.getEndNodeGraphId()); if (ObjectUtil.isNotEmpty(tripleInfo.getStartNodeGraphId())) {
} else { // 尝试删除头节点(只有头节点不存在任何关系的时候才进行删除)
break; neo4jService.deleteNoRelationNode(tripleInfo.getStartNodeGraphId());
} } else {
if (ObjectUtil.isNotEmpty(tripleInfo.getStartNodeGraphId())) { break;
// 尝试删除头节点(只有头节点不存在任何关系的时候才进行删除)
neo4jService.deleteNoRelationNode(tripleInfo.getStartNodeGraphId());
} else {
break;
}
// 更新状态
tripleInfoService.lambdaUpdate().set(TripleInfo::getAddNeo4j, "0")
.set(TripleInfo::getEndNodeGraphId, null)
.set(TripleInfo::getRelGraphId, null)
.set(TripleInfo::getStartNodeGraphId, null)
.eq(TripleInfo::getId, needDeleteId).update();
} }
// 更新状态
tripleInfoService.lambdaUpdate().set(TripleInfo::getAddNeo4j, "0")
.set(TripleInfo::getEndNodeGraphId, null)
.set(TripleInfo::getRelGraphId, null)
.set(TripleInfo::getStartNodeGraphId, null)
.eq(TripleInfo::getId, needDeleteId).update();
} }
return "保存三元组成功";
return ("成功插入" + i + "条信息");
} }
} }

Loading…
Cancel
Save