Skip to content

欺诈检测

数据模型设计

1. 核心实体

  • 用户(User):系统用户
  • 账户(Account):用户的账户
  • 交易(Transaction):用户之间的交易
  • 设备(Device):用户使用的设备
  • 位置(Location):用户的位置
  • 行为(Behavior):用户的行为
  • 警报(Alert):欺诈警报

2. 关系类型

  • 拥有(OWNS):用户拥有账户
  • 执行(PERFORMED):用户执行交易
  • 使用(USED):用户使用设备
  • 位于(LOCATED_IN):用户位于位置
  • 产生(GENERATED):交易产生警报
  • 关联(ASSOCIATED_WITH):设备与账户关联

3. 属性设计

  • User 节点属性

    • id: 唯一标识符
    • name: 用户名
    • email: 邮箱
    • phone: 电话
    • registration_date: 注册日期
    • risk_score: 风险评分
  • Account 节点属性

    • id: 唯一标识符
    • account_number: 账号
    • balance: 余额
    • creation_date: 创建日期
    • risk_score: 风险评分
  • Transaction 节点属性

    • id: 唯一标识符
    • amount: 金额
    • timestamp: 时间戳
    • type: 类型(如转账、支付等)
    • status: 状态(如成功、失败等)
    • risk_score: 风险评分
  • Device 节点属性

    • id: 唯一标识符
    • device_id: 设备 ID
    • device_type: 设备类型
    • os: 操作系统
    • risk_score: 风险评分
  • Location 节点属性

    • id: 唯一标识符
    • country: 国家
    • city: 城市
    • zip_code: 邮编
    • risk_score: 风险评分
  • Alert 节点属性

    • id: 唯一标识符
    • timestamp: 时间戳
    • severity: 严重程度
    • status: 状态
    • description: 描述

4. 数据模型示例

cypher
// 用户节点
(:User {id: 1, name: 'John Doe', email: 'john@example.com', phone: '123-456-7890', registration_date: '2023-01-01', risk_score: 0.1})

// 账户节点
(:Account {id: 1, account_number: '123456789', balance: 10000, creation_date: '2023-01-01', risk_score: 0.1})

// 交易节点
(:Transaction {id: 1, amount: 1000, timestamp: '2023-01-02T12:00:00', type: 'transfer', status: 'completed', risk_score: 0.8})

// 设备节点
(:Device {id: 1, device_id: 'device123', device_type: 'mobile', os: 'iOS', risk_score: 0.2})

// 位置节点
(:Location {id: 1, country: 'United States', city: 'New York', zip_code: '10001', risk_score: 0.1})

// 警报节点
(:Alert {id: 1, timestamp: '2023-01-02T12:00:00', severity: 'high', status: 'open', description: 'Suspicious transaction'})

// 关系
(:User {id: 1})-[:OWNS]->(:Account {id: 1})
(:User {id: 1})-[:PERFORMED]->(:Transaction {id: 1})
(:User {id: 1})-[:USED]->(:Device {id: 1})
(:User {id: 1})-[:LOCATED_IN]->(:Location {id: 1})
(:Transaction {id: 1})-[:GENERATED]->(:Alert {id: 1})
(:Device {id: 1})-[:ASSOCIATED_WITH]->(:Account {id: 1})

异常模式识别

1. 交易异常检测

cypher
// 检测异常交易金额
MATCH (u:User)-[:PERFORMED]->(t:Transaction)
WITH u, avg(t.amount) AS avg_amount, stddev(t.amount) AS std_amount
MATCH (u)-[:PERFORMED]->(t:Transaction)
WHERE t.amount > avg_amount + 3 * std_amount
RETURN u.name, t.id, t.amount, avg_amount, std_amount

2. 行为异常检测

cypher
// 检测异常登录时间
MATCH (u:User)-[:USED]->(d:Device)
WITH u, collect(d) AS devices, count(d) AS device_count
WHERE device_count > 5
RETURN u.name, device_count

// 检测异常位置变化
MATCH (u:User)-[:LOCATED_IN]->(l:Location)
WITH u, collect(l) AS locations, count(DISTINCT l) AS location_count
WHERE location_count > 3
RETURN u.name, location_count

3. 时间模式异常

cypher
// 检测异常交易时间
MATCH (u:User)-[:PERFORMED]->(t:Transaction)
WITH u, hour(datetime({epochmillis: t.timestamp})) AS hour, count(*) AS transaction_count
WHERE hour < 6 OR hour > 22
RETURN u.name, hour, transaction_count
ORDER BY transaction_count DESC

关系网络分析

1. 网络结构分析

