特性讲解技术分享
互联网金融信贷反欺诈分析 Demo 使用教程
背景
在互联网金融信贷业务中,欺诈行为往往呈现团伙化、隐蔽化的特点。传统的基于规则或单一维度的风控系统难以发现隐藏在复杂关联中的风险。
图数据库能够将用户、设备、证件、账户等实体以及它们之间的绑定关系构建为一张关联网络,并通过图算法和关联分析挖掘潜在欺诈团伙、识别风险传导路径。
本 Demo 以信贷反欺诈为场景,建立包含用户、身份证、手机号、设备、IP 等实体的风险关联网络,并演示多种图查询,帮助风控人员快速评估金融信贷欺诈风险。

图模型设计
💡在实际使用场景中,可对 Schema 进行相应修改与管理,本 Demo 暂不支持。
首先创建图类型与图空间,并执行以下语句定义节点、边结构及属性:
CREATE GRAPH TYPE IF NOT EXISTS `financial_risk_type` AS {
NODE TYPE `user` (LABEL `user`{`user_id` STRING NOT NULL, `name` STRING DEFAULT NULL, `is_blacklist` BOOL DEFAULT NULL, `is_overdue` BOOL DEFAULT NULL, `credit_limit_increase_times` INT64 DEFAULT NULL, `is_credited` BOOL DEFAULT NULL, PRIMARY KEY (`user_id`)}),
NODE TYPE `id_card` (LABEL `id_card`{`card_no` STRING NOT NULL, `is_black` BOOL DEFAULT NULL, PRIMARY KEY (`card_no`)}),
NODE TYPE `phone` (LABEL `phone`{`phone_no` STRING NOT NULL, `is_black` BOOL DEFAULT NULL, PRIMARY KEY (`phone_no`)}),
NODE TYPE `google_account` (LABEL `google_account`{`gaid` STRING NOT NULL, `is_black` BOOL DEFAULT NULL, PRIMARY KEY (`gaid`)}),
NODE TYPE `email` (LABEL `email`{`email_addr` STRING NOT NULL, `is_black` BOOL DEFAULT NULL, PRIMARY KEY (`email_addr`)}),
NODE TYPE `gps` (LABEL `gps`{`gps_coord` STRING NOT NULL, `is_black` BOOL DEFAULT NULL, PRIMARY KEY (`gps_coord`)}),
NODE TYPE `device_id` (LABEL `device_id`{`device_no` STRING NOT NULL, `is_black` BOOL DEFAULT NULL, PRIMARY KEY (`device_no`)}),
NODE TYPE `ewallet` (LABEL `ewallet`{`wallet_no` STRING NOT NULL, `is_black` BOOL DEFAULT NULL, PRIMARY KEY (`wallet_no`)}),
NODE TYPE `bank_card` (LABEL `bank_card`{`bank_no` STRING NOT NULL, `is_black` BOOL DEFAULT NULL, PRIMARY KEY (`bank_no`)}),
NODE TYPE `ip` (LABEL `ip`{`ip_addr` STRING NOT NULL, `is_black` BOOL DEFAULT NULL, PRIMARY KEY (`ip_addr`)}),
EDGE TYPE `bind_idcard` (`user`)-[LABEL `bind_idcard`{}]->(`id_card`),
EDGE TYPE `bind_phone` (`user`)-[LABEL `bind_phone`{}]->(`phone`),
EDGE TYPE `bind_google` (`user`)-[LABEL `bind_google`{}]->(`google_account`),
EDGE TYPE `bind_email` (`user`)-[LABEL `bind_email`{}]->(`email`),
EDGE TYPE `bind_gps` (`user`)-[LABEL `bind_gps`{}]->(`gps`),
EDGE TYPE `bind_device` (`user`)-[LABEL `bind_device`{}]->(`device_id`),
EDGE TYPE `bind_ewallet` (`user`)-[LABEL `bind_ewallet`{}]->(`ewallet`),
EDGE TYPE `bind_ip` (`user`)-[LABEL `bind_ewallet`{}]->(`ip`),
EDGE TYPE `bind_bankcard` (`user`)-[LABEL `bind_bankcard`{}]->(`bank_card`)
}
CREATE GRAPH `financial_risk_graph` :: `financial_risk_type`
节点类型
| 节点类型 | 标签 | 核心属性 |
|---|---|---|
| 用户(信贷申请人) | user |
user_id, name, is_blacklist, is_overdue, credit_limit_increase_times, is_credited |
| 身份证 | id_card |
card_no, is_black |
| 手机号 | phone |
phone_no, is_black |
| 谷歌账户 | google_account |
gaid, is_black |
| 邮箱 | email |
email_addr, is_black |
| GPS 定位 | gps |
gps_coord, is_black |
| 设备 ID | device_id |
device_no, is_black |
| 电子钱包 | ewallet |
wallet_no, is_black |
| 银行卡 | bank_card |
bank_no, is_black |
| IP 地址 | ip |
ip_addr, is_black |
边类型
| 边类型 | 起始节点 → 目标节点 | 说明 |
|---|---|---|
bind_idcard |
user → id_card |
用户绑定身份证 |
bind_phone |
user → phone |
用户绑定手机号 |
bind_google |
user → google_account |
用户绑定谷歌账号 |
bind_email |
user → email |
用户绑定邮箱 |
bind_gps |
user → gps |
用户绑定 GPS 位置 |
bind_device |
user → device_id |
用户绑定设备 |
bind_ewallet |
user → ewallet |
用户绑定电子钱包 |
bind_ip |
user → ip |
用户绑定 IP 地址 |
bind_bankcard |
user → bank_card |
用户绑定银行卡 |
数据导入
💡本 Demo 仅预置约百名用户及数千条关联关系,实际导入时,数据量可达亿级,
使用 INSERT 语句分别导入用户、证件、设备、账户等关联数据。
以下为部分示例:
-- 导入用户节点
TABLE `t` { `user_id`, `name`, `is_blacklist`, `is_overdue`, `credit_limit_increase_times`, `is_credited` } =
("u001", "张伟", "FALSE", "TRUE", "2", "TRUE"),
("u002", "李雷", "TRUE", "TRUE", "5", "FALSE"),
...
("u100", "吴刚", "FALSE", "TRUE", "2", "FALSE")
USE `financial_risk_graph`
FOR re IN `t`
INSERT (@`user` {`user_id`: re.`user_id`, `name`: re.`name`, `is_blacklist`: CAST(re.`is_blacklist` AS BOOLEAN), `is_overdue`: CAST(re.`is_overdue` AS BOOLEAN), `credit_limit_increase_times`: CAST(re.`credit_limit_increase_times` AS INT), `is_credited`: CAST(re.`is_credited` AS BOOLEAN)})
-- 导入身份证节点
INSERT INTO id_card (card_no, is_black)
VALUES
('110101198001010011', false),
('110101198001020022', true),
...
('110101198004090093', false);
-- 导入身份证绑定关系
TABLE `t` { `user_id`, `card_no` } =
-- 前20个用户每人绑定1-3个身份证,制造关联
("u001", "110101198001010011"),
("u002", "110101198001020022"),
("u002", "110101198001030033"), -- u002绑定2个身份证
...
("u014", "110101198001050055") -- u014共享u004的第一个身份证
USE `financial_risk_graph`
FOR re IN `t`
MATCH (v1@`user`{`user_id`: re.`user_id`}), (v2@`id_card`{`card_no`: re.`card_no`})
INSERT (v1)-[@`bind_idcard` {}]->(v2)
"""
MATCH (u:user {user_id: 'u001'}), (c:id_card {card_no: '110101198001010011'})
INSERT (u)-[:bind_idcard {}]->(c);

关键查询示例
1. 查询用户 3 跳内所有关联路径
目的:全面掌握目标用户的关联网络范围,发现潜在的风险传导路径。
use financial_risk_graph match p=(n@user{user_id:"u067"})-[]-{1,3}(e) return p

基于图的解释:该图展示了从用户 u067 出发,经过 1 到 3 跳能到达的所有节点及路径。
2. 统计用户 3 度内关联节点个数
目的:评估用户关联网络的规模,规模过大可能意味着团伙风险。
use financial_risk_graph match (n@user{user_id:"u067"})-[]-{1,3}(e) return count(DISTINCT e)

基于表格的解释:与用户 u067 在 3 跳内相连的不同节点总数为 38 个。
3. 查询用户 1 度边数量(节点的度)
目的:反映用户直接关联实体的密集程度,度越大说明该用户绑定的信息越多。
use financial_risk_graph match (n@user{user_id:"u067"})-[]-{1,1}(e) return count(DISTINCT e)

基于表格的解释:用户 u067 该节点的度 (Degree)为 9,即在整个图中拥有 9 条直接关联的边。这些边可能代表不同的含义,例如:
- 该用户关联了 9 个不同的银行账户。
- 该用户与 9 个不同的设备 ID 绑定过。
- 该用户在观察周期内发生了 9 笔转账交易。
在风控场景下,如果一个用户的关联边数(度)异常高,往往是识别团伙欺诈、洗钱或者高风险账户的重要特征。
4. 查询用户 1 度内黑名单节点统计
目的:计算用户的黑名单节点个数、总邻居个数及黑名单占比,评估用户直接关联风险。
use financial_risk_graph MATCH (n@user {user_id:"u067"})-[]-{1,1}(m) WHERE ELEMENT_ID(n) <> ELEMENT_ID(m)
RETURN COUNT(DISTINCT m) AS total_1hop,COUNT(DISTINCT CASE WHEN m.is_black = true THEN m END) AS black_1hop_count
NEXT use financial_risk_graph
return black_1hop_count, total_1hop,CASE WHEN total_1hop > 0 THEN 1.0 * black_1hop_count / total_1hop * 100 ELSE 0 END as black_ratio_1hop

基于表格的解释:与用户 u067 直接相连的所有黑名单邻居节点的数量为 9,一度黑名单节点为 6,即在与该用户直接关联的 9 个实体中,已经有 6 个被系统标记为黑名单节点。风险节点占比约为 66.67%,即该用户的直接交易圈中,有 66.67% 的关联对象是不安全的。
总结
通过 NebulaGraph 构建的信贷反欺诈关联网络,风控人员可以:
- 快速发现用户的多层关联关系;
- 量化用户的风险指标(如黑邻居占比);
- 识别团伙欺诈模式(如共用设备、身份证等);
- 为信贷审批提供更全面的风险画像。
💡本 Demo 展示了基础查询,仅作为简单场景下的 NebulaGraph 使用参考, 实际生产中还可用社区发现、标签传播等图算法自动挖掘欺诈团伙。


