-- ============================================================
-- 视图：viw_kg_form_neighbors —— ERP 知识图谱·表单一跳子图 (GraphRAG 扩展步)
-- 每个表单一行，物化它的 1-hop 邻域：下游单据 / 上游单据 / 引用的实体表。
-- 这是 GraphRAG 检索的「图扩展」步骤：向量召回一张表单卡片后，直接 JOIN 本视图
-- 取出它的 L2(单据流转) + L3(实体引用) 邻居，拼成子图上下文喂给 LLM。
--
--   L2 下游 sDownIds/sDownForms  = 本单据可生成的目标单据(viw_kg_edge_flow, src侧, 非自环)
--   L2 上游 sUpForms            = 可生成本单据的上游单据(edge_flow, tgt侧)
--   L3 引用 sRefTables          = 本表数据源引用到的实体/主数据表(viw_kg_edge_ref, 去重)
--
-- 节点粒度 = 表单 sFormId (1748)。L2 按菜单粒度，L3 按数据源表粒度。
-- 表内 GROUP_CONCAT 邻居列表都很短(下游≤5, 引用≤18)，默认 max_len 足够。
-- ============================================================
CREATE OR REPLACE VIEW viw_kg_form_neighbors AS
SELECT
    fm.sFormId,
    fm.sModuleId,
    fm.sFormTitle,
    fm.sDomain,
    fm.sDataSource,
    fm.iUpstream,
    fm.iDownstream,
    up.names   AS sUpForms,      -- 上游单据名
    dn.names   AS sDownForms,    -- 下游单据名
    dn.ids     AS sDownIds,      -- 下游单据 moduleId(便于程序继续扩展)
    rf.tables  AS sRefTables     -- 引用的实体/主数据表
FROM viw_kg_form fm
LEFT JOIN (
    SELECT sSrcModuleId AS mid,
           GROUP_CONCAT(DISTINCT sTgtName ORDER BY sTgtName SEPARATOR '，') AS names,
           GROUP_CONCAT(DISTINCT sTgtModuleId SEPARATOR ',')                AS ids
    FROM viw_kg_edge_flow WHERE bSelfLoop = 0 GROUP BY sSrcModuleId
) dn ON dn.mid = fm.sModuleId
LEFT JOIN (
    SELECT sTgtModuleId AS mid,
           GROUP_CONCAT(DISTINCT sSrcName ORDER BY sSrcName SEPARATOR '，') AS names
    FROM viw_kg_edge_flow WHERE bSelfLoop = 0 GROUP BY sTgtModuleId
) up ON up.mid = fm.sModuleId
LEFT JOIN (
    SELECT sSrcTable,
           GROUP_CONCAT(DISTINCT sTgtTable ORDER BY sTgtTable SEPARATOR ',') AS tables
    FROM viw_kg_edge_ref GROUP BY sSrcTable
) rf ON rf.sSrcTable = LOWER(fm.sDataSource);
