2. 金融图谱基础:实体、关系与属性的定义

金融图谱是样本偏差校验的数据底座。在构建校验逻辑之前,必须统一对“实体”、“关系”、“属性”三个核心概念的定义,并理解它们在典型金融场景中的映射关系。本节将建立这套语义标准,为后续 Spark SQL 校验规则提供精确的数据模型依据。

2.1 实体、关系与属性的三元组定义

金融图谱采用 (实体—关系—实体) 的三元组结构来描述金融世界。每个元素在 Spark SQL 校验中对应不同的数据列和约束条件。

概念 定义 金融示例 校验关注点
实体 独立存在的业务对象,拥有唯一标识 客户、账户、交易、机构 ID 唯一性、属性完整性
关系 实体之间的语义连接,可带方向 “持有”、“转账”、“属于” 关系类型合法性、时间有效性
属性 实体或关系的特征描述 客户年龄、账户余额、交易金额 数据类型、值域范围、空值率
校验提示: 在 Spark SQL 中,实体通常存储为顶点表(Vertex Table),关系存储为边表(Edge Table)。属性列必须提前定义好数据类型(StringType、DoubleType、TimestampType 等),否则偏差校验会因隐式类型转换产生误报。

2.2 典型金融图谱模型:客户、账户、交易

以零售金融风控场景为例,最核心的图谱模型包含三类实体和两类关系。下图展示了该模型的完整结构:

典型金融图谱模型:客户-账户-交易 典型金融图谱模型:客户 — 账户 — 交易 客户 客户ID / 姓名 / 年龄 账户 账户ID / 余额 / 开户日 交易 交易ID / 金额 / 时间 持有 发生 转账 属性校验示例 客户年龄 ∈ [0,120] | 账户余额 ≥ 0 | 交易金额 > 0 | 时间戳不可为空
模型要点:
  • 客户 → 账户:一对多关系,一个客户可持有多个账户(借记卡、信用卡、理财账户)。
  • 账户 → 交易:一对多关系,一个账户可发生多笔交易(消费、转账、取现)。
  • 交易 → 交易:转账关系,一笔交易可能关联另一笔交易(对手交易)。

2.3 实体与关系的属性清单

在 Spark SQL 样本偏差校验中,每个实体和关系都需要预定义属性清单。以下为典型字段定义:

实体/关系 属性名 数据类型 校验规则
客户 client_id StringType 非空、唯一
age IntegerType 0 ≤ age ≤ 120
gender StringType ∈ {M, F, U}
账户 account_id StringType 非空、唯一
balance DoubleType balance ≥ 0
open_date DateType ≤ 当前日期
交易 txn_id StringType 非空、唯一
amount DoubleType amount > 0
txn_time TimestampType 非空、合理时间范围
持有关系 client_id StringType 外键,引用客户表
account_id StringType 外键,引用账户表
转账关系 from_txn_id StringType 外键,引用交易表
to_txn_id StringType 外键,引用交易表
常见偏差陷阱: 在真实生产数据中,balance 字段常出现负值(透支场景),age 字段可能出现 0 或 200+(数据录入错误)。这些偏差必须在 Spark SQL 校验阶段被识别并标记,否则会污染下游风控模型的特征分布。

2.4 图谱模型在 Spark SQL 中的表结构映射

金融图谱在 Spark 中通常以三张表存储:顶点表(实体)、边表(关系)、属性表(可选)。以下为建表 SQL 示例:

-- 顶点表:客户
CREATE TABLE IF NOT EXISTS dim_client (
  client_id   STRING  COMMENT '客户唯一标识',
  age         INT     COMMENT '年龄',
  gender      STRING  COMMENT '性别 M/F/U',
  create_dt   DATE    COMMENT '数据加载日期'
) USING parquet
PARTITIONED BY (create_dt);

-- 顶点表:账户
CREATE TABLE IF NOT EXISTS dim_account (
  account_id  STRING  COMMENT '账户唯一标识',
  balance     DOUBLE  COMMENT '当前余额',
  open_date   DATE    COMMENT '开户日期',
  create_dt   DATE
) USING parquet
PARTITIONED BY (create_dt);

-- 边表:持有关系
CREATE TABLE IF NOT EXISTS rel_holds (
  client_id   STRING  COMMENT '客户ID',
  account_id  STRING  COMMENT '账户ID',
  start_dt    DATE    COMMENT '关系生效日期',
  end_dt      DATE    COMMENT '关系失效日期',
  create_dt   DATE
) USING parquet
PARTITIONED BY (create_dt);
校验前置条件: 在运行样本偏差校验之前,必须确认上述三张表的 PARTITION 分区策略一致(通常按日期分区),否则 Spark SQL 的 Join 操作会产生跨分区数据倾斜,导致校验结果失真。

2.5 图谱模型与偏差校验的关联

理解实体、关系、属性的定义后,样本偏差校验的每个步骤都可以映射到图谱元素上:

  • 实体完整性校验:检查 dim_client 和 dim_account 中是否存在空 ID 或重复 ID。
  • 关系一致性校验:检查 rel_holds 中的 client_id 是否在 dim_client 中存在,account_id 是否在 dim_account 中存在。
  • 属性分布偏差校验:检查 age、balance、amount 等字段的均值、标准差、空值率是否偏离预期基线。
  • 时间序列偏差校验:检查 txn_time 的时间跨度是否与训练集一致,是否存在未来时间戳。

下图展示了从图谱模型到 Spark SQL 校验任务的完整链路:

图谱模型到 Spark SQL 校验链路 图谱模型 → Spark SQL 校验链路 实体表 关系表 Spark SQL 校验 实体完整性 关系一致性 属性分布偏差 时间序列偏差 偏差报告 偏差类型 / 严重等级 受影响实体 / 关系
核心结论: 金融图谱的实体、关系、属性定义是样本偏差校验的元数据基础。在 Spark SQL 中,每一类校验任务都对应特定的图谱元素和 SQL 模式。只有定义清晰、类型准确、约束完整的图谱模型,才能产出可信的偏差校验结果。