$npx -y skills add kweaver-ai/kweaver-dip --skill bkn-relation-bind基于对象绑定结果判定关系类型,绑定中间视图(data_view 类型)。
| 1 | # 关系绑定 |
| 2 | |
| 3 | 公约:`../_shared/contract.md` |
| 4 | |
| 5 | ## 做什么 |
| 6 | |
| 7 | 在对象类绑定完成后,分析已绑定对象的视图 schema,判定每条关系的类型(direct 或 data_view),并为 data_view 类型推荐/绑定中间视图。 |
| 8 | |
| 9 | ## 触发时机 |
| 10 | |
| 11 | 在 `bkn-bind` 之后、`bkn-map` 之前执行。此时对象类已绑定到具体数据视图,可以分析视图间的关联关系。 |
| 12 | |
| 13 | ## 输入 |
| 14 | |
| 15 | - `binding_decision_list`:`bkn-bind` 的输出(bound 对象列表) |
| 16 | - `view_schema_map`:各对象视图的字段 schema + 外键信息 |
| 17 | - `relation_list`:关系清单(来自 `bkn-extract`) |
| 18 | - `dataview_availability`:可选,平台可用视图列表(用于中间视图推荐) |
| 19 | |
| 20 | ## 关系类型判定规则 |
| 21 | |
| 22 | ### direct 类型 |
| 23 | |
| 24 | 满足以下条件之一: |
| 25 | |
| 26 | | 条件 | 说明 | |
| 27 | |------|------| |
| 28 | | 起点视图有字段直接引用终点视图 | 外键关系:`orders.product_code → products.product_code` | |
| 29 | | 起点属性与终点属性同名且类型兼容 | 如 `supplier_code` 在两端都存在 | |
| 30 | | 单数据源内的主键-外键关系 | 同一数据库内可直接 JOIN | |
| 31 | |
| 32 | ### data_view 类型 |
| 33 | |
| 34 | 满足以下条件之一: |
| 35 | |
| 36 | | 条件 | 说明 | |
| 37 | |------|------| |
| 38 | | 起点视图无字段直接引用终点视图 | 需中间表做桥梁 | |
| 39 | | 跨数据源 | 起点对象和终点对象来自不同数据源 | |
| 40 | | 多对多关系的中间表 | 如"订单-产品"通过"订单明细"关联 | |
| 41 | | 业务描述提及中间实体 | 文本中有"订单明细"、"关联表"等线索 | |
| 42 | |
| 43 | ## 流程 |
| 44 | |
| 45 | ### 1. 遍历关系清单 |
| 46 | |
| 47 | 对每条关系执行: |
| 48 | |
| 49 | ``` |
| 50 | 1. 获取起点对象的 view_schema |
| 51 | 2. 获取终点对象的 view_schema |
| 52 | 3. 检查起点视图是否有字段直接引用终点视图(外键检查) |
| 53 | 4. 检查起点属性名是否与终点属性名匹配(同名检查) |
| 54 | 5. 判定类型: |
| 55 | - 有直接关联 → direct |
| 56 | - 无直接关联 → data_view |
| 57 | ``` |
| 58 | |
| 59 | ### 2. direct 类型处理 |
| 60 | |
| 61 | ``` |
| 62 | 1. 提取 Mapping Rules: |
| 63 | - 从外键信息提取 Source Property → Target Property |
| 64 | - 或从同名属性提取映射 |
| 65 | 2. 输出到 direct_relations 列表 |
| 66 | ``` |
| 67 | |
| 68 | ### 3. data_view 类型处理 |
| 69 | |
| 70 | ``` |
| 71 | 1. 中间视图推荐: |
| 72 | - 扫描 dataview_availability,找同时引用起点和终点视图的候选 |
| 73 | - 或根据业务名称线索匹配(如"订单明细"、"关联表") |
| 74 | - 输出候选列表(最多 5 个) |
| 75 | |
| 76 | 2. 用户确认: |
| 77 | - 有候选 → 展示候选列表,用户选择或跳过 |
| 78 | - 无候选 → 标记 pending,提示后续补绑 |
| 79 | |
| 80 | 3. 确认后提取映射: |
| 81 | - Source Mapping: 起点属性 → 中间视图字段 |
| 82 | - Target Mapping: 中间视图字段 → 终点属性 |
| 83 | ``` |
| 84 | |
| 85 | ### 4. pending 关系处理 |
| 86 | |
| 87 | ``` |
| 88 | - 不阻断流程 |
| 89 | - 输出到 pending_relations 列表 |
| 90 | - 在 pipeline_state.yaml 记录 |
| 91 | - 后续可通过 update pipeline 补绑 |
| 92 | ``` |
| 93 | |
| 94 | ## 中间视图推荐策略 |
| 95 | |
| 96 | ### 策略 1:外键链路追踪 |
| 97 | |
| 98 | ``` |
| 99 | 起点视图 → 找引用它的视图 → 这些视图是否也引用终点视图? |
| 100 | ↓ |
| 101 | 中间候选 |
| 102 | ``` |
| 103 | |
| 104 | ### 策略 2:名称线索匹配 |
| 105 | |
| 106 | ``` |
| 107 | 业务文本中提到的中间实体: |
| 108 | "订单包含多个产品" → 搜索名称含"订单明细"、"order_item"的视图 |
| 109 | |
| 110 | 匹配规则: |
| 111 | - 起点对象名 + 终点对象名 → "订单产品" |
| 112 | - 起点对象名 + "明细" → "订单明细" |
| 113 | - 起点/终点的别名组合 |
| 114 | ``` |
| 115 | |
| 116 | ### 策略 3:数据源关联表 |
| 117 | |
| 118 | ``` |
| 119 | 起点视图所属数据源 → 扫描该数据源的关联表 → 找同时含起点主键和终点主键的表 |
| 120 | ``` |
| 121 | |
| 122 | ## 输出 |
| 123 | |
| 124 | ```yaml |
| 125 | relation_binding_result: |
| 126 | direct_relations: |
| 127 | - 关系ID: "" |
| 128 | 关系名称: "" |
| 129 | 源对象: "" |
| 130 | 目标对象: "" |
| 131 | mapping_rules: |
| 132 | - source_property: "" |
| 133 | target_property: "" |
| 134 | 判定依据: "" # 如"起点视图 product_code 外键引用终点视图" |
| 135 | confidence: high | medium | low |
| 136 | |
| 137 | data_view_relations: |
| 138 | - 关系ID: "" |
| 139 | 关系名称: "" |
| 140 | 源对象: "" |
| 141 | 目标对象: "" |
| 142 | intermediate_view_id: "" # 确认后填入 |
| 143 | intermediate_view_name: "" # 确认后填入 |
| 144 | intermediate_view_candidates: # 推荐候选 |
| 145 | - view_id: "" |
| 146 | view_name: "" |
| 147 | match_reason: "" |
| 148 | confidence: high | medium | low |
| 149 | status: confirmed | pending | rejected |
| 150 | source_mapping_rules: # 确认后填入 |
| 151 | - source_property: "" |
| 152 | view_property: "" |
| 153 | target_mapping_rules: # 确认后填入 |
| 154 | - view_property: "" |
| 155 | target_property: "" |
| 156 | 判定依据: "" # 如"跨数据源,需中间视图" |
| 157 | |
| 158 | pending_relations: |
| 159 | - 关系ID: "" |
| 160 | 关系名称: "" |
| 161 | 原因: "" # 如"无匹配中间视图候选" |
| 162 | 建议: "" # 如"请手动指定中间视图或后续补绑" |
| 163 | |
| 164 | relation_binding_summary: |
| 165 | total_relations: 0 |
| 166 | direct_count: 0 |
| 167 | data_view_confirmed_count: 0 |
| 168 | data_view_pending_count: 0 |
| 169 | pending_count: 0 |
| 170 | ``` |
| 171 | |
| 172 | ## 用户确认阶段 |
| 173 | |
| 174 | 当存在 data_view 类型关系需要确认时,pipeline 会暂停并展示: |
| 175 | |
| 176 | ``` |
| 177 | 检测到 {n} 条关系需要中间视图绑定: |
| 178 | |
| 179 | 【{关系名称}】 |
| 180 | 起点对象: {源对象} → 已绑定视图: {起点视图名} |
| 181 | 终点对象: {目标对象} → 已绑定视图: {终点视图名} |
| 182 | 判定依据: {判定依据} |
| 183 | |
| 184 | 推荐中间视图: |
| 185 | 1. {候选1名} ({候选1ID}) - 匹配原因: {原因1} |
| 186 | 2. {候选2名} ({候选2ID}) - 匹配原因: {原因2} |
| 187 | ... |
| 188 | |
| 189 | 请选择: |
| 190 | A. 选择推荐候选(输入序号 1-5) |
| 191 | B. 手动指定中间视图(输入 view_id 或 view_name) |
| 192 | C. 暂时跳过,标记为 pending(后续可补绑) |
| 193 | D. 改为 direct 类型(起点属性直接关联终点属性) |
| 194 | ``` |
| 195 | |
| 196 | ## 与后续 Skill 的衔接 |
| 197 | |
| 198 | | Skill | 消费内容 | |
| 199 | |-------|----------| |
| 200 | | `bkn-map` | `direct_relations.mapping_rules` + `data_view_relations.source/target_mapping_rules`(仅 confirmed) | |
| 201 | | `bkn-draft` | 关系类型 + Mapping 结构(pending 关系生成占位符版本) | |
| 202 | | `bkn-backfill` | 关系类 Mapping View + Source/Target Mapping 回填 | |
| 203 | |
| 204 | ## 约束 |
| 205 | |
| 206 | - 仅处理 `bkn-bind` 输出的 `bound` 对象涉及的关系 |
| 207 | - 起点或终点对象为 `pending` 或 `rejected` 时,对应关系也标记为 `pending` |
| 208 | - `pending` 关系不阻断流程,可后续补绑 |
| 209 | - 推荐候选最多 5 个,置信度排序 |
| 210 | - 不编造映射规则,必须有外键或用户确认依据 |
| 211 | |
| 212 | ## 跳过条件 |
| 213 | |
| 214 | 以下情况跳过本 skill: |
| 215 | |
| 216 | - `bind_mode == deferred`(无可用数据视图) |
| 217 | - `relation_list` 为空 |
| 218 | - 所有起点/终点对象都是 `pending` 或 `rejected` |