引言
风控反欺诈的本质是识别「关系」中的异常:单看一个账户很正常,但当 100 个账户共用同一台设备、同一批联系人、同一张银行卡时,黑产团伙的轮廓立刻浮现。这正是图数据库的主场——关联分析。
本文系统讲反欺诈图谱实战:先讲欺诈图谱的数据建模(把设备/IP/账户/银行卡/联系人建成图),再讲四大图谱分析技法——团伙识别、环检测、中介中心性、社区边界;接着把图谱能力接入规则引擎与机器学习特征;最后给出实时反欺诈查询优化与大规模风控图谱的工程落地要点。
前置:/graphdb-modeling-patterns/(图建模)、/graphdb-algorithms-practice/(图算法)、/graphdb-transactions-indexing/(索引)、/graphdb-cluster-operations/(集群)。
目录
- 1. 欺诈图谱的数据建模
- 2. 团伙识别:社群发现与连通分量
- 3. 环检测:资金回流的图足迹
- 4. 中介中心性与关键节点
- 5. 图谱规则引擎:从算法到业务规则
- 6. 图特征提取:喂给机器学习
- 7. 实时反欺诈查询优化
- 8. 大规模风控图谱工程落地
- 9. 完整风控流水线案例
- 10. 速查表
- 延伸阅读
1. 欺诈图谱的数据建模
1.1 实体与关系
欺诈图谱的经典实体与关系:
// 实体节点
(:Account) // 账户/账号
(:Device) // 设备指纹(IMEI/IDFV)
(:IP) // 登录 IP
(:Card) // 银行卡
(:Phone) // 手机号
(:Contact) // 通讯录联系人
(:Order) // 订单
(:Merchant) // 商户
// 关系
(a:Account)-[:LOGIN_ON]->(d:Device)
(a:Account)-[:LOGIN_FROM]->(ip:IP)
(a:Account)-[:BINDS_CARD]->(c:Card)
(a:Account)-[:USES_PHONE]->(p:Phone)
(a:Account)-[:PLACED]->(o:Order)
(a:Account)-[:CONTACTED]->(c2:Account)
1.2 关键:把「弱信号」建模为关系
欺诈往往藏在弱关联里:
// 弱关联示例:不同账户绑定同一手机号、同一设备、同一收货地址
CREATE CONSTRAINT IF NOT EXISTS FOR (a:Account) REQUIRE a.id IS UNIQUE;
(a1:Account {id:'A-001'})-[:BINDS_CARD]->(:Card {no:'6222****'})
(a2:Account {id:'A-002'})-[:BINDS_CARD]->(:Card {no:'6222****'}) // 与 A-001 同一张卡
(a3:Account {id:'A-003'})-[:LOGIN_ON]->(:Device {fp:'device-xyz'}) // 与 A-001 同一设备
1.3 建模要点
1. 实体一定要有唯一 ID 约束(防重复节点)
2. 关系要尽量「细粒度」——设备、IP、卡片、通讯录都是独立节点
3. 属性打时间戳,支持「一段时间内共用」的判断
4. 白名单/黑名单作为节点标签或属性标记
一句话总结:反欺诈图谱的建模核心是把「账户背后的共享信号」——设备、IP、卡片、手机号、通讯录——都建成节点,团伙的共性就在这些共享关系里暴露。
2. 团伙识别:社群发现与连通分量
2.1 连通分量:先看「连成片」的规模
// 投影整个关联图
CALL gds.graph.project('fraud-graph', ['Account','Device','IP','Card','Phone'], '*')
YIELD graphName, nodeCount, relationshipCount;
// 弱连通分量:找出所有「连在一起的团块」
CALL gds.wcc.stream('fraud-graph')
YIELD nodeId, componentId
RETURN componentId, count(*) AS size
ORDER BY size DESC
LIMIT 10;
规则:单个账号成团(size=1)正常;size≥5 且成员都是不同账户时,高度疑似团伙。
2.2 Louvain 模块度聚类:更精细的团伙
// 团伙内部连接紧密、外部稀疏 → Louvain 模块度聚类
CALL gds.louvain.stream('fraud-graph', {relationshipWeightProperty: null})
YIELD nodeId, communityId, intermediateCommunityIds
RETURN gds.util.asNode(nodeId).id AS entity,
communityId,
intermediateCommunityIds
ORDER BY communityId;
2.3 团伙评分
// 把团伙的规模、共享设备数、黑名单命中率综合成团伙风险分
MATCH (n:Account)
WHERE n.communityId IS NOT NULL
WITH n.communityId AS cid, collect(n) AS members
RETURN cid,
size(members) AS memberCount,
apoc.coll.frequencies([m in members | coalesce(m.is_black, 0)]) AS blackStats
ORDER BY memberCount DESC
LIMIT 20;
一句话总结:团伙识别两板斧——WCC 看「连通片」规模,Louvain 看「紧密子团」结构;两者叠加基本能框定绝大多数黑产团伙。
3. 环检测:资金回流的图足迹
3.1 为什么环 = 风险信号
黑产常通过「账户互转」构造资金回流:A→B→C→A,绕开单账户限额与反洗钱规则。图上的环是这类行为的直接证据。
// 投影转账关系(有向、带金额)
CALL gds.graph.project('transfer-graph', 'Account', {
TRANSFER: {orientation: 'NATURAL', properties: ['amount']}
});
// 检测环(Neo4j GDS 无内置环算法,用 Cypher + 变长路径实现)
MATCH path = (a:Account {id:'A-001'})-[:TRANSFER*3..4]->(a)
RETURN path
LIMIT 10;
3.2 环检测的实用做法
// 检测「金额回流」:A→B→A 或 A→B→C→A
MATCH (a:Account)-[r1:TRANSFER]->(b:Account)-[r2:TRANSFER]->(c:Account)-[r3:TRANSFER]->(a)
WHERE r1.amount > 0 AND r2.amount > 0 AND r3.amount > 0
RETURN a.id, b.id, c.id, r1.amount + r2.amount + r3.amount AS cycle_flow
ORDER BY cycle_flow DESC
LIMIT 100;
3.3 环的变体:分叉归并
环不止「回流」,还有「多账户归集到一账户再分流出」:
A, B, C --资金--> X --资金--> Y, Z
这属于「资金聚集节点」,用度中心性 + 入出边比识别:
// 入边多、出边少的节点 = 资金归集点(洗钱漏斗)
MATCH (x:Account)
WITH x, size((x)<-[:TRANSFER]-()) AS in_deg, size((x)-[:TRANSFER]->()) AS out_deg
WHERE in_deg >= 5 AND out_deg <= 2
RETURN x.id, in_deg, out_deg
ORDER BY in_deg DESC;
一句话总结:环是资金回流与归集最直接的图足迹——转账环、资金漏斗(入多出少)都用图查询与度统计秒级暴露。
4. 中介中心性与关键节点
4.1 黑产的关键节点:结构洞
黑产团伙的「枢纽」账户连接多个子团伙、承担资金中转,用**中介中心性(Betweenness)**识别——它是「多少最短路径经过此节点」的度量:
CALL gds.betweenness.stream('fraud-graph')
YIELD nodeId, score
RETURN gds.util.asNode(nodeId).id AS entity, score
ORDER BY score DESC
LIMIT 20;
4.2 关键节点的业务解读
| 中心性指标 | 反欺诈含义 |
|---|---|
| 高中介中心性 | 资金/信息的「桥梁」,团伙头目或洗钱中转 |
| 高度数 | 直接接触很多账户,可能是设备农场入口 |
| 高 PageRank | 被很多重要节点指向,可能是核心账户 |
4.3 快速标记高风险枢纽
// 给枢纽账户打风险标签
CALL gds.betweenness.stream('fraud-graph')
YIELD nodeId, score
WHERE score > 0.8
WITH gds.util.asNode(nodeId) AS n, score
SET n.is_hub = true, n.hub_score = score;
一句话总结:中介中心性把「结构洞枢纽」从海量账户里挖出来——这类账户往往是团伙的组织中枢或资金中转,是人工研判的首选对象。
5. 图谱规则引擎:从算法到业务规则
5.1 典型图谱规则
把图谱特征转成可执行的业务规则:
| 规则 | 图特征 | 阈值 |
|---|---|---|
| 共享设备风险 | 账户在一台设备上的登录数 | ≥3 个账户同设备 |
| 共享卡风险 | 账户绑定的银行卡数量 | 1 张卡绑 ≥3 账户 |
| 团伙聚集风险 | 所在 Louvain 社区规模 | 社区 ≥5 账户 |
| 资金回流风险 | 是否存在 2-3 跳转账环 | 环金额 ≥ 阈值 |
| 结构洞风险 | Betweenness 分位 | ≥P95 |
| 新账户风暴 | 短时间新建账户的社区连接密度 | 社区内新账户占比 |
5.2 规则落地:预计算 + 快速命中
// 示例规则:同设备超过 3 个账户 → 立即冻结
MATCH (d:Device)<-[:LOGIN_ON]-(a:Account)
WITH d, count(a) AS accts, collect(a.id) AS ids
WHERE accts >= 3
RETURN d.fp, ids AS suspicious_accounts;
5.3 规则分层
第一层(秒级实时):单点规则(同设备、同 IP、同卡)→ 在线上查询直接命中
第二层(分钟级近实时):图特征规则(社团、枢纽、环)→ 预计算缓存
第三层(小时级离线):团伙研判与人工复核 → 离线跑 GDS 算法
一句话总结:图谱规则引擎把「算法结果」转成「可执行的业务规则」,按实时/近实时/离线三层部署——单点规则秒级拦截、图特征规则分钟级捕捉、算法离线研判。
6. 图特征提取:喂给机器学习
6.1 为什么图特征能提升风控模型
传统风控模型用「账户自身的属性」做特征;图特征加入「关系与社群」信息,显著提升团伙识别率:
单点特征:登录次数、下单金额、绑定卡数 → 只看自己
图特征 :社区规模、枢纽分、环参与数、共享设备数 → 看关系网络
6.2 可提取的图特征
// 单账户图特征汇总(一次遍历取全)
MATCH (a:Account {id:'A-001'})
RETURN
size((a)-[:LOGIN_ON]->()) AS device_count,
size((a)-[:BINDS_CARD]->()) AS card_count,
size((a)-[:CONTACTED]->()) AS contact_count,
size((a)-[:LOGIN_ON]->(:Device)<-[:LOGIN_ON]-(:Account)) AS shared_device_count,
a.degree_centrality AS degree, // 预计算
a.betweenness AS betweenness,
a.community_size AS community_size // Louvain 结果回写
6.3 图嵌入:把「邻居结构」压缩成向量
# 用 node2vec / GraphSAGE 生成节点嵌入(Neo4j GDS + Python)
from neo4j import GraphDatabase
from node2vec import Node2Vec
# 1. 导出邻接 → node2vec 训练嵌入
edges = graph_to_edge_list(...) # [(u, v), ...]
model = Node2Vec(edges, dimensions=128, walk_length=30, num_walks=200).fit()
embedding = model.wv['A-001'] # 账户 → 128 维向量
# 2. 把嵌入喂给 XGBoost/逻辑回归
features = pd.DataFrame([{**profile_features, **embed_vec} for ...])
model.fit(features, y_label) # y_label: 是否欺诈(人工标注)
6.4 GNN 端到端
若数据量足够:用 GraphSAGE / GCN 端到端学习「邻居聚合」→ 风险打分
代表库:PyTorch Geometric、DGL、Neo4j GDSL(图特征)
先从小模型 + 图特征表格开始,GNN 作为进阶
一句话总结:图特征让风控模型「看到关系」——设备/卡/联系人共享数、社区规模、枢纽分是性价比最高的图特征;规模大了再用 node2vec 嵌入或 GNN 端到端学习。
7. 实时反欺诈查询优化
7.1 在线查询要快:索引 + 投影图
实时拦截的每一次查询都要在毫秒级返回:
// 建索引:按账户 id、设备指纹、卡号
CREATE INDEX acct_id_idx IF NOT EXISTS FOR (a:Account) ON (a.id);
CREATE INDEX device_fp_idx IF NOT EXISTS FOR (d:Device) ON (d.fp);
CREATE INDEX card_no_idx IF NOT EXISTS FOR (c:Card) ON (c.no);
7.2 限制遍历深度与返回量
// 实时查询:新订单 → 检查该账户 2 跳内是否命中可疑设备/卡
MATCH (a:Account {id: $acctId})-[:LOGIN_ON]->(d:Device)<-[:LOGIN_ON]-(x:Account)
WHERE x.is_black = true
RETURN x.id LIMIT 5;
// 用 LIMIT 尽早截断;必要时用 gds.graph.project 投影专用实时子图
7.3 预计算 vs 实时计算
| 特征 | 计算方式 | 更新频率 |
|---|---|---|
| 账户自身属性 | 实时查属性 | 即时 |
| 共享设备/卡数 | 实时 Cypher(带索引) | 即时 |
| 社区/枢纽/环 | GDS 预计算回写 | 分钟/小时级 |
| 图嵌入 | 离线 node2vec/GNN | 天级 |
一句话总结:实时反欺诈 = 索引保证单点命中 + LIMIT 截断遍历 + 预计算图特征缓存;在线秒级、离线分钟级,两层配合既快又准。
8. 大规模风控图谱工程落地
8.1 规模与容量规划
账户量级 :千万 ~ 十亿级
关系量级 :亿 ~ 百亿级
内存模型 :GDS 投影图尽量放内存,Neo4j page cache 最大化
集群形态 :Causal Cluster 读写分离(见集群运维)
8.2 数据流水线
业务事件(登录/下单/转账) → Kafka → 流式写入图谱(CDC)
离线批处理(GDS 算法) → 写回风险标签 → 线上查询命中
T+1 全量重投影 → 更新社区/嵌入 → 训练/刷新模型
8.3 监控与告警
// 每小时统计新增可疑关系数
MATCH (a:Account)-[r]->(d:Device)
WHERE r.created_at > datetime() - duration({hours: 1})
AND a.is_black = true
RETURN count(r) AS new_black_links;
8.4 治理与合规
1. 数据脱敏:设备指纹、卡号、手机号需脱敏存储
2. 白名单通道:明确排除正常共享设备(家庭共享设备)
3. 误伤控制:规则命中后「观察」而非直接冻结
4. 留存:风险特征按监管要求留存审计
一句话总结:工程落地的关键是「流式入图 + 离线算法 + 实时命中」三层架构,配合容量规划、监控告警与数据治理合规。
9. 完整风控流水线案例
以「新账户注册 + 首单风控」为例:
// ① 注册时:检查设备/IP/卡的新账户共享情况
MATCH (d:Device {fp: $deviceFp})
WITH d, count((d)<-[:LOGIN_ON]-()) AS accts
WHERE accts >= 3
RETURN $acctId AS account, 'shared_device' AS risk_flag, accts;
// ② 首单时:2 跳内是否命中黑名单实体
MATCH (a:Account {id: $acctId})
-[:LOGIN_ON|BINDS_CARD|USES_PHONE*1..2]->(any)-[]->(b)
WHERE b.is_black = true
RETURN b.id AS black_entity LIMIT 5;
// ③ 离线:每天跑 Louvain + Betweenness,回写风险分
CALL gds.louvain.stream('fraud-graph')
YIELD nodeId, communityId
WITH gds.util.asNode(nodeId) AS n, communityId
SET n.community_id = communityId, n.community_size = count_over_community(communityId);
// ④ 命中输出:风控评分卡 = 单点规则 + 图特征 → 决策
// 风险分 > 80 → 拒绝;60~80 → 人工审核;<60 → 通过
流水线四层:
事件接入(Kafka) → 实时图查询(Neo4j, <50ms) → 离线GDS重算(分钟级) → 风控评分决策
一句话总结:完整风控流水线 = 注册/下单时的实时图查询 + 每日离线的社团/枢纽重算 + 评分卡决策——图数据库把「团伙维度」纳入了每一次实时决策。
10. 速查表
| 场景 | 图谱技法 |
|---|---|
| 团伙识别 | WCC + Louvain |
| 资金回流 | 转账环 + 入出比 |
| 结构洞枢纽 | Betweenness |
| 共享信号 | 设备/IP/卡/手机号共享计数 |
| 规则引擎 | 三层(实时/近实时/离线) |
| 模型特征 | 图特征 + node2vec 嵌入 |
| 实时提速 | 索引 + LIMIT + 预计算 |
| 工程落地 | Kafka 流式 + GDS 离线 + 监控 |
一句话记忆:反欺诈图谱把「账户背后的共享信号」建模成图——设备/IP/卡/手机号共享关系暴露团伙;WCC+Louvain 圈团伙、环检测抓资金回流、Betweenness 挖结构洞枢纽;图特征喂模型、规则引擎分三层落地、索引+预计算保实时毫秒级——关联分析就是反欺诈的核武器。
延伸阅读
- /graphdb-modeling-patterns/ — 欺诈图谱的建模模式
- /graphdb-algorithms-practice/ — 社群发现与中心性算法
- /graphdb-transactions-indexing/ — 索引与查询优化
- /graphdb-cluster-operations/ — 大规模图谱集群
- /graphdb-knowledge-graph/ — 风控知识图谱
- [[security]] — 金融安全与合规
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。