4. 图数据构建流程

反欺诈图谱的价值不在于“图数据库装了多少数据”,而在于实体是否可对齐、关系是否可解释、schema 是否可演进。本章把图数据构建拆成五个可落地的阶段:数据源接入、实体识别、关系抽取、图 schema 设计、数据清洗与入图。每个阶段都给出工程判断标准,并用一个“申请—设备—联系人—商户”反欺诈场景贯穿说明。

一、核心原理:图数据构建的本质是“对齐 + 约束”

图数据构建不是简单的 ETL,而是把多源异构记录映射为实体节点与关系边,并保证同一现实对象在不同数据源中能被归并到同一个节点。其核心约束有三条:

  • 唯一性:一个身份证号、一个设备指纹、一个手机号在图中只能有一个主节点,避免“同人多节点”导致风险传播断裂。
  • 可追溯:每条边应保留来源系统、时间戳、置信度,便于事后审计与模型解释。
  • 可演进:schema 要支持新增实体类型和关系类型,不能因业务变化而全量重建。
判断标准:如果两个数据源中的同一设备 ID 无法在图中合并,那么后续的社区发现、PageRank 传播都会失真。对齐是图构建的第一优先级。

二、方法流程:五阶段流水线

下面给出从原始数据到可查询图谱的标准流程,每个阶段都有明确的输入、输出与质量门禁。

阶段输入核心动作输出质量门禁
数据源接入申请日志、设备埋点、通讯录、商户库批量/流式接入,字段映射统一原始表字段完整率 ≥ 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%。复盘后采取三项改进:

  1. 主键归一:以身份证号为主键,手机号、设备指纹作为属性,弱标识通过投票合并。
  2. 关系置信度:共现关系按时间窗口和共现次数计算置信度,低于 0.6 的边不参与传播。
  3. schema 版本化:新增“商户—设备”关系时,通过 schema 版本号灰度上线,避免全量重建。

改进后团伙识别召回率提升至 89%,误报率下降 17%。关键经验是:图构建的质量取决于对齐策略和置信度设计,而不是图数据库的写入速度。

落地建议:把“实体对齐规则”和“关系置信度公式”作为图构建的核心资产单独维护,每次数据源变更都先回归这两项,再执行入图。