Files
bxh/docs/kg-redesign/entity_alignment_publish_policy.md

204 lines
4.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 知识抽取入图前的实体对齐与发布策略
## 为什么不能直接把抽取结果写成新节点
城市知识图谱已经有高德 API 采集来的 POI 骨架数据,包括:
- `element_id / place_id`
- 名称、地址、类别、评分、开放时间
- 经纬度
- 公交站、地铁站、线路等交通节点
- 原图谱已有的 `LOCATED_IN / HAS_TAG / STOPS_AT` 等关系
百科、网页、小红书、抖音抽取出来的知识,通常是语义知识,例如:
- 历史事件
- 文化概念
- 景点组成
- 票价、面积、美誉、建议游玩时长
- 周边景点
如果直接把抽取结果写成 `ent_huaxi_park` 这种新节点,就会丢掉原 POI 的空间能力和交通关系,形成两个“花溪公园”:
```text
高德花溪公园:有经纬度、评分、交通关系
百科花溪公园:有历史、事件、概念、属性
```
这不是生产级图谱。正确做法是:**高德 POI 作为 Anchor非结构化抽取结果作为 Evidence 和 Knowledge Patch。**
## 正确流程
```text
1. 高德/API 数据入图
-> 形成 Anchor Layer
-> Place 节点带坐标、地址、类别、评分、交通关系
2. 百度百科/网页/小红书/抖音采集
-> 保存为 Evidence
3. kg_schema_v1 抽取
-> Entity / Event / Concept / Relation / Statement / SchemaProposal
4. Entity Alignment
-> 把抽取实体和已有图谱实体做对齐
-> exact match / possible match / new candidate / conflict
5. Conflict Resolution
-> 无冲突且分数 >= 0.8:自动发布
-> 模型不一致、低分、实体歧义、字段冲突:人工审核
6. Publish
-> 把事件、概念、属性、关系挂到已有 Anchor 节点
-> 保留 evidence_quote、confidence、source
```
## Anchor 优先规则
对于城市 KG实体主键优先级
```text
1. 高德 element_id / place_id
2. 官方数据源 ID
3. 已有图谱 canonical id
4. LLM 抽取 temp_id
```
LLM 生成的 `temp_id` 只用于本次抽取内部引用,不能直接当作生产主键。
例如:
```text
ent_huaxi_park
-> SAME_AS
amap:B035300A51
```
正式查询应优先查:
```cypher
MATCH (p:Place {element_id:'amap:B035300A51'})-[r]->(m)
RETURN p,r,m
```
而不是只查:
```cypher
MATCH (p {id:'ent_huaxi_park'})-[r]->(m)
RETURN p,r,m
```
## 对齐结果类型
| 类型 | 含义 | 是否自动发布 |
|---|---|---|
| `SAME_AS` | 基本确定是同一实体 | 是 |
| `POSSIBLE_MATCH` | 很可能相关,但名称/类型存在歧义 | 不直接合并,进入人工或低风险关系 |
| `RELATED_TO` | 相关但不是同一实体 | 可发布关系,不合并节点 |
| `NEW_CANDIDATE` | 图谱中不存在的新实体 | 分数 >= 0.8 可候选发布 |
| `CONFLICT` | 与已有高可信字段冲突 | 人工审核 |
## 字段冲突处理
字段不能简单覆盖。按来源权重和语义含义处理:
```text
高德 open_time = 08:30-18:30
百科 opening_hours = 全天开放收费时段8:30-18:00
```
这不是马上覆盖,而应保留为:
```text
p.open_time = 高德开放时间
p.kg_opening_hours = 百科抽取开放时间
```
同时写入 provenance
```text
source = amap / baike
confidence
evidence_quote
updated_at
```
如果两个来源表达同一字段但明显冲突,再创建人工审核项。
## 交通关系必须来自已有图谱或空间计算
百科不会可靠提供公交/地铁网络。交通可达应来自:
```text
高德 POI 坐标
公交/地铁站点 POI
公交线路 STOPS_AT 关系
空间距离计算
路线时间 API 或缓存
```
推荐关系:
```text
(:Place)-[:NEAR_TRANSIT {distance_m, station_type}]->(:Place)
(:BusLine)-[:STOPS_AT {seq}]->(:Place)
(:Place)-[:NEARBY_ATTRACTION]->(:Place)
```
这样后续用户问:
```text
我怎么去花溪公园?
花溪公园附近有什么公交地铁?
我到青岩古镇能不能顺路去花溪公园?
```
系统能先从目的地 POI 找附近交通节点,再结合线路和路线时间回答。
## Auto Schema 在这里应该做什么
Auto Schema 不是替代已有业务脑子,也不是让模型随便改图谱。它应该做:
```text
抽取中发现新类型/关系/字段
-> 形成 Schema Proposal
-> 统计来源数量、证据数量、置信度
-> 人工或规则审核
-> 版本化升级 schema
```
例如:
```text
NEAR_TRANSIT
NEARBY_ATTRACTION
HAS_OPENING_HOURS
HAS_SCENIC_LEVEL
ManagementChangeEvent
```
这些可以进入 proposal但事实数据不需要等待 schema 审核全部完成,稳定关系可以先以候选关系入图。
## 花溪公园当前修正结果
当前已把 `kg_schema_v1` 抽取结果对齐回高德锚点:
```text
canonical: amap:B035300A51
name: 花溪公园
lat/lng: 保留高德坐标
kg_description / kg_opening_hours / kg_scenic_level: 来自百科抽取
HAS_EVENT: 9
HAS_CONCEPT: 6
HAS_PART: 7
NEAR_TRANSIT: 7
NEARBY_ATTRACTION -> 青岩古镇: 已对齐到 amap:B035300ESE
```
对应脚本:
```text
scripts/align_huaxi_kg_with_existing_graph.py
```