From 3cd20c4c4e1193856e7b75dbe18ee35db92bb420 Mon Sep 17 00:00:00 2001 From: liu Date: Wed, 3 Apr 2024 17:30:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/IdentifyIntentException.java | 54 ++++++++ .../exception/ItemExtractException.java | 54 ++++++++ kbqa-graph/pom.xml | 6 + .../main/java/com/supervision/ai/AiUtil.java | 81 ++++++++++++ .../com/supervision/ai/dto/ChatReqDTO.java | 13 ++ .../com/supervision/ai/dto/ChatResDTO.java | 37 ++++++ .../supervision/ai/dto/IdentifyIntentDTO.java | 11 ++ .../com/supervision/ai/dto/MessageDTO.java | 15 +++ .../supervision/enums/IdentifyIntentEnum.java | 33 +++++ .../handler/ConditionJudgeHandler.java | 32 +++++ .../handler/IdentifyIntentHandler.java | 45 +++++++ .../handler/ItemExtractHandler.java | 33 +++++ nGQL/demo_data.ngql | 117 ++++++++++++++++++ nGQL/init_schema.ngql | 29 +++++ 14 files changed, 560 insertions(+) create mode 100644 kbqa-common/src/main/java/com/supervision/exception/IdentifyIntentException.java create mode 100644 kbqa-common/src/main/java/com/supervision/exception/ItemExtractException.java create mode 100644 kbqa-graph/src/main/java/com/supervision/ai/AiUtil.java create mode 100644 kbqa-graph/src/main/java/com/supervision/ai/dto/ChatReqDTO.java create mode 100644 kbqa-graph/src/main/java/com/supervision/ai/dto/ChatResDTO.java create mode 100644 kbqa-graph/src/main/java/com/supervision/ai/dto/IdentifyIntentDTO.java create mode 100644 kbqa-graph/src/main/java/com/supervision/ai/dto/MessageDTO.java create mode 100644 kbqa-graph/src/main/java/com/supervision/enums/IdentifyIntentEnum.java create mode 100644 kbqa-graph/src/main/java/com/supervision/handler/ConditionJudgeHandler.java create mode 100644 kbqa-graph/src/main/java/com/supervision/handler/IdentifyIntentHandler.java create mode 100644 kbqa-graph/src/main/java/com/supervision/handler/ItemExtractHandler.java create mode 100644 nGQL/demo_data.ngql create mode 100644 nGQL/init_schema.ngql diff --git a/kbqa-common/src/main/java/com/supervision/exception/IdentifyIntentException.java b/kbqa-common/src/main/java/com/supervision/exception/IdentifyIntentException.java new file mode 100644 index 0000000..ee2dfd9 --- /dev/null +++ b/kbqa-common/src/main/java/com/supervision/exception/IdentifyIntentException.java @@ -0,0 +1,54 @@ +package com.supervision.exception; + +import org.springframework.http.HttpStatus; + +public class IdentifyIntentException extends RuntimeException { + /** + * 异常编码 + */ + private final Integer code; + + /** + * 异常信息 + */ + private final String message; + + public IdentifyIntentException(Throwable cause) { + super(cause); + this.code = HttpStatus.INTERNAL_SERVER_ERROR.value(); + this.message = null; + + } + + public IdentifyIntentException(Throwable cause, String message) { + super(cause); + this.code = HttpStatus.INTERNAL_SERVER_ERROR.value(); + this.message = message; + + } + + public IdentifyIntentException(String message) { + this.code = HttpStatus.INTERNAL_SERVER_ERROR.value(); + this.message = message; + } + + public IdentifyIntentException(String message, Integer code) { + this.message = message; + this.code = code; + } + + public IdentifyIntentException(String message, Throwable e) { + super(message, e); + this.code = HttpStatus.INTERNAL_SERVER_ERROR.value(); + this.message = message; + } + + @Override + public String getMessage() { + return message; + } + + public Integer getCode() { + return code; + } +} diff --git a/kbqa-common/src/main/java/com/supervision/exception/ItemExtractException.java b/kbqa-common/src/main/java/com/supervision/exception/ItemExtractException.java new file mode 100644 index 0000000..bb3c476 --- /dev/null +++ b/kbqa-common/src/main/java/com/supervision/exception/ItemExtractException.java @@ -0,0 +1,54 @@ +package com.supervision.exception; + +import org.springframework.http.HttpStatus; + +public class ItemExtractException extends RuntimeException { + /** + * 异常编码 + */ + private final Integer code; + + /** + * 异常信息 + */ + private final String message; + + public ItemExtractException(Throwable cause) { + super(cause); + this.code = HttpStatus.INTERNAL_SERVER_ERROR.value(); + this.message = null; + + } + + public ItemExtractException(Throwable cause, String message) { + super(cause); + this.code = HttpStatus.INTERNAL_SERVER_ERROR.value(); + this.message = message; + + } + + public ItemExtractException(String message) { + this.code = HttpStatus.INTERNAL_SERVER_ERROR.value(); + this.message = message; + } + + public ItemExtractException(String message, Integer code) { + this.message = message; + this.code = code; + } + + public ItemExtractException(String message, Throwable e) { + super(message, e); + this.code = HttpStatus.INTERNAL_SERVER_ERROR.value(); + this.message = message; + } + + @Override + public String getMessage() { + return message; + } + + public Integer getCode() { + return code; + } +} diff --git a/kbqa-graph/pom.xml b/kbqa-graph/pom.xml index aa3410c..a05ab1f 100644 --- a/kbqa-graph/pom.xml +++ b/kbqa-graph/pom.xml @@ -76,6 +76,12 @@ 1.2.1 + + io.jsonwebtoken + jjwt + 0.9.1 + + diff --git a/kbqa-graph/src/main/java/com/supervision/ai/AiUtil.java b/kbqa-graph/src/main/java/com/supervision/ai/AiUtil.java new file mode 100644 index 0000000..8887889 --- /dev/null +++ b/kbqa-graph/src/main/java/com/supervision/ai/AiUtil.java @@ -0,0 +1,81 @@ +package com.supervision.ai; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.json.JSONUtil; +import com.supervision.ai.dto.ChatReqDTO; +import com.supervision.ai.dto.ChatResDTO; +import com.supervision.ai.dto.MessageDTO; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import lombok.extern.slf4j.Slf4j; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Slf4j +public class AiUtil { + + private static final String API_KEY = "985ddf220e63f7f9fd3a038c93515724.7dKiAoSSm3JHqkTW"; + + private static final String TOKEN; + + static { + try { + String[] split = API_KEY.split("\\."); + String id = split[0]; + String secret = split[1]; + + long nowMillis = System.currentTimeMillis(); + long exp = nowMillis + (24 * 60 * 60 * 1000); + + Map header = new HashMap<>(); + header.put("alg", "HS256"); + header.put("sign_type", "SIGN"); + + Map payload = new HashMap<>(); + payload.put("api_key", id); + payload.put("exp", exp); + payload.put("timestamp", nowMillis); + + TOKEN = Jwts.builder() + .setHeader(header) + .setClaims(payload) + .setExpiration(new Date(exp)) + .signWith(SignatureAlgorithm.HS256, secret.getBytes()) + .compact(); + + } catch (Exception e) { + throw new RuntimeException("Invalid apikey", e); + } + } + + public static String chat(String message) { + ChatReqDTO chatReqDTO = new ChatReqDTO(); + chatReqDTO.setModel("glm-3-turbo"); + MessageDTO messageDTO = new MessageDTO(); + messageDTO.setRole("user"); + messageDTO.setContent(message); + chatReqDTO.setMessages(CollUtil.newArrayList(messageDTO)); + HttpResponse response = HttpRequest.post("https://open.bigmodel.cn/api/paas/v4/chat/completions") + .body(JSONUtil.toJsonStr(chatReqDTO)).header("Authorization", TOKEN).execute(); + String body = response.body(); + ChatResDTO bean = JSONUtil.toBean(body, ChatResDTO.class); + return bean.getChoices().stream().findFirst().orElseThrow(() -> new RuntimeException("获取政策文件失败")).getMessage().getContent(); + } + + public static String chatByMessage(List messageList) { + ChatReqDTO chatReqDTO = new ChatReqDTO(); + chatReqDTO.setModel("glm-3-turbo"); + chatReqDTO.setMessages(messageList); + HttpResponse response = HttpRequest.post("https://open.bigmodel.cn/api/paas/v4/chat/completions") + .body(JSONUtil.toJsonStr(chatReqDTO)).header("Authorization", TOKEN).execute(); + String body = response.body(); + ChatResDTO bean = JSONUtil.toBean(body, ChatResDTO.class); + return bean.getChoices().stream().findFirst().orElseThrow(() -> new RuntimeException("获取政策文件失败")).getMessage().getContent(); + } + +} diff --git a/kbqa-graph/src/main/java/com/supervision/ai/dto/ChatReqDTO.java b/kbqa-graph/src/main/java/com/supervision/ai/dto/ChatReqDTO.java new file mode 100644 index 0000000..e738faf --- /dev/null +++ b/kbqa-graph/src/main/java/com/supervision/ai/dto/ChatReqDTO.java @@ -0,0 +1,13 @@ +package com.supervision.ai.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class ChatReqDTO { + + private String model; + + private List messages; +} diff --git a/kbqa-graph/src/main/java/com/supervision/ai/dto/ChatResDTO.java b/kbqa-graph/src/main/java/com/supervision/ai/dto/ChatResDTO.java new file mode 100644 index 0000000..34c5a30 --- /dev/null +++ b/kbqa-graph/src/main/java/com/supervision/ai/dto/ChatResDTO.java @@ -0,0 +1,37 @@ +package com.supervision.ai.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class ChatResDTO { + + private List choices; + private int created; + private String id; + private String model; + private String request_id; + private Usage usage; + + @Data + public static class Choices { + private String finish_reason; + private int index; + private Message message; + } + + @Data + public static class Message { + private String content; + private String role; + } + + @Data + public static class Usage { + private int completion_tokens; + private int prompt_tokens; + private int total_tokens; + } + +} diff --git a/kbqa-graph/src/main/java/com/supervision/ai/dto/IdentifyIntentDTO.java b/kbqa-graph/src/main/java/com/supervision/ai/dto/IdentifyIntentDTO.java new file mode 100644 index 0000000..756730c --- /dev/null +++ b/kbqa-graph/src/main/java/com/supervision/ai/dto/IdentifyIntentDTO.java @@ -0,0 +1,11 @@ +package com.supervision.ai.dto; + +import lombok.Data; + +@Data +public class IdentifyIntentDTO { + + private String intent; + + private String sentence; +} diff --git a/kbqa-graph/src/main/java/com/supervision/ai/dto/MessageDTO.java b/kbqa-graph/src/main/java/com/supervision/ai/dto/MessageDTO.java new file mode 100644 index 0000000..4399d2d --- /dev/null +++ b/kbqa-graph/src/main/java/com/supervision/ai/dto/MessageDTO.java @@ -0,0 +1,15 @@ +package com.supervision.ai.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class MessageDTO { + + private String role; + + private String content; +} diff --git a/kbqa-graph/src/main/java/com/supervision/enums/IdentifyIntentEnum.java b/kbqa-graph/src/main/java/com/supervision/enums/IdentifyIntentEnum.java new file mode 100644 index 0000000..fde0b22 --- /dev/null +++ b/kbqa-graph/src/main/java/com/supervision/enums/IdentifyIntentEnum.java @@ -0,0 +1,33 @@ +package com.supervision.enums; + +import cn.hutool.core.collection.CollUtil; + +import java.util.ArrayList; +import java.util.List; + +public enum IdentifyIntentEnum { + 业务的受理条件("业务的受理条件", CollUtil.newArrayList("")), + 业务的办理流程("业务的办理流程", CollUtil.newArrayList("")), + 业务的材料清单("业务的材料清单", CollUtil.newArrayList("")), + 业务的设定依据("业务的设定依据", CollUtil.newArrayList("")), + 业务的实施依据("业务的实施依据", CollUtil.newArrayList("")), + 业务的办理途径("业务的办理途径", CollUtil.newArrayList("")), + 业务的办理窗口("业务的办理窗口", CollUtil.newArrayList("")); + + private String intent; + + private List explainList; + + IdentifyIntentEnum(String intent, List explainList) { + this.intent = intent; + this.explainList = explainList; + } + + public String getIntent() { + return intent; + } + + public List getExplainList() { + return explainList; + } +} diff --git a/kbqa-graph/src/main/java/com/supervision/handler/ConditionJudgeHandler.java b/kbqa-graph/src/main/java/com/supervision/handler/ConditionJudgeHandler.java new file mode 100644 index 0000000..51089a8 --- /dev/null +++ b/kbqa-graph/src/main/java/com/supervision/handler/ConditionJudgeHandler.java @@ -0,0 +1,32 @@ +package com.supervision.handler; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.supervision.ai.AiUtil; +import com.supervision.ai.dto.MessageDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * 条件判断handler + */ +@Slf4j +@Component +public class ConditionJudgeHandler { + + public String conditionJudge(String question, Collection candidateAnswerList, String userAnswer) { + List messageList = new ArrayList<>(); + messageList.add(new MessageDTO("system", "你是一个条件判断模型且精通政务事项,我现在给你一个问题,给你候选答案,请你根据用户的实际回答,从候选答案中给我选择一个对应的候选答案.除了候选答案,什么其他的都不要说")); + messageList.add(new MessageDTO("assistant", "好的")); + messageList.add(new MessageDTO("user", StrUtil.format("问题:[{}]", question))); + messageList.add(new MessageDTO("assistant", "继续")); + messageList.add(new MessageDTO("user", StrUtil.format("候选答案:[{};未找到匹配答案]", StrUtil.join(";", candidateAnswerList)))); + messageList.add(new MessageDTO("assistant", "继续")); + messageList.add(new MessageDTO("user", StrUtil.format("用户答案:[{}],现在请给我匹配的候选答案,其他什么都不要说.", userAnswer))); + return AiUtil.chatByMessage(messageList); + } +} diff --git a/kbqa-graph/src/main/java/com/supervision/handler/IdentifyIntentHandler.java b/kbqa-graph/src/main/java/com/supervision/handler/IdentifyIntentHandler.java new file mode 100644 index 0000000..8a0a969 --- /dev/null +++ b/kbqa-graph/src/main/java/com/supervision/handler/IdentifyIntentHandler.java @@ -0,0 +1,45 @@ +package com.supervision.handler; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.supervision.ai.AiUtil; +import com.supervision.ai.dto.MessageDTO; +import com.supervision.enums.IdentifyIntentEnum; +import com.supervision.exception.IdentifyIntentException; +import io.lettuce.core.dynamic.annotation.CommandNaming; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +/** + * 意图识别handler + */ +@Component +public class IdentifyIntentHandler { + + public void identifyIntent(String question) { + // 首先生成提示词 + List messageList = new ArrayList<>(); + messageList.add(new MessageDTO("system", "假设你是一个意图识别模型,且精通社会保险业务中的事务分类," + + "现在我会给你一个意图列表以及意图列表可能的一些典型问法,你首先要根据意图列表和典型问法进行学习(典型问法只是参考,并不一定局限于典型问法范围)," + + "然后我再给你一个句子,请帮我的要求识别出这个句子中的意图.如果该句子中不含有意图列表中任意意图,你可以输出:未匹配。不要回答其他的内容!!")); + messageList.add(new MessageDTO("assistant", "好的")); + // 构建学习案例 + StringBuilder stringBuilder = new StringBuilder(); + for (IdentifyIntentEnum value : IdentifyIntentEnum.values()) { + stringBuilder.append("意图:").append(value.getIntent()).append(";").append("典型问法:").append(CollUtil.join(value.getExplainList(), ",")).append("\n"); + } + messageList.add(new MessageDTO("user", stringBuilder.toString())); + messageList.add(new MessageDTO("assistant", "已学习")); + // 构建问题 + messageList.add(new MessageDTO("user", "问题是:" + question + ",现在请用列表的形式展示,如果该句子中不含有指定的意图,你可以输出:未识别。" + + "如果有,你就选一个列表中的词进行回答!输出格式形为:意图名称。除了这个列表以外请不要输出别的多余的话。")); + // 进行提问 + String intent = AiUtil.chatByMessage(messageList); + // 尝试转为JSON的形式 + if (StrUtil.equals("未识别", intent)) { + throw new IdentifyIntentException("意图未识别"); + } + } +} diff --git a/kbqa-graph/src/main/java/com/supervision/handler/ItemExtractHandler.java b/kbqa-graph/src/main/java/com/supervision/handler/ItemExtractHandler.java new file mode 100644 index 0000000..a0da4ff --- /dev/null +++ b/kbqa-graph/src/main/java/com/supervision/handler/ItemExtractHandler.java @@ -0,0 +1,33 @@ +package com.supervision.handler; + +import cn.hutool.core.util.StrUtil; +import com.supervision.ai.AiUtil; +import com.supervision.ai.dto.MessageDTO; +import com.supervision.exception.ItemExtractException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +/** + * 意图提取Handler + */ +@Slf4j +@Component +public class ItemExtractHandler { + + public String itemExtract(String question) { + List messageList = new ArrayList<>(); + messageList.add(new MessageDTO("system", "假设你是一个命名实体识别模型且精通社保实体识别." + + "现在我会给你一个句子,请根据我的要求识别出句子中的实体数据在社保业务中属于哪一类业务事项,并给我事项名称,如果未找到事项,就回复:未找到;其他什么都不要说!")); + messageList.add(new MessageDTO("assistant", "好的")); + messageList.add(new MessageDTO("user", "句子是:" + question + ";请识别这句话中的社保业务事项")); + String item = AiUtil.chatByMessage(messageList); + if (StrUtil.equals("未找到", item)) { + throw new ItemExtractException("未从问题中找到事项"); + } + return item; + + } +} diff --git a/nGQL/demo_data.ngql b/nGQL/demo_data.ngql new file mode 100644 index 0000000..fc5c3fd --- /dev/null +++ b/nGQL/demo_data.ngql @@ -0,0 +1,117 @@ +# 插入一级树枝节点,退休 +insert vertex `item_branch` ( `item_name`) values "1":("退休"); + +# 插入二级树枝节点,城乡居保退休,企业职工退休 +insert vertex `item_branch` ( `item_name`) values "1-1":("城乡居保退休"),"1-2":("企业职工退休"); + +# 建立连接关系 +insert edge `dependence_edge`() values "1"->"1-1":(),"1"->"1-2":(); + +# 插入三级叶子节点,深圳城乡居民退休 +insert vertex `item_leaf` ( `item_name`) values "1-1-1":("深圳城乡居民退休"); + +# 建立连接关系,城乡居保退休下级节点深圳城乡居民退休和非深圳城乡居民退休 +insert edge `dependence_edge`() values "1-1"->"1-1-1":(),"1-1"->"1-1-2":(); + +# 插入办理条件节点 +insert vertex `process_condition` ( `detail`) values "1-1-1-1":("深圳城乡居民退休条件...内容待补充"); +# 插入叶子节点和办理条件节点之间的关系 +insert edge `process_condition_edge`() values "1-1-1"->"1-1-1-1":(); + +# 插入条件节点,深圳城乡居民退休条件 +insert vertex `condition` ( `condition`, `entity_type`) values "1-1-1-1-1":("城乡居民退休", "退休类型"); +insert vertex `condition` ( `condition`, `entity_type`) values "1-1-1-1-1-1":("深圳户口", "户口所在地"); +insert vertex `condition` ( `condition`, `entity_type`) values "1-1-1-1-1-1-1":("年满60岁", "年龄"); +# 建立连接关系,深圳城乡居民退休条件下的所有办理条件 +insert edge `condition_edge`() values "1-1-1-1"->"1-1-1-1-1":(),"1-1-1-1-1"->"1-1-1-1-1-1":(),"1-1-1-1-1-1"->"1-1-1-1-1-1-1":(); + + +# 插入三级叶子节点,非深圳城乡居民退休 +insert vertex `item_leaf` ( `item_name`) values "1-1-2":("非深圳城乡居民退休"); +# 建立连接关系,城乡居保退休下级节点非深圳城乡居民退休 +insert edge `dependence_edge`() values "1-1"->"1-1-2":(); +# 插入办理条件节点 +insert vertex `process_condition` ( `detail`) values "1-1-2-1":("非深圳城乡居民退休条件...内容待补充"); +# 插入叶子节点和办理条件节点之间的关系 +insert edge `process_condition_edge`() values "1-1-2"->"1-1-2-1":(); +# 插入条件节点,非深圳城乡居民退休 +insert vertex `condition` ( `condition`, `entity_type`) values "1-1-2-1-1":("城乡居民退休", "退休类型"); +insert vertex `condition` ( `condition`, `entity_type`) values "1-1-2-1-1-1":("港澳台和外籍人员", "户口所在地"); +insert vertex `condition` ( `condition`, `entity_type`) values "1-1-2-1-1-1-1":("年满60岁", "年龄"); +insert vertex `condition` ( `condition`, `entity_type`) values "1-1-2-1-1-1-1-1":("非居民","缴费年限"); +# 建立连接关系,非深圳城乡居民退休条件下的所有办理条件 +insert edge `condition_edge`() values "1-1-2-1"->"1-1-2-1-1":(),"1-1-2-1-1"->"1-1-2-1-1-1":(),"1-1-2-1-1-1"->"1-1-2-1-1-1-1":(),"1-1-2-1-1-1-1"->"1-1-2-1-1-1-1-1":(); + + + +# 插入三级叶子节点,深圳企业职工退休,非深圳企业职工退休 +insert vertex `item_leaf` ( `item_name`) values "1-2-1":("深圳企业职工退休"),"1-2-2":("广东省其他地区企业职工退休"),"1-2-3":("省外户口企业职工退休"),"1-2-4":("港澳台和外籍人员企业职工退休"); + +# 建立连接关系,企业职工退休下级节点深圳企业职工退休/广东省其他地区企业职工退休/省外户口企业职工退休/港澳台和外籍人员企业职工退休 +insert edge `dependence_edge`() values "1-2"->"1-2-1":(),"1-2"->"1-2-2":(),"1-2"->"1-2-3":(),"1-2"->"1-2-4":(); +# 插入深圳企业职工办理条件节点 +insert vertex `process_condition` ( `detail`) values "1-2-1-1":("深圳企业职工退休条件...内容待补充"); +# 插入叶子节点和办理条件节点之间的关系 +insert edge `process_condition_edge`() values "1-2-1"->"1-2-1-1":(); +# 插入条件节点,深圳企业职工退休 +insert vertex `condition` ( `condition`, `entity_type`) values "1-2-1-1-1":("企业职工退休", "退休类型"); +insert vertex `condition` ( `condition`, `entity_type`) values "1-2-1-1-1-1":("深圳户口", "户口所在地"); +insert vertex `condition` ( `condition`, `entity_type`) values "1-2-1-1-1-1-1":("年满60岁", "年龄"); +insert vertex `condition` ( `condition`, `entity_type`) values "1-2-1-1-1-1-1-1":("已转入", "异地社保转入情况"); +insert vertex `condition` ( `condition`, `entity_type`) values "1-2-1-1-1-1-1-2":("无异地社保", "异地社保转入情况"); +insert vertex `condition` ( `condition`, `entity_type`) values "1-2-1-1-1-1-1-1-1":("实际缴费年限+视同缴费年限满15年", "缴费年限"); +# 建立连接关系,深圳企业职工退休条件下的所有办理条件 +insert edge `condition_edge`() values "1-2-1-1"->"1-2-1-1-1":(),"1-2-1-1-1"->"1-2-1-1-1-1":(),"1-2-1-1-1-1"->"1-2-1-1-1-1-1":(), + "1-2-1-1-1-1-1"->"1-2-1-1-1-1-1-1":(),"1-2-1-1-1-1-1-1"->"1-2-1-1-1-1-1-1-1":(), + "1-2-1-1-1-1-1"->"1-2-1-1-1-1-1-2":(),"1-2-1-1-1-1-1-2"->"1-2-1-1-1-1-1-1-1":(); + +# 插入广东省其他地区企业职工办理条件节点 +insert vertex `process_condition` ( `detail`) values "1-2-2-1":("广东省其他地区企业职工退休条件...内容待补充"); +# 插入叶子节点和办理条件节点之间的关系 +insert edge `process_condition_edge`() values "1-2-2"->"1-2-2-1":(); +# 插入条件节点,广东省其他地区企业职工退休 +insert vertex `condition` ( `condition`, `entity_type`) values "1-2-2-1-1":("企业职工退休", "退休类型"); +insert vertex `condition` ( `condition`, `entity_type`) values "1-2-2-1-1-1":("广东省其他地区", "户口所在地"); +insert vertex `condition` ( `condition`, `entity_type`) values "1-2-2-1-1-1-1":("年满60岁", "年龄"); +insert vertex `condition` ( `condition`, `entity_type`) values "1-2-2-1-1-1-1-1":("已转入", "异地社保转入情况"); +insert vertex `condition` ( `condition`, `entity_type`) values "1-2-2-1-1-1-1-2":("无异地社保", "异地社保转入情况"); +insert vertex `condition` ( `condition`, `entity_type`) values "1-2-2-1-1-1-1-1-1":("实际缴费年限+视同缴费年限满15年", "缴费年限"); +# 建立连接关系,广东省其他地区企业职工退休条件下的所有办理条件 +insert edge `condition_edge`() values "1-2-2-1"->"1-2-2-1-1":(),"1-2-2-1-1"->"1-2-2-1-1-1":(),"1-2-2-1-1-1"->"1-2-2-1-1-1-1":(), + "1-2-2-1-1-1-1"->"1-2-2-1-1-1-1-1":(),"1-2-2-1-1-1-1-1"->"1-2-2-1-1-1-1-1-1":(), + "1-2-2-1-1-1-1"->"1-2-2-1-1-1-1-2":(),"1-2-2-1-1-1-1-2"->"1-2-2-1-1-1-1-1-1":(); + +# 插入省外户口企业职工办理条件节点 +insert vertex `process_condition` ( `detail`) values "1-2-3-1":("省外户口企业职工退休条件...内容待补充"); +# 插入叶子节点和办理条件节点之间的关系 +insert edge `process_condition_edge`() values "1-2-3"->"1-2-3-1":(); +# 插入条件节点,省外户口企业职工退休 +insert vertex `condition` ( `condition`, `entity_type`) values "1-2-3-1-1":("企业职工退休", "退休类型"); +insert vertex `condition` ( `condition`, `entity_type`) values "1-2-3-1-1-1":("省外户口", "户口所在地"); +insert vertex `condition` ( `condition`, `entity_type`) values "1-2-3-1-1-1-1":("年满60岁", "年龄"); +insert vertex `condition` ( `condition`, `entity_type`) values "1-2-3-1-1-1-1-1":("已转入", "异地社保转入情况"); +insert vertex `condition` ( `condition`, `entity_type`) values "1-2-3-1-1-1-1-2":("无异地社保", "异地社保转入情况"); +insert vertex `condition` ( `condition`, `entity_type`) values "1-2-3-1-1-1-1-1-1":("实际缴费年限+视同缴费年限满15年", "缴费年限"); + +# 建立连接关系,省外户口企业职工退休条件下的所有办理条件 +insert edge `condition_edge`() values "1-2-3-1"->"1-2-3-1-1":(),"1-2-3-1-1"->"1-2-3-1-1-1":(),"1-2-3-1-1-1"->"1-2-3-1-1-1-1":(), + "1-2-3-1-1-1-1"->"1-2-3-1-1-1-1-1":(),"1-2-3-1-1-1-1-1"->"1-2-3-1-1-1-1-1-1":(), + "1-2-3-1-1-1-1"->"1-2-3-1-1-1-1-2":(),"1-2-3-1-1-1-1-2"->"1-2-3-1-1-1-1-1-1":(); + +# 插入港澳台和外籍人员企业职工办理条件节点 +insert vertex `process_condition` ( `detail`) values "1-2-4-1":("港澳台和外籍人员企业职工退休条件...内容待补充"); +# 插入叶子节点和办理条件节点之间的关系 +insert edge `process_condition_edge`() values "1-2-4"->"1-2-4-1":(); +# 插入条件节点,港澳台和外籍人员企业职工退休 +insert vertex `condition` ( `condition`, `entity_type`) values "1-2-4-1-1":("企业职工退休", "退休类型"); +insert vertex `condition` ( `condition`, `entity_type`) values "1-2-4-1-1-1":("港澳台和外籍人员", "户口所在地"); +insert vertex `condition` ( `condition`, `entity_type`) values "1-2-4-1-1-1-1":("年满60岁", "年龄"); +insert vertex `condition` ( `condition`, `entity_type`) values "1-2-4-1-1-1-1-1":("已转入", "异地社保转入情况"); +insert vertex `condition` ( `condition`, `entity_type`) values "1-2-4-1-1-1-1-2":("无异地社保", "异地社保转入情况"); +insert vertex `condition` ( `condition`, `entity_type`) values "1-2-4-1-1-1-1-1-1":("实际缴费年限+视同缴费年限满15年", "缴费年限"); +# 建立连接关系,港澳台和外籍人员企业职工退休条件下的所有办理条件 +insert edge `condition_edge`() values "1-2-4-1"->"1-2-4-1-1":(),"1-2-4-1-1"->"1-2-4-1-1-1":(),"1-2-4-1-1-1"->"1-2-4-1-1-1-1":(), + "1-2-4-1-1-1-1"->"1-2-4-1-1-1-1-1":(),"1-2-4-1-1-1-1-1"->"1-2-4-1-1-1-1-1-1":(), + "1-2-4-1-1-1-1"->"1-2-4-1-1-1-1-2":(),"1-2-4-1-1-1-1-2"->"1-2-4-1-1-1-1-1-1":(); + + diff --git a/nGQL/init_schema.ngql b/nGQL/init_schema.ngql new file mode 100644 index 0000000..d492e5b --- /dev/null +++ b/nGQL/init_schema.ngql @@ -0,0 +1,29 @@ +# Create Space +CREATE SPACE `kbqa` (partition_num = 10, replica_factor = 1, charset = utf8, collate = utf8_bin, vid_type = FIXED_STRING(64)) comment = '深圳人社知识图谱'; +USE `kbqa`; + +# Create Tag: +CREATE TAG `accept_scope` ( `detail` string NOT NULL) ttl_duration = 0, ttl_col = "", comment = "受理范围"; +CREATE TAG `checklist` ( `detail` string NOT NULL) ttl_duration = 0, ttl_col = "", comment = "材料清单"; +CREATE TAG `condition` ( `condition` string NOT NULL, `entity_type` string NOT NULL) ttl_duration = 0, ttl_col = "", comment = "条件(condition 判断条件;entityType实体类型(数据库配置))"; +CREATE TAG `handler_channel` ( `detail` string NOT NULL) ttl_duration = 0, ttl_col = "", comment = "办理途径"; +CREATE TAG `handler_place` ( `detail` string NOT NULL) ttl_duration = 0, ttl_col = "", comment = "办理窗口"; +CREATE TAG `handler_process` ( `detail` string NOT NULL) ttl_duration = 0, ttl_col = "", comment = "办理流程"; +CREATE TAG `item_branch` ( `item_name` string NOT NULL) ttl_duration = 0, ttl_col = "", comment = "事项名称(子节点)"; +CREATE TAG `item_leaf` ( `item_name` string NOT NULL) ttl_duration = 0, ttl_col = "", comment = "事项名称(叶子结点)"; +CREATE TAG `process_condition` ( `detail` string NOT NULL) ttl_duration = 0, ttl_col = "", comment = "办理条件"; + +# Create Edge: +CREATE EDGE `accept_scope_edge` () ttl_duration = 0, ttl_col = "", comment = "受理范围"; +CREATE EDGE `checklist_edge` () ttl_duration = 0, ttl_col = "", comment = "办理清单"; +CREATE EDGE `condition_edge` () ttl_duration = 0, ttl_col = "", comment = "条件"; +CREATE EDGE `dependence_edge` () ttl_duration = 0, ttl_col = "", comment = "从属(两个子节点之间/子节点和叶子节点)"; +CREATE EDGE `handler_channel_edge` () ttl_duration = 0, ttl_col = "", comment = "办理途径"; +CREATE EDGE `handler_place_edge` () ttl_duration = 0, ttl_col = "", comment = "办理窗口"; +CREATE EDGE `handler_process_edge` () ttl_duration = 0, ttl_col = "", comment = "办理流程"; +CREATE EDGE `process_condition_edge` () ttl_duration = 0, ttl_col = "", comment = "办理条件"; +:sleep 20; + +# Create Index: +CREATE TAG INDEX `item_branch_item_name_index` ON `item_branch` ( `item_name`(100)); +CREATE TAG INDEX `item_leaf_item_name_index` ON `item_leaf` ( `item_name`(100)); \ No newline at end of file