Nebula Graph解决风控业务实践攻略
背景
随着互联网的不断发展,如今各类金融交易和应用场景越来越多,也同时伴随着声名狼藉的诈骗事件。因此,风控业务逐渐成为了各类金融应用的重要组成部分,并且随着模型数据的丰富,传统关系型数据库已经无法满足需求。这时候,图数据库的优越性就显现了出来,Nebula Graph就是一个很好的选择。
Nebula Graph简介
Nebula Graph是一个开源的分布式图数据库,其内核使用C++语言编写,图数据库采用了分布式存储模型,能够支持百亿级别的节点与边。同时,Nebula Graph提供了完整的图数据存储和查询操作,具有图数据引擎的优秀特性。
attack.php案例
接下来,我们以“attack.php”案例为例来说明Nebula Graph如何实现风控业务。
在传统的关系型数据库中,一般存储和查询攻击行为,需要建立“攻击时间”、“攻击类型”、“攻击来源”、“被攻击对象”等相关字段,并且需要定义哪些行为认为是攻击行为。但是,如果采用Nebula Graph这样的图数据库,则可以利用图模型的优势,将攻击行为作为图中的边,将各类实体作为节点,这样能够更加自然和灵活地描绘数据中各种信息之间复杂的联系。以下是对攻击行为进行建模的方式:
# 创建实体节点User和Website
CREATE VERTEX User(uid int, name string, email string) WITH (partition_num=3);
CREATE VERTEX Website(url string, title string, desc string) WITH (partition_num=3);
# 创建边节点Attack和AccessLog
CREATE EDGE Attack(count int, time timestamp) WITH (partition_num=3);
CREATE EDGE AccessLog(method string, status int, time timestamp) WITH (partition_num=3);
# 建立边的关系,利用边关联各个实体
# 向边中添加属性,包括攻击类型、攻击来源、被攻击目标等
INSERT EDGE Attack(count, time) VALUES 100, "2020-07-07T10:00:00", (FROM User WHERE uid == 1) -> (TO Website WHERE url == "http://aaa.com");
INSERT EDGE AccessLog(method, status, time) VALUES "POST", 200, "2020-07-07T10:00:00", (FROM User WHERE uid == 1) -> (TO Website WHERE url == "http://aaa.com");
以上的代码可以将攻击行为建模成一个带有攻击时间、攻击类型、攻击来源、被攻击对象等属性的图,而查询某个用户是否在某个时间点发起多次攻击行为,可以使用以下的查询语句:
# 查询用户 uid=1 在时间戳 2020-07-07T10:00:00 之前是否有多次攻击行为
GO FROM (SELECT FROM User WHERE uid == 1) OVER Attack
YIELD COUNT($^.Attack._dst) AS attack_count
WHERE attack_count > 50 AND $^.Attack.time < "2020-07-07T10:00:00"
可以通过上述查询语句查找同一个用户在同一时间之前是否有多次攻击行为。
用户行为日志案例
下面,我们以查询是否存在批量注册账户行为为例进行说明,具体如下:
- 给定用户在注册或登录操作成功之后,记录用户的登录IP地址,访问的页面路径、访问结果、访问时间等信息。
-
如果访问状态等于"成功",则分析登录IP地址以及访问页面路径,如果存在如下的情况,替换为危险行为,并且触发风险告警:
- 同一IP地址登录创建多个账户。
- 多个账户被创建,并使用同一个IP地址访问网站。
使用图数据库,对上述业务进行抽象建模,我们得到以下的图模型:
# 创建实体节点
CREATE VERTEX User(uid int, name string, email string) WITH (partition_num=3);
CREATE VERTEX Website(url string, title string, desc string) WITH (partition_num=3);
# 创建边节点
CREATE EDGE Log(method string, status int, time timestamp) WITH (partition_num=3);
CREATE EDGE Login(ip string, location string, time timestamp) WITH (partition_num=3);
CREATE EDGE Register(ip string, location string, time timestamp) WITH (partition_num=3);
# 建立边的关系,包括访问日志、登录日志和注册日志
# 向边中添加属性,包括IP地址、访问时间等
INSERT EDGE Log(method, status, time) VALUES "GET", 200, "2020-07-07T10:00:00", (FROM User WHERE uid == 1) -> (TO Website WHERE url == "http://aaa.com");
INSERT EDGE Login(ip, location, time) VALUES "12.12.12.12", "CN-Shanghai", "2020-07-07T10:00:00", (FROM User WHERE uid == 1) -> (TO Website WHERE url == "http://aaa.com");
INSERT EDGE Register(ip, location, time) VALUES "12.12.12.12", "CN-Shanghai", "2020-07-07T10:00:00", (FROM User WHERE uid == 1) -> (TO Website WHERE url == "http://aaa.com");
然后,我们对上述模型进行查询,具体如下:
# 查询同一IP地址创建多个账号
GO FROM (SELECT FROM Log WHERE method == "POST" AND status == 200 AND $^.Log.time == "2020-07-07T10:00:00")
OVER Register
YIELD COUNT($^.Register._dst) AS register_count, $^.Register.ip AS ip, $^.Register.time AS time
WHERE register_count > 2
可以通过上述查询统计同一IP地址在2020-07-07T10:00:00被用于创建的账号数量。
# 查询是否同一IP地址注册并且使用多个账号访问网站
GO FROM (SELECT FROM Log WHERE method == "POST" AND status == 200 AND $^.Log.time == "2020-07-07T10:00:00")
OVER Login
WHERE $$.Register.ip == $^.Login.ip AND $^.Login._src != $^.Login._dst
通过上述查询,我们可以统计在同一IP地址上,同时注册多个账户并且使用这些账户访问网站的情况。
总结
上述攻击行为和用户行为的案例,展示了Nebula Graph的强大功能,以及其在处理复杂数据关系方面的高效性。Nebula Graph可以更加自然和灵活地描述数据实体之间的复杂联系,并且查询效率高,扩展性好。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Nebula Graph解决风控业务实践 - Python技术站