Nebula Graph解决风控业务实践

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技术站

(0)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • Redis持久化-AOF重写

    1.概述 对重复冗余过期的明命令进行精简,创建新的AOF文件,覆盖旧的AOF文件 原生AOF AOF重写 set hello world set hello jack set hello zhangsan incr count incr count rpush mylist a rpush mylist b rpush mylist c 过期数据 set h…

    Redis 2023年4月12日
    00
  • [Go] redis分布式锁的go-redis实现

    在分布式的业务中 , 如果有的共享资源需要安全的被访问和处理 , 那就需要分布式锁 分布式锁的几个原则; 1.「锁的互斥性」:在分布式集群应用中,共享资源的锁在同一时间只能被一个对象获取。 2. 「可重入」:为了避免死锁,这把锁是可以重入的,并且可以设置超时。 3. 「高效的加锁和解锁」:能够高效的加锁和解锁,获取锁和释放锁的性能也好。 4. 「阻塞、公平」…

    Redis 2023年4月11日
    00
  • Alibaba Cloud MaxCompute和Amazon Redshift的区别

    Alibaba Cloud MaxCompute和Amazon Redshift是两种不同公司提供的云数据仓库。虽然它们都提供了数据存储、计算、分析等功能,但是它们之间还是有一些重要的区别。下面将详细讲解它们的区别及实例说明。 相同点 首先,我们来看一下它们的相同点: 都是云数据仓库,提供了数据存储、计算、分析等功能。 都具有高性能、可扩展性、安全性等特点。…

    database 2023年3月27日
    00
  • SQL中From和Where子句的区别

    From和Where都是SQL语句中的子句,但它们用途不同,下面分别详细讲解它们的区别。 From子句 From子句用于指定一个或多个表的名称,这些表将被查询的数据所在。从语法上来看,From子句是SQL语句中最先出现的子句,它的格式如下: SELECT column1, column2, … FROM table_name 其中,table_name指…

    database 2023年3月27日
    00
  • linux重置密码提示与用户名相似该怎么解决?

    首先,需要说明的是,Linux重置密码可以通过修改系统文件或者使用特定的工具进行。在此基础上,如果在重置密码时遇到了密码提示与用户名相似的问题,可以参考以下攻略进行解决。 重置密码 在具体解决该问题前,需要先了解如何重置密码。首先,在Linux系统启动时,按下shift键可以进入GRUB菜单。在GRUB菜单中选择恢复(recovery)模式,然后选择root…

    database 2023年5月22日
    00
  • Php中使用Select 查询语句的实例

    下面是关于在PHP中使用Select查询语句的攻略: 1. 准备工作 在使用Select查询语句前,需要进行以下准备工作: 1.1 连接数据库 在PHP中连接数据库需要使用mysqli扩展或PDO扩展,这里以mysqli扩展为例,代码如下: // 创建连接 $conn = new mysqli($servername, $username, $passwor…

    database 2023年5月21日
    00
  • Centos7 安装 Mysql8教程

    下面是详细的“Centos7 安装 Mysql8教程”的完整攻略。 简介 本教程将教您如何在Centos7操作系统上安装Mysql8数据库。 步骤 更新系统 在进行任何安装之前,您需要确保您的系统已经更新到最新版本,使用以下命令执行更新操作: sudo yum -y update 安装MySQL 8的yum源 sudo wget https://dev.my…

    database 2023年5月22日
    00
  • MySQL如何查看正在运行的SQL详解

    MySQL 提供了多种方式来查看正在运行的 SQL 语句。下面是一些方法: 方法一:show processlist 使用 show processlist 命令,可以查看当前所有正在运行的 SQL 语句以及执行者等相关信息。 SHOW PROCESSLIST; 该命令将返回一个列表,其中包含当前连接的所有进程及其状态。其中一些字段包括 ID、USER、HO…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部