4. 图数据构建流程
反欺诈图谱的价值不在于“图数据库装了多少数据”,而在于实体是否可对齐、关系是否可解释、schema 是否可演进。本章把图数据构建拆成五个可落地的阶段:数据源接入、实体识别、关系抽取、图 schema 设计、数据清洗与入图。每个阶段都给出工程判断标准,并用一个“申请—设备—联系人—商户”反欺诈场景贯穿说明。
一、核心原理:图数据构建的本质是“对齐 + 约束”
图数据构建不是简单的 ETL,而是把多源异构记录映射为实体节点与关系边,并保证同一现实对象在不同数据源中能被归并到同一个节点。其核心约束有三条:
- 唯一性:一个身份证号、一个设备指纹、一个手机号在图中只能有一个主节点,避免“同人多节点”导致风险传播断裂。
- 可追溯:每条边应保留来源系统、时间戳、置信度,便于事后审计与模型解释。
- 可演进:schema 要支持新增实体类型和关系类型,不能因业务变化而全量重建。
二、方法流程:五阶段流水线
下面给出从原始数据到可查询图谱的标准流程,每个阶段都有明确的输入、输出与质量门禁。
| 阶段 | 输入 | 核心动作 | 输出 | 质量门禁 |
|---|---|---|---|---|
| 数据源接入 | 申请日志、设备埋点、通讯录、商户库 | 批量/流式接入,字段映射 | 统一原始表 | 字段完整率 ≥ 98% |
| 实体识别 | 原始表 | 规则 + 模型抽取实体 | 候选实体集 | 实体召回率 ≥ 95% |
| 关系抽取 | 候选实体 + 共现记录 | 共现、时序、规则推导 | 候选关系三元组 | 关系准确率 ≥ 90% |
| 图 schema 设计 | 业务问题 + 候选实体关系 | 定义节点/边/属性/索引 | schema 文件 | 覆盖核心查询路径 |
| 数据清洗与入图 | 三元组 + schema | 去重、冲突消解、批量写入 | 图数据库 | 入图成功率 ≥ 99% |
三、关键阶段实战要点
1. 数据源接入
反欺诈数据通常分为三类:身份类(身份证、手机号)、行为类(登录、申请、交易)、关联类(通讯录、设备共用、商户绑定)。接入时统一为“主体—事件—客体”结构,便于后续抽取。
# 示例:申请日志字段映射配置
source: apply_log
mapping:
subject_id: user_id
subject_type: "person"
event_time: apply_time
object_id: device_id
object_type: "device"
relation: "used_device"
confidence: 0.95
2. 实体识别
实体识别分规则层与模型层。规则层处理强标识(身份证、银行卡号正则),模型层处理弱标识(姓名、地址、商户名)。弱标识必须结合上下文,否则“张伟”会误合并大量无关人员。
3. 关系抽取
关系抽取有三种来源:显式关系(通讯录直接存储)、共现关系(同一设备登录多个账号)、推导关系(A 与 B 共用设备,B 与 C 共用银行卡,则 A 与 C 存在二度关联)。共现关系需设置时间窗口,避免把半年前的无关共现当成强关系。
# 共现关系抽取伪代码
for device in devices:
users = query_users_by_device(device, window="7d")
for u1, u2 in combinations(users, 2):
emit_edge(u1, u2, "co_used_device",
confidence=0.8, source=device)
4. 图 schema 设计
schema 设计要围绕查询路径,而不是围绕数据表。反欺诈常见查询包括:某设备关联多少账号、某商户周边一度邻居、某团伙的最短路径。据此定义节点标签、边类型与索引。
# 图 schema 片段(YAML 风格)
nodes:
Person: {pk: person_id, props: [name, id_card, phone]}
Device: {pk: device_id, props: [fingerprint, os]}
Merchant:{pk: merchant_id, props: [name, category]}
edges:
USED_DEVICE: {from: Person, to: Device, props: [ts, confidence]}
CONTACT: {from: Person, to: Person, props: [ts, source]}
BOUND_MERCHANT:{from: Person, to: Merchant, props: [ts, role]}
indexes:
- {label: Person, prop: id_card, unique: true}
- {label: Device, prop: fingerprint, unique: true}
5. 数据清洗与入图
清洗重点解决三类冲突:重复节点(同一身份证多个 person_id)、属性冲突(不同来源手机号不一致)、时间倒挂(关系时间早于实体创建时间)。入图时采用批量写入 + 幂等 upsert,避免重复边。
# 入图命令示例(Cypher 风格)
MERGE (p:Person {person_id: $pid})
SET p.name = $name, p.phone = $phone
MERGE (d:Device {device_id: $did})
MERGE (p)-[r:USED_DEVICE {ts: $ts}]->(d)
SET r.confidence = $conf
四、案例与复盘:某消费金融反欺诈图谱构建
某消费金融公司初期把申请日志、设备埋点、通讯录分别导入图库,结果发现同一用户因手机号变更产生 3 个 Person 节点,团伙识别召回率仅 62%。复盘后采取三项改进:
- 主键归一:以身份证号为主键,手机号、设备指纹作为属性,弱标识通过投票合并。
- 关系置信度:共现关系按时间窗口和共现次数计算置信度,低于 0.6 的边不参与传播。
- schema 版本化:新增“商户—设备”关系时,通过 schema 版本号灰度上线,避免全量重建。
改进后团伙识别召回率提升至 89%,误报率下降 17%。关键经验是:图构建的质量取决于对齐策略和置信度设计,而不是图数据库的写入速度。