第三方支付到高风险管辖区
1. 引言
交易监控是零售银行的一项基本支柱,旨在确保金融交易的完整性和安全性。它在检测和预防金融欺诈、洗钱及其他非法活动方面发挥着关键作用,保护银行及其客户免受潜在的威胁和损失。
“**第三方支付到高风险管辖区**”规则监控流向被归类为金融不当行为高风险区域或国家的交易。通过识别此类交易,银行可以更仔细地审查它们,确保其符合监管规定,并且不成为恶意活动的渠道。
2. 规则细分
-
时间范围
-
评估滚动 30 天内的所有数据(这可以是任何时间段)
-
-
捕获
-
洗钱中介
-
-
逻辑
-
按唯一来源账户汇总流入支付总额
-
将交易与高风险管辖区匹配
-
其中单笔交易的价值在原始流入金额的 90% 到 110% 之间。
-
-
3. 建模
本节将展示在示例图上执行 Cypher 查询的示例。目的是说明查询的样式,并提供在实际设置中组织数据的指南。我们将在一个包含几个节点的小型图上进行操作。示例图将基于以下数据模型
3.2. 演示数据
以下 Cypher 语句将在 Neo4j 数据库中创建示例图
// Create all accounts
CREATE (a1:Account {number: 1})
CREATE (a2:Account {number: 2})
CREATE (a3:Account {number: 3})
CREATE (a4:Account {number: 4})
CREATE (a5:Account {number: 5})
CREATE (a6:Account {number: 6})
CREATE (a7:Account:HighRiskJurisdiction {number: 7})
// Create valid transaction relationships
CREATE (a2)-[:TRANSACTION {amount: 1100, datetime: datetime()-duration({days: 29})}]->(a4)
CREATE (a4)-[:TRANSACTION {amount: 100, datetime: datetime()-duration({days: 27})}]->(a6)
CREATE (a4)-[:TRANSACTION {amount: 200, datetime: datetime()-duration({days: 26})}]->(a6)
CREATE (a4)-[:TRANSACTION {amount: 600, datetime: datetime()-duration({days: 25})}]->(a6)
CREATE (a6)-[:TRANSACTION {amount: 500, datetime: datetime()-duration({days: 3})}]->(a7)
CREATE (a6)-[:TRANSACTION {amount: 500, datetime: datetime()-duration({days: 2})}]->(a7)
// Create invalid transaction relationships
CREATE (a1)-[:TRANSACTION {amount: 500, datetime: datetime()-duration({days: 60})}]->(a2)
CREATE (a1)-[:TRANSACTION {amount: 500, datetime: datetime()-duration({days: 60})}]->(a2)
CREATE (a3)-[:TRANSACTION {amount: 750, datetime: datetime()-duration({days: 28})}]->(a4)
CREATE (a5)-[:TRANSACTION {amount: 100, datetime: datetime()-duration({days: 24})}]->(a6)
CREATE (a5)-[:TRANSACTION {amount: 50, datetime: datetime()-duration({days: 24})}]->(a6)
4. Cypher 查询
4.1. 增强图版本
这是标准交易监控规则的增强版本,当前系统无法以大规模和简单性实现。**为什么?**
-
无限期地**递归遍历**关系无法在任何现有系统中实现
-
Neo4j 卓越的性能是通过在遍历时评估以下条件来实现的
-
聚合交易的值在原始交易金额的 90% - 110% 范围之外。
-
其中交易日期超出指定期限。在此示例中为 30 天。
-
MATCH (l:Account)-[last_t:TRANSACTION]->(hrj:HighRiskJurisdiction)
WHERE last_t.datetime >= datetime()-duration({days: 30})
WITH l, hrj, SUM(last_t.amount) AS total_hrj_transctions
MATCH path=(first)((a1)-[t]->(a2)
WHERE COLLECT {
WITH a1, a2
MATCH (a1)-[some_t]->(a2)
WHERE some_t.datetime >= datetime()-duration({days: 30})
WITH SUM(some_t.amount) AS s
RETURN 0.9 * total_hrj_transctions <= s <= 1.1 * total_hrj_transctions
} = [TRUE]
)*(l)-[tx:TRANSACTION]->(hrj)
WHERE NOT EXISTS {
WITH first
MATCH (before)-[tx]->(first)
WHERE tx.datetime >= datetime()-duration({days: 30})
WITH SUM(tx.amount) AS sx, before
WHERE 0.9 * total_hrj_transctions <= sx <= 1.1 * total_hrj_transctions
RETURN before
} AND
tx.datetime >= datetime()-duration({days: 30})
RETURN path