cypher
// 分析用户之间的交易网络
MATCH (u1:User)-[:PERFORMED]->(t:Transaction)<-[:PERFORMED]-(u2:User)
WHERE u1 <> u2
WITH u1, u2, count(t) AS transaction_count, sum(t.amount) AS total_amount
RETURN u1.name, u2.name, transaction_count, total_amount
ORDER BY total_amount DESC

2. 异常网络模式

cypher
// 检测循环交易
MATCH (u1:User)-[:PERFORMED]->(t1:Transaction)<-[:PERFORMED]-(u2:User),
      (u2)-[:PERFORMED]->(t2:Transaction)<-[:PERFORMED]-(u1)
WHERE t1.amount = t2.amount
  AND t1.timestamp > t2.timestamp - 86400000 // 24小时内
RETURN u1.name, u2.name, t1.amount, t1.timestamp, t2.timestamp

3. 中心性分析

cypher
// 计算用户在交易网络中的中心性
CALL gds.graph.create('transactionGraph', ['User', 'Transaction'], {
  PERFORMED: {
    type: 'PERFORMED',
    orientation: 'UNDIRECTED'
  }
})

CALL gds.betweenness.stream('transactionGraph')
YIELD nodeId, score
MATCH (u:User) WHERE id(u) = nodeId
RETURN u.name, score AS betweenness
ORDER BY score DESC
LIMIT 10

CALL gds.graph.drop('transactionGraph')

实时监控

1. 实时交易监控

cypher
// 实时监控交易
MATCH (t:Transaction)
WHERE t.timestamp > datetime().epochmillis - 3600000 // 最近1小时
WITH t, t.risk_score AS risk_score
WHERE risk_score > 0.7
MATCH (t)-[:GENERATED]->(a:Alert)
RETURN t.id, t.amount, t.timestamp, a.severity, a.description
ORDER BY t.timestamp DESC

2. 实时设备监控

cypher
// 实时监控设备使用
MATCH (u:User)-[:USED]->(d:Device)
WHERE u.last_login > datetime().epochmillis - 3600000 // 最近1小时
WITH u, d, count(*) AS login_count
WHERE login_count > 5
RETURN u.name, d.device_id, login_count
ORDER BY login_count DESC

3. 实时位置监控

cypher
// 实时监控位置变化
MATCH (u:User)-[:LOCATED_IN]->(l:Location)
WITH u, collect(DISTINCT l) AS locations, count(DISTINCT l) AS location_count
WHERE location_count > 2
  AND u.last_login > datetime().epochmillis - 3600000 // 最近1小时
RETURN u.name, location_count, [l IN locations | l.city] AS cities

预警系统

1. 警报生成

cypher
// 基于风险评分生成警报
MATCH (t:Transaction)
WHERE t.risk_score > 0.7
  AND NOT EXISTS((t)-[:GENERATED]->(:Alert))
CREATE (a:Alert {
  id: randomUUID(),
  timestamp: datetime().epochmillis,
  severity: CASE
    WHEN t.risk_score > 0.9 THEN 'critical'
    WHEN t.risk_score > 0.7 THEN 'high'
    ELSE 'medium'
  END,
  status: 'open',
  description: 'Suspicious transaction detected'
})
CREATE (t)-[:GENERATED]->(a)
RETURN t.id, a.id, a.severity

2. 警报优先级

cypher
// 计算警报优先级
MATCH (a:Alert)-[:GENERATED]->(t:Transaction)<-[:PERFORMED]-(u:User)
WITH a, t, u, u.risk_score + t.risk_score AS priority_score
SET a.priority = priority_score
RETURN a.id, a.severity, priority_score
ORDER BY priority_score DESC

3. 警报处理

cypher
// 处理警报
MATCH (a:Alert)
WHERE a.status = 'open'
WITH a
ORDER BY a.priority DESC
LIMIT 10
SET a.status = 'processing'
RETURN a.id, a.severity, a.priority

// 标记已处理的警报
MATCH (a:Alert)
WHERE a.status = 'processing'
  AND a.timestamp < datetime().epochmillis - 3600000 // 1小时前
SET a.status = 'closed'
RETURN a.id, a.status

欺诈网络可视化

1. 使用 Neo4j Bloom

  • 创建视图:在 Neo4j Bloom 中创建欺诈检测视图
  • 定义规则:为不同类型的节点和关系定义视觉规则
  • 探索数据:使用搜索和路径查找功能探索欺诈网络

2. 使用 D3.js

示例代码

