Nebula Graph解决风控业务实践

yizhihongxing

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日

相关文章

  • MySQL 4种常用的主从复制架构

    MySQL主从复制是一种常用的数据复制方式,可以实现数据的备份、读写分离等多种功能。MySQL 4种常用的主从复制架构包括基于二进制日志的复制、基于GTID的复制、基于半同步复制和基于组复制。下面将为您详细介绍这四种架构的实现方法。 基于二进制日志的复制 基于二进制日志的MySQL主从复制是最常见的一种方式,实现起来也比较简单。步骤如下: 在主服务器的my.…

    database 2023年5月21日
    00
  • SQL – 连接(笛卡尔连接和自连接)

    SQL连接用于在两个或多个表之间建立关系。常见的连接方式有笛卡尔连接和自连接。 1.笛卡尔连接: 笛卡尔连接也称为交叉连接,是指将一张表中的每一行与另一张表中的每一行进行匹配,生成的结果集是两个表的行数的乘积。笛卡尔连接一般用于数据挖掘和大数据分析中。 实例1:假设我们有一个学生表students和一个课程表courses,它们的数据如下所示: studen…

    database 2023年3月27日
    00
  • redis内存溢出问题分析和后续规避方法

    【bug描述】 【步骤】 1、【前置:当前时间是2018年2月6日】用户A登录客户端A,用户A登录客户端B,查看客户端账号被踢出登录时的弹窗时间显示8月24日,时间显示错误。2、【前置:该弹窗提示平台已经屏蔽】消息列表点击任意群聊,进入群聊对话窗提示:“XX项目升级,部分功能暂停使用,敬请谅解”。 【实际结果】:1、【前置:当前时间是2018年2月6日】账号…

    Redis 2023年4月13日
    00
  • 详解MySQL使用GROUP BY分组查询

    MySQL中GROUP BY语句用于将数据行按照一个或多个列进行分组,然后对每个组进行聚合计算。在GROUP BY语句中,可以使用聚合函数对每个组进行计算,例如SUM、AVG、MAX、MIN、COUNT等。 以下是GROUP BY语句的一般语法: SELECT column1, column2, …, aggregate_function(column_…

    MySQL 2023年3月9日
    00
  • Teradata和PouchDB的区别

    我来为您详细讲解Teradata和PouchDB的区别。 Teradata和PouchDB简介 Teradata Teradata是一种关系型数据库管理系统,它可以管理大型企业应用的数据仓库,支持高性能的并发处理和多用户访问。它有多个组件,包括数据库、服务和工具等。作为一种企业级数据库,Teradata具有可扩展性、稳定性、高性能等优势。 PouchDB P…

    database 2023年3月27日
    00
  • 解决正则表示式匹配($regex)引起的一次mongo数据库cpu占用率高的问题

    问题描述: 在使用MongoDB数据库过程中,如果使用正则表达式匹配($regex),可能会引起数据库的CPU占用率过高,导致性能下降。 解决方案: 1.创建索引 为正则表达式的匹配字段添加索引是解决此问题的最佳方法。索引会加速查询,减少数据库的CPU占用率。 接下来,我们将为“name”字段添加索引,特别是在使用正则表达式搜索时,该字段的查询速度将更快。 …

    database 2023年5月22日
    00
  • MySQL 5.7.13 源码编译安装配置方法图文教程

    下面详细讲解一下“MySQL 5.7.13 源码编译安装配置方法图文教程”的完整攻略。 环境准备 首先需要安装一些必要的工具包: $ sudo yum install -y cmake ncurses-devel bison gcc gcc-c++ 下载源码并解压 从官网 https://dev.mysql.com/downloads/mysql/ 下载 M…

    database 2023年5月22日
    00
  • MySQL命令行导出导入数据库实例详解

    这里详细为你讲解MySQL命令行导出导入数据库实例的完整攻略。 什么是MySQL命令行导出导入数据库实例? MySQL命令行是一种基于字符界面的MySQL客户端工具,在MySQL命令行中可以通过一系列命令来管理数据库的操作。其中的导入和导出命令可以方便地将数据库中的数据和结构进行备份和恢复。 导出数据库实例 在MySQL命令行中执行以下命令即可导出数据库实例…

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