Commit e6dff8a62d48b11668dc67d06168986148dae0d1
1 parent
79dfd6cd
Add form-card export: viw_kg_form_card + export_form_cards.sh (deliverable 4)
Assemble one structured, embeddable text card per form (1748) merging node metadata, upstream/downstream document names, and the field 中文名 list. export_form_cards.sh emits JSONL for vector-store ingestion (group_concat_max_len raised to avoid truncating 269-field forms). Generated corpus is gitignored — regenerate deterministically via script.
Showing
3 changed files
with
96 additions
and
0 deletions
sql/.gitignore
0 → 100644
sql/export_form_cards.sh
0 → 100755
| 1 | +#!/usr/bin/env bash | ||
| 2 | +# ============================================================ | ||
| 3 | +# export_form_cards.sh —— 导出 1748 张 ERP 表单卡片为 JSONL (GraphRAG 交付物4) | ||
| 4 | +# 每行一个 JSON:{id, moduleId, title, domain, dataSource, execType, | ||
| 5 | +# aiTool, aiScene, upstream, downstream, text} | ||
| 6 | +# text = viw_kg_form_card.sCard,可直接切块灌向量库(Milvus)。 | ||
| 7 | +# | ||
| 8 | +# 依赖视图:viw_kg_form_card ← viw_kg_form ← viw_kg_edge_flow ← viw_ai_useful_forms | ||
| 9 | +# 用法: ./export_form_cards.sh [输出文件, 默认 form_cards.jsonl] | ||
| 10 | +# 注意:必须 --no-defaults(本地 ~/.my.cnf 默认指向不存在的库 xlyweberp_saas_ai)。 | ||
| 11 | +# group_concat_max_len 提到 1e6 防字段清单截断(最长表单 269 字段)。 | ||
| 12 | +# ============================================================ | ||
| 13 | +set -euo pipefail | ||
| 14 | + | ||
| 15 | +OUT="${1:-form_cards.jsonl}" | ||
| 16 | +DB_ARGS=(--no-defaults -h127.0.0.1 -P33307 -uroot -plocal xlyweberp_saas) | ||
| 17 | + | ||
| 18 | +mysql "${DB_ARGS[@]}" --batch --skip-column-names --raw 2>/dev/null <<'SQL' > "$OUT" | ||
| 19 | +SET SESSION group_concat_max_len = 1000000; | ||
| 20 | +SELECT JSON_OBJECT( | ||
| 21 | + 'id', sFormId, | ||
| 22 | + 'moduleId', sModuleId, | ||
| 23 | + 'title', sFormTitle, | ||
| 24 | + 'domain', sDomain, | ||
| 25 | + 'dataSource', sDataSource, | ||
| 26 | + 'execType', sExecType, | ||
| 27 | + 'aiTool', bAiTool, | ||
| 28 | + 'aiScene', sAiScene, | ||
| 29 | + 'upstream', sUpstreamForms, | ||
| 30 | + 'downstream', sDownstreamForms, | ||
| 31 | + 'text', sCard | ||
| 32 | +) | ||
| 33 | +FROM viw_kg_form_card | ||
| 34 | +ORDER BY sDomain, sFormTitle; | ||
| 35 | +SQL | ||
| 36 | + | ||
| 37 | +echo "wrote $(wc -l < "$OUT" | tr -d ' ') form-cards to $OUT" |
sql/viw_kg_form_card.sql
0 → 100644
| 1 | +-- ============================================================ | ||
| 2 | +-- 视图:viw_kg_form_card —— ERP 知识图谱·表单卡片 (RAG 文档, 1748 行) | ||
| 3 | +-- 每个表单一段结构化文本 sCard,用于灌入向量库做召回;另暴露结构化元数据列供过滤。 | ||
| 4 | +-- 汇聚三层图谱:节点(viw_kg_form) + 上下游单据名(viw_kg_edge_flow) + 字段中文名清单。 | ||
| 5 | +-- | ||
| 6 | +-- ⚠ 字段清单用 GROUP_CONCAT 拼接,单表单字段可达 269 个 / 2477 字, | ||
| 7 | +-- 默认 group_concat_max_len=1024 会截断 —— 查询前必须 | ||
| 8 | +-- SET SESSION group_concat_max_len = 1000000; (见 export_form_cards.sql) | ||
| 9 | +-- | ||
| 10 | +-- sCard 结构:表单名 / 业务域 / 数据源(执行类型) / 上游单据 / 下游单据 / 字段 / 标识(formId,moduleId) | ||
| 11 | +-- 节点粒度 = 表单 sFormId (1748);上下游为菜单级。 | ||
| 12 | +-- ============================================================ | ||
| 13 | +CREATE OR REPLACE VIEW viw_kg_form_card AS | ||
| 14 | +SELECT | ||
| 15 | + fm.sFormId, | ||
| 16 | + fm.sModuleId, | ||
| 17 | + fm.sFormTitle, | ||
| 18 | + fm.sModuleName, | ||
| 19 | + fm.sDomain, | ||
| 20 | + fm.sDataSource, | ||
| 21 | + fm.sExecType, | ||
| 22 | + fm.iUpstream, | ||
| 23 | + fm.iDownstream, | ||
| 24 | + fm.bAiTool, | ||
| 25 | + fm.sAiScene, | ||
| 26 | + up.names AS sUpstreamForms, -- 上游单据名(逗号) | ||
| 27 | + dn.names AS sDownstreamForms, -- 下游单据名(逗号) | ||
| 28 | + fl.field_names AS sFieldList, -- 字段中文名清单(顿号) | ||
| 29 | + CONCAT_WS('\n', | ||
| 30 | + CONCAT('【表单】', fm.sFormTitle), | ||
| 31 | + CONCAT('业务域:', fm.sDomain), | ||
| 32 | + CONCAT('数据源:', fm.sDataSource, '(', fm.sExecType, ')'), | ||
| 33 | + CONCAT('上游单据:', IFNULL(up.names, '无')), | ||
| 34 | + CONCAT('下游单据:', IFNULL(dn.names, '无')), | ||
| 35 | + CONCAT('字段:', IFNULL(fl.field_names, '')), | ||
| 36 | + CONCAT('标识:formId=', fm.sFormId, ' moduleId=', fm.sModuleId, | ||
| 37 | + CASE WHEN fm.bAiTool = 1 THEN CONCAT(' AI场景=', IFNULL(fm.sAiScene,'')) ELSE '' END) | ||
| 38 | + ) AS sCard -- 可直接向量化的卡片文本 | ||
| 39 | +FROM viw_kg_form fm | ||
| 40 | +LEFT JOIN ( | ||
| 41 | + SELECT sParentId, | ||
| 42 | + GROUP_CONCAT(DISTINCT sChinese ORDER BY iOrder SEPARATOR '、') AS field_names | ||
| 43 | + FROM gdsconfigformslave | ||
| 44 | + WHERE IFNULL(sChinese,'') <> '' AND sControlName NOT LIKE 'Btn%' | ||
| 45 | + GROUP BY sParentId | ||
| 46 | +) fl ON fl.sParentId = fm.sFormId | ||
| 47 | +LEFT JOIN ( | ||
| 48 | + SELECT sSrcModuleId AS mid, | ||
| 49 | + GROUP_CONCAT(DISTINCT sTgtName ORDER BY sTgtName SEPARATOR ',') AS names | ||
| 50 | + FROM viw_kg_edge_flow WHERE bSelfLoop = 0 GROUP BY sSrcModuleId | ||
| 51 | +) dn ON dn.mid = fm.sModuleId | ||
| 52 | +LEFT JOIN ( | ||
| 53 | + SELECT sTgtModuleId AS mid, | ||
| 54 | + GROUP_CONCAT(DISTINCT sSrcName ORDER BY sSrcName SEPARATOR ',') AS names | ||
| 55 | + FROM viw_kg_edge_flow WHERE bSelfLoop = 0 GROUP BY sTgtModuleId | ||
| 56 | +) up ON up.mid = fm.sModuleId; |