html
<!DOCTYPE html>
<html>
<head>
    <title>欺诈检测可视化</title>
    <script src="https://d3js.org/d3.v7.min.js"></script>
    <style>
        .node {
            fill: #ccc;
            stroke: #333;
            stroke-width: 1.5px;
        }
        .link {
            stroke: #999;
            stroke-opacity: 0.6;
        }
        .node text {
            pointer-events: none;
            font-size: 10px;
        }
        .user { fill: #4CAF50; }
        .account { fill: #2196F3; }
        .transaction { fill: #FF9800; }
        .device { fill: #9C27B0; }
        .location { fill: #607D8B; }
        .alert { fill: #F44336; }
    </style>
</head>
<body>
    <div id="graph"></div>
    <script>
        // 模拟欺诈检测数据
        const data = {
            nodes: [
                {id: 1, label: 'User 1', type: 'user', risk_score: 0.8},
                {id: 2, label: 'User 2', type: 'user', risk_score: 0.6},
                {id: 3, label: 'Account 1', type: 'account', risk_score: 0.7},
                {id: 4, label: 'Account 2', type: 'account', risk_score: 0.5},
                {id: 5, label: 'Transaction 1', type: 'transaction', risk_score: 0.9},
                {id: 6, label: 'Device 1', type: 'device', risk_score: 0.3},
                {id: 7, label: 'Location 1', type: 'location', risk_score: 0.2},
                {id: 8, label: 'Alert 1', type: 'alert', severity: 'high'}
            ],
            links: [
                {source: 1, target: 3, type: 'owns'},
                {source: 2, target: 4, type: 'owns'},
                {source: 1, target: 5, type: 'performed'},
                {source: 2, target: 5, type: 'performed'},
                {source: 1, target: 6, type: 'used'},
                {source: 1, target: 7, type: 'located_in'},
                {source: 5, target: 8, type: 'generated'},
                {source: 6, target: 3, type: 'associated_with'}
            ]
        };

        const width = 800;
        const height = 600;

        const svg = d3.select('#graph')
            .append('svg')
            .attr('width', width)
            .attr('height', height);

        const simulation = d3.forceSimulation(data.nodes)
            .force('link', d3.forceLink(data.links).id(d => d.id).distance(100))
            .force('charge', d3.forceManyBody().strength(-300))
            .force('center', d3.forceCenter(width / 2, height / 2));

        const link = svg.append('g')
            .selectAll('line')
            .data(data.links)
            .enter()
            .append('line')
            .attr('class', 'link');

        const node = svg.append('g')
            .selectAll('.node')
            .data(data.nodes)
            .enter()
            .append('g')
            .attr('class', 'node')
            .call(d3.drag()
                .on('start', dragstarted)
                .on('drag', dragged)
                .on('end', dragended));

        node.append('circle')
            .attr('r', d => d.risk_score * 20 + 10)
            .attr('class', d => d.type);

        node.append('text')
            .attr('text-anchor', 'middle')
            .attr('dy', '.35em')
            .text(d => d.label);

        simulation.on('tick', () => {
            link
                .attr('x1', d => d.source.x)
                .attr('y1', d => d.source.y)
                .attr('x2', d => d.target.x)
                .attr('y2', d => d.target.y);

            node
                .attr('transform', d => `translate(${d.x},${d.y})`);
        });

        function dragstarted(event, d) {
            if (!event.active) simulation.alphaTarget(0.3).restart();
            d.fx = d.x;
            d.fy = d.y;
        }

        function dragged(event, d) {
            d.fx = event.x;
            d.fy = event.y;
        }

        function dragended(event, d) {
            if (!event.active) simulation.alphaTarget(0);
            d.fx = null;
            d.fy = null;
        }
    </script>
</body>
</html>

案例应用

1. 金融欺诈检测

  • 功能

    • 交易监控:实时监控交易
    • 异常检测:检测异常交易模式
    • 网络分析:分析交易网络
    • 预警系统:生成和处理警报
    • 案例管理:管理欺诈案例
  • 技术栈

    • 前端:React
    • 后端:Java/Spring Boot
    • 数据库:Neo4j
    • 流处理:Kafka
    • 机器学习:Python/scikit-learn

2. 保险欺诈检测

  • 功能

    • 索赔监控:监控保险索赔
    • 模式识别:识别欺诈模式
    • 网络分析:分析索赔网络
    • 风险评估:评估索赔风险
    • 案例管理:管理欺诈案例
  • 技术栈

    • 前端:Vue.js
    • 后端:Node.js/Express
    • 数据库:Neo4j
    • 流处理:Kafka
    • 机器学习:Python/TensorFlow

小结

欺诈检测是 Neo4j 的重要应用场景之一,通过图数据库的强大能力,可以实现异常模式识别、关系网络分析、实时监控和预警系统等功能。本文介绍了欺诈检测的数据模型设计、异常检测方法、网络分析技术和预警系统,以及案例应用。在实际应用中,需要根据具体的业务需求和数据特点,选择合适的技术和工具,构建高效、准确的欺诈检测系统。