|
@@ -1,9 +1,11 @@
|
|
|
package com.pavis.backend.slim.project.system.service.impl;
|
|
|
|
|
|
import cn.hutool.core.date.DateUtil;
|
|
|
+import cn.hutool.crypto.digest.MD5;
|
|
|
import com.alibaba.fastjson2.JSON;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.pavis.backend.slim.common.constant.Hodgepodge;
|
|
|
import com.pavis.backend.slim.common.utils.SecurityUtils;
|
|
|
import com.pavis.backend.slim.project.system.client.HttpClientUtil;
|
|
|
import com.pavis.backend.slim.project.system.domain.SysEntityInstance;
|
|
@@ -67,8 +69,7 @@ public class SysKgServiceImpl extends ServiceImpl<SysKgMapper, SysKg> implements
|
|
|
kg.setCreateTime(DateUtil.date());
|
|
|
// 存储kg信息
|
|
|
baseMapper.insert(kg);
|
|
|
- // todo 调用算法初始化图谱接口
|
|
|
- // 1. 获取文档列表
|
|
|
+ // 处理前端传过来的文件字段--fileIds
|
|
|
List<String> li = new ArrayList();
|
|
|
if (kg.getFileIds().indexOf(",") < 1) {
|
|
|
li.add(kg.getFileIds());
|
|
@@ -78,11 +79,12 @@ public class SysKgServiceImpl extends ServiceImpl<SysKgMapper, SysKg> implements
|
|
|
li.add(split[i]);
|
|
|
}
|
|
|
}
|
|
|
- Map map = new HashMap();
|
|
|
+ // 1. 获取文档列表
|
|
|
List<SysFile> listFile = kgCom(li);
|
|
|
log.info("json:{}", listFile);
|
|
|
log.info("url:{}", JSON.toJSONString(url));
|
|
|
-
|
|
|
+ // 将处理好的map,传给算法,调用算法接口
|
|
|
+ Map map = new HashMap();
|
|
|
map.put("id", kg.getKgId());
|
|
|
map.put("files", listFile);
|
|
|
log.info("map:{}", JSON.toJSONString(map));
|
|
@@ -90,6 +92,12 @@ public class SysKgServiceImpl extends ServiceImpl<SysKgMapper, SysKg> implements
|
|
|
return kg;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 将数据库中文件整理成集合的公共方法
|
|
|
+ *
|
|
|
+ * @param list
|
|
|
+ * @return 文件的集合
|
|
|
+ */
|
|
|
public List<SysFile> kgCom(List<String> list) {
|
|
|
List<SysFile> l = new ArrayList();
|
|
|
for (String str : list) {
|
|
@@ -101,9 +109,10 @@ public class SysKgServiceImpl extends ServiceImpl<SysKgMapper, SysKg> implements
|
|
|
|
|
|
@Override
|
|
|
public List listKg() {
|
|
|
+ // 获取知识库
|
|
|
List<SysKb> listKb = sysKbMapper.selectList(new QueryWrapper<>());
|
|
|
List l = new ArrayList();
|
|
|
- Map m = new HashMap();
|
|
|
+ // 将知识库所有数据,构造成前端所需的树结构
|
|
|
for (SysKb sysKb : listKb) {
|
|
|
TreeFile tre = new TreeFile();
|
|
|
tre.setId(sysKb.getKbId());
|
|
@@ -113,11 +122,11 @@ public class SysKgServiceImpl extends ServiceImpl<SysKgMapper, SysKg> implements
|
|
|
tre.setChildList(list);
|
|
|
l.add(tre);
|
|
|
}
|
|
|
-
|
|
|
- log.info("tre:{}", JSON.toJSONString(l));
|
|
|
+ log.info("返参树结构:{}", JSON.toJSONString(l));
|
|
|
return l;
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
public List<SysKg> list(SysKg kg) {
|
|
|
return baseMapper.selectList(new QueryWrapper<SysKg>().eq("user_id", SecurityUtils.getUserId()));
|
|
|
}
|
|
@@ -125,53 +134,99 @@ public class SysKgServiceImpl extends ServiceImpl<SysKgMapper, SysKg> implements
|
|
|
@Override
|
|
|
public void algorithm(AlgSpO algSpO) {
|
|
|
log.info("算法传参map:{}", JSON.toJSONString(algSpO));
|
|
|
+ // todo 先这么做,以后还需改动
|
|
|
Integer integer = 0;
|
|
|
if (integer == 0) {
|
|
|
for (Map map : algSpO.getSpo()) {
|
|
|
- // 插入起始点实例
|
|
|
- SysEntityInstance sysEntityInstanceS = new SysEntityInstance();
|
|
|
- sysEntityInstanceS.setUserId(001L); // 001默认算法那边的用户id
|
|
|
- sysEntityInstanceS.setCreateBy("001");
|
|
|
- sysEntityInstanceS.setCreateTime(DateUtil.date());
|
|
|
- // 插入终点实例
|
|
|
- SysEntityInstance sysEntityInstanceO = new SysEntityInstance();
|
|
|
- sysEntityInstanceO.setUserId(001L); // 001默认算法那边的用户id
|
|
|
- sysEntityInstanceO.setCreateBy("001");
|
|
|
- sysEntityInstanceO.setCreateTime(DateUtil.date());
|
|
|
-
|
|
|
- sysEntityInstanceS.setName((String) map.get("s"));
|
|
|
- sysEntityInstanceMapper.insert(sysEntityInstanceS);
|
|
|
- sysEntityInstanceO.setName((String) map.get("o"));
|
|
|
- sysEntityInstanceMapper.insert(sysEntityInstanceO);
|
|
|
- // 插入实例关系
|
|
|
- SysEntityRelation sysEntityRelation = new SysEntityRelation();
|
|
|
- sysEntityRelation.setKgId(algSpO.getKgId());
|
|
|
- sysEntityRelation.setUserId(001L);
|
|
|
- sysEntityRelation.setStart((String) map.get("s"));
|
|
|
- sysEntityRelation.setStartId(sysEntityInstanceS.getInstanceId());
|
|
|
- sysEntityRelation.setRelation((String) map.get("p"));
|
|
|
- sysEntityRelation.setEnd((String) map.get("o"));
|
|
|
- sysEntityRelation.setEndId(sysEntityInstanceO.getInstanceId());
|
|
|
- sysEntityRelationMapper.insert(sysEntityRelation);
|
|
|
+ // check库里是否存在此值
|
|
|
+ String s = md5Check(MD5.create().digestHex16((String) map.get("s")));
|
|
|
+ // 临时变量,将起点id赋值给sCopy,最后用于实例关系插入时使用
|
|
|
+ String sCopy = "";
|
|
|
+ if (s.equals("false")) {
|
|
|
+ // 插入起始点实例
|
|
|
+ SysEntityInstance sysEntityInstanceS = new SysEntityInstance();
|
|
|
+ // 创建实例
|
|
|
+ sysEntityInstanceS.setUserId(Hodgepodge.ALGORITHM);
|
|
|
+ sysEntityInstanceS.setCreateBy(String.valueOf(Hodgepodge.ALGORITHM));
|
|
|
+ sysEntityInstanceS.setCreateTime(DateUtil.date());
|
|
|
+ sysEntityInstanceS.setInstanceId(MD5.create().digestHex16((String) map.get("s")));
|
|
|
+ sysEntityInstanceS.setName((String) map.get("s"));
|
|
|
+ sysEntityInstanceMapper.insert(sysEntityInstanceS);
|
|
|
+ sCopy = MD5.create().digestHex16((String) map.get("s"));
|
|
|
+ } else {
|
|
|
+ sCopy = s;
|
|
|
+ }
|
|
|
+ String o = md5Check(MD5.create().digestHex16((String) map.get("o")));
|
|
|
+ String oCopy = "";
|
|
|
+ if (o.equals("false")) {
|
|
|
+ // 插入终点实例
|
|
|
+ SysEntityInstance sysEntityInstanceO = new SysEntityInstance();
|
|
|
+ // 创建实例
|
|
|
+ sysEntityInstanceO.setUserId(Hodgepodge.ALGORITHM);
|
|
|
+ sysEntityInstanceO.setCreateBy(String.valueOf(Hodgepodge.ALGORITHM));
|
|
|
+ sysEntityInstanceO.setCreateTime(DateUtil.date());
|
|
|
+ sysEntityInstanceO.setInstanceId(MD5.create().digestHex16((String) map.get("o")));
|
|
|
+ sysEntityInstanceO.setName((String) map.get("o"));
|
|
|
+ sysEntityInstanceMapper.insert(sysEntityInstanceO);
|
|
|
+ oCopy = MD5.create().digestHex16((String) map.get("o"));
|
|
|
+ } else {
|
|
|
+ oCopy = o;
|
|
|
+ }
|
|
|
+ // 对算法那边出现的重复数据进行去去重判断,如果数据库里有数据,则不在插入;如果数据库里没有,则进行插入
|
|
|
+ List<SysEntityRelation> list = sysEntityRelationMapper.selectList(new QueryWrapper<SysEntityRelation>()
|
|
|
+ .eq("kg_id", algSpO.getKgId())
|
|
|
+ .eq("start_id", sCopy)
|
|
|
+ .eq("end_id", oCopy));
|
|
|
+ if (list.size() == Hodgepodge.NUMBER) {
|
|
|
+ // 插入实例关系
|
|
|
+ SysEntityRelation sysEntityRelation = new SysEntityRelation();
|
|
|
+ sysEntityRelation.setKgId(algSpO.getKgId());
|
|
|
+ sysEntityRelation.setUserId(Hodgepodge.ALGORITHM);
|
|
|
+ sysEntityRelation.setStart((String) map.get("s"));
|
|
|
+ sysEntityRelation.setStartId(sCopy);
|
|
|
+ sysEntityRelation.setRelation((String) map.get("p"));
|
|
|
+ sysEntityRelation.setEnd((String) map.get("o"));
|
|
|
+ sysEntityRelation.setEndId(oCopy);
|
|
|
+ sysEntityRelationMapper.insert(sysEntityRelation);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 判断数据库内是否存在相同的数据
|
|
|
+ *
|
|
|
+ * @param instanceId 唯一id
|
|
|
+ * @return 如果库里有值,直接将库里的值返回;如果没有,则返回false
|
|
|
+ */
|
|
|
+ public String md5Check(String instanceId) {
|
|
|
+ List<SysEntityInstance> listEIM = sysEntityInstanceMapper.selectList(new QueryWrapper<SysEntityInstance>()
|
|
|
+ .eq("instance_id", instanceId));
|
|
|
+ if (listEIM.size() > 0) {
|
|
|
+ return listEIM.get(0).getInstanceId();
|
|
|
+ } else {
|
|
|
+ return "false";
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public Integer delectKg(List<String> list) {
|
|
|
- int num = 0;
|
|
|
+ int num = Hodgepodge.NUMBER;
|
|
|
for (String kg : list) {
|
|
|
num += baseMapper.deleteById(kg);
|
|
|
+ // 删除跟此图谱有关的关联数据
|
|
|
List<SysEntityRelation> listR = sysEntityRelationMapper.selectList(new QueryWrapper<SysEntityRelation>()
|
|
|
.eq("kg_id", kg));
|
|
|
- if (listR.size() > 0) {
|
|
|
+ if (listR.size() > Hodgepodge.NUMBER) {
|
|
|
+ // 删除此图谱的所有实例
|
|
|
for (SysEntityRelation sysEntityR : listR) {
|
|
|
- List l = new ArrayList();
|
|
|
- l.add(sysEntityR.getStartId());
|
|
|
- l.add(sysEntityR.getEndId());
|
|
|
- sysEntityInstanceMapper.deleteBatchIds(l);
|
|
|
+ sysEntityInstanceMapper.delete(new QueryWrapper<SysEntityInstance>()
|
|
|
+ .eq("instance_id", sysEntityR.getStartId())
|
|
|
+ .or()
|
|
|
+ .eq("instance_id", sysEntityR.getEndId()));
|
|
|
}
|
|
|
}
|
|
|
+ // 删除此图谱的所有关系
|
|
|
sysEntityRelationMapper.delete(new QueryWrapper<SysEntityRelation>()
|
|
|
.eq("kg_id", kg));
|
|
|
}
|
|
@@ -180,18 +235,44 @@ public class SysKgServiceImpl extends ServiceImpl<SysKgMapper, SysKg> implements
|
|
|
|
|
|
@Override
|
|
|
public KgReturn kgTreeReturn(String kgId) {
|
|
|
+ // 根据图谱id,获取此图谱的相关关系
|
|
|
List<SysEntityRelation> listKg = sysEntityRelationMapper.selectList(new QueryWrapper<SysEntityRelation>()
|
|
|
.eq("kg_id", kgId));
|
|
|
+ // 最后返参的数据结构--kgReturn
|
|
|
KgReturn kgReturn = new KgReturn();
|
|
|
- if (listKg.size() > 0) {
|
|
|
- List nodesList = new ArrayList(); // 实例集合
|
|
|
- List edgesList = new ArrayList(); // 关系集合
|
|
|
+ if (listKg.size() > Hodgepodge.NUMBER) {
|
|
|
+ // 图谱实例集合
|
|
|
+ List nodesList = new ArrayList();
|
|
|
+ // 图谱关系集合
|
|
|
+ List<KgRelation> edgesList = new ArrayList();
|
|
|
for (SysEntityRelation entity : listKg) {
|
|
|
- // 插入关系
|
|
|
KgRelation kgRelation = new KgRelation();
|
|
|
- kgRelation.setSource(entity.getStartId());
|
|
|
- kgRelation.setTarget(entity.getEndId());
|
|
|
- kgRelation.setLabel(entity.getRelation());
|
|
|
+ if (edgesList.size() > 0 && edgesList != null) {
|
|
|
+ // todo 对于相互皆有关系的数据,进行处理,日后还需优化
|
|
|
+ for (int i = 0; i < edgesList.size(); i++) {
|
|
|
+ KgRelation k = edgesList.get(i);
|
|
|
+ if (k.getSource().equals(entity.getEndId()) && k.getTarget().equals(entity.getStartId())) {
|
|
|
+ // todo 优化位置
|
|
|
+ // k.setType("quadratic");
|
|
|
+ // 插入关系
|
|
|
+ kgRelation.setSource(entity.getStartId());
|
|
|
+ kgRelation.setTarget(entity.getEndId());
|
|
|
+ kgRelation.setLabel(entity.getRelation());
|
|
|
+ // todo 优化位置
|
|
|
+ // kgRelation.setType("quadratic");
|
|
|
+ } else {
|
|
|
+ // 插入关系
|
|
|
+ kgRelation.setSource(entity.getStartId());
|
|
|
+ kgRelation.setTarget(entity.getEndId());
|
|
|
+ kgRelation.setLabel(entity.getRelation());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 插入关系
|
|
|
+ kgRelation.setSource(entity.getStartId());
|
|
|
+ kgRelation.setTarget(entity.getEndId());
|
|
|
+ kgRelation.setLabel(entity.getRelation());
|
|
|
+ }
|
|
|
edgesList.add(kgRelation);
|
|
|
// 插入实例
|
|
|
KgInstance kgInstance = new KgInstance();
|
|
@@ -205,7 +286,7 @@ public class SysKgServiceImpl extends ServiceImpl<SysKgMapper, SysKg> implements
|
|
|
}
|
|
|
kgReturn.setNodes(nodesList);
|
|
|
kgReturn.setEdges(edgesList);
|
|
|
- log.info("返参结构:{}",JSON.toJSONString(kgReturn));
|
|
|
+ log.info("返参结构:{}", JSON.toJSONString(kgReturn));
|
|
|
}
|
|
|
return kgReturn;
|
|
|
}
|