图数据库 之 Neo4j - 应用场景4 - 反洗钱(9)
MATCH (c:客户)-[:发起交易]->(t:交易)-[:转账给]->(b:受益人), (c)-[:持有账户]->(bank:银行)CREATE (:受益人 {ID: 5, 姓名: 'Emily', 地址: 'Toronto', 国籍: '加拿大'})CREATE (:受益人 {ID: 4, 姓名: 'Mike', 地址: 'Sydney', 国籍: '澳大利亚'})CREATE (:受益人
原理
Neo4j图数据库可以用于构建和分析数据之间的关系。它使用节点和关系来表示数据,并提供实时查询能力。通过使用Neo4j,可以将大量的交易数据导入图数据库,并通过查询和分析图结构来发现洗钱行为中的模式和关联。
案例分析
假设有一家转账服务公司,有以下交易数据,每个交易可以表示为一个节点,包含交易的相关信息,如交易金额、时间戳等。另外,还可以创建节点来表示客户、受益人、银行等相关实体。通过关系,可以将交易节点与客户节点、受益人节点和银行节点等连接起来。
客户节点
- ID
- 姓名
- 地址
- 国籍
受益人节点
- ID
- 姓名
- 地址
- 国籍
银行节点
- ID
- 名称
- 地址
交易节点
- ID
- 金额
- 时间戳
清空原有数据
MATCH (n)
WHERE n:客户 OR n:交易 OR n:银行 OR n:受益人
DETACH DELETE n
创建客户节点
CREATE (:客户 {ID: 1, 姓名: 'John', 地址: 'New York', 国籍: '美国'})
CREATE (:客户 {ID: 2, 姓名: 'Alice', 地址: 'London', 国籍: '英国'})
CREATE (:客户 {ID: 3, 姓名: '张三', 地址: '北京', 国籍: '中国'})
CREATE (:客户 {ID: 4, 姓名: 'Mike', 地址: 'Sydney', 国籍: '澳大利亚'})
CREATE (:客户 {ID: 5, 姓名: 'Emily', 地址: 'Toronto', 国籍: '加拿大'})
CREATE (:客户 {ID: 6, 姓名: 'Bob', 地址: 'Paris', 国籍: '法国'})
CREATE (:客户 {ID: 7, 姓名: 'Luis', 地址: 'Madrid', 国籍: '西班牙'})
CREATE (:客户 {ID: 8, 姓名: 'Maria', 地址: 'Rome', 国籍: '意大利'})
CREATE (:客户 {ID: 9, 姓名: 'Hiroshi', 地址: 'Tokyo', 国籍: '日本'})
CREATE (:客户 {ID: 10, 姓名: 'Sofia', 地址: 'Berlin', 国籍: '德国'})
创建受益人节点
CREATE (:受益人 {ID: 1, 姓名: 'John', 地址: 'New York', 国籍: '美国'})
CREATE (:受益人 {ID: 2, 姓名: 'Alice', 地址: 'London', 国籍: '英国'})
CREATE (:受益人 {ID: 3, 姓名: '张三', 地址: '北京', 国籍: '中国'})
CREATE (:受益人 {ID: 4, 姓名: 'Mike', 地址: 'Sydney', 国籍: '澳大利亚'})
CREATE (:受益人 {ID: 5, 姓名: 'Emily', 地址: 'Toronto', 国籍: '加拿大'})
CREATE (:受益人 {ID: 6, 姓名: 'Bob', 地址: 'Paris', 国籍: '法国'})
CREATE (:受益人 {ID: 7, 姓名: 'Luis', 地址: 'Madrid', 国籍: '西班牙'})
CREATE (:受益人 {ID: 8, 姓名: 'Maria', 地址: 'Rome', 国籍: '意大利'})
CREATE (:受益人 {ID: 9, 姓名: 'Hiroshi', 地址: 'Tokyo', 国籍: '日本'})
CREATE (:受益人 {ID: 10, 姓名: 'Sofia', 地址: 'Berlin', 国籍: '德国'})
创建银行节点
CREATE (:银行 {ID: 1, 名称: 'ABC Bank', 地址: 'New York'}) CREATE (:银行 {ID: 2, 名称: 'XYZ Bank', 地址: 'London'}) CREATE (:银行 {ID: 3, 名称: 'Bank of China', 地址: 'Beijing'}) CREATE (:银行 {ID: 4, 名称: 'ANZ Bank', 地址: 'Sydney'}) CREATE (:银行 {ID: 5, 名称: 'TD Bank', 地址: 'Toronto'}) CREATE (:银行 {ID: 6, 名称: 'BNP Paribas', 地址: 'Paris'}) CREATE (:银行 {ID: 7, 名称: 'Santander', 地址: 'Madrid'}) CREATE (:银行 {ID: 8, 名称: 'UniCredit', 地址: 'Rome'}) CREATE (:银行 {ID: 9, 名称: 'Mitsubishi UFJ Financial Group', 地址: 'Tokyo'}) CREATE (:银行 {ID: 10, 名称: 'Deutsche Bank', 地址: 'Berlin'})
创建交易节点
CREATE (:交易 {ID: 1, 金额: 1000, 时间戳: '2022-01-01'}) CREATE (:交易 {ID: 2, 金额: 500, 时间戳: '2022-02-01'}) CREATE (:交易 {ID: 3, 金额: 2000, 时间戳: '2022-03-01'}) CREATE (:交易 {ID: 4, 金额: 1500, 时间戳: '2022-04-01'}) CREATE (:交易 {ID: 5, 金额: 800, 时间戳: '2022-05-01'}) CREATE (:交易 {ID: 6, 金额: 1200, 时间戳: '2022-06-01'}) CREATE (:交易 {ID: 7, 金额: 3000, 时间戳: '2022-07-01'}) CREATE (:交易 {ID: 8, 金额: 600, 时间戳: '2022-08-01'}) CREATE (:交易 {ID: 9, 金额: 900, 时间戳: '2022-09-01'}) CREATE (:交易 {ID: 10, 金额: 2500, 时间戳: '2022-10-01'})
创建客户与交易节点之间的关系
MATCH (c:客户), (t:交易)
WHERE c.ID = 1 and t.ID = 1
CREATE (c)-[:发起交易]->(t);
MATCH (c:客户), (t:交易)
WHERE c.ID = 1 and t.ID = 2
CREATE (c)-[:发起交易]->(t);
MATCH (c:客户), (t:交易)
WHERE c.ID = 1 and t.ID = 3
CREATE (c)-[:发起交易]->(t);
MATCH (c:客户), (t:交易)
WHERE c.ID = 4 and t.ID = 4
CREATE (c)-[:发起交易]->(t);
MATCH (c:客户), (t:交易)
WHERE c.ID = 4 and t.ID = 5
CREATE (c)-[:发起交易]->(t);
MATCH (c:客户), (t:交易)
WHERE c.ID = 5 and t.ID = 6
CREATE (c)-[:发起交易]->(t);
MATCH (c:客户), (t:交易)
WHERE c.ID = 6 and t.ID = 7
CREATE (c)-[:发起交易]->(t);
MATCH (c:客户), (t:交易)
WHERE c.ID = 7 and t.ID = 8
CREATE (c)-[:发起交易]->(t);
MATCH (c:客户), (t:交易)
WHERE c.ID = 8 and t.ID = 9
CREATE (c)-[:发起交易]->(t);
MATCH (c:客户), (t:交易)
WHERE c.ID = 8 and t.ID = 10
CREATE (c)-[:发起交易]->(t);
创建交易与受益人节点之间的关系
MATCH (t:交易), (b:受益人)
WHERE t.ID = 1 and b.ID = 4
CREATE (t)-[:转账给]->(b);
MATCH (t:交易), (b:受益人)
WHERE t.ID = 2 and b.ID = 4
CREATE (t)-[:转账给]->(b);
MATCH (t:交易), (b:受益人)
WHERE t.ID = 3 and b.ID = 4
CREATE (t)-[:转账给]->(b);
MATCH (t:交易), (b:受益人)
WHERE t.ID = 4 and b.ID = 1
CREATE (t)-[:转账给]->(b);
MATCH (t:交易), (b:受益人)
WHERE t.ID = 5 and b.ID = 10
CREATE (t)-[:转账给]->(b);
MATCH (t:交易), (b:受益人)
WHERE t.ID = 6 and b.ID = 9
CREATE (t)-[:转账给]->(b);
MATCH (t:交易), (b:受益人)
WHERE t.ID = 7 and b.ID = 1
CREATE (t)-[:转账给]->(b);
MATCH (t:交易), (b:受益人)
WHERE t.ID = 8 and b.ID = 2
CREATE (t)-[:转账给]->(b);
MATCH (t:交易), (b:受益人)
WHERE t.ID = 9 and b.ID = 2
CREATE (t)-[:转账给]->(b);
MATCH (t:交易), (b:受益人)
WHERE t.ID = 10 and b.ID = 2
CREATE (t)-[:转账给]->(b);
创建客户与银行节点之间的关系
MATCH (c:客户), (bank:银行)
WHERE c.ID = 1 and bank.ID = 2
CREATE (c)-[:持有账户]->(bank);
MATCH (c:客户), (bank:银行)
WHERE c.ID = 2 and bank.ID = 2
CREATE (c)-[:持有账户]->(bank);
MATCH (c:客户), (bank:银行)
WHERE c.ID = 3 and bank.ID = 3
CREATE (c)-[:持有账户]->(bank);
MATCH (c:客户), (bank:银行)
WHERE c.ID = 4 and bank.ID = 6
CREATE (c)-[:持有账户]->(bank);
MATCH (c:客户), (bank:银行)
WHERE c.ID = 5 and bank.ID = 10
CREATE (c)-[:持有账户]->(bank);
MATCH (c:客户), (bank:银行)
WHERE c.ID = 6 and bank.ID = 2
CREATE (c)-[:持有账户]->(bank);
MATCH (c:客户), (bank:银行)
WHERE c.ID = 7 and bank.ID = 3
CREATE (c)-[:持有账户]->(bank);
MATCH (c:客户), (bank:银行)
WHERE c.ID = 8 and bank.ID = 2
CREATE (c)-[:持有账户]->(bank);
MATCH (c:客户), (bank:银行)
WHERE c.ID = 9 and bank.ID = 2
CREATE (c)-[:持有账户]->(bank);
MATCH (c:客户), (bank:银行)
WHERE c.ID = 10 and bank.ID = 7
CREATE (c)-[:持有账户]->(bank);
展示客户和交易节点之间的关系
MATCH (c:客户)-[:发起交易]->(t:交易)
RETURN c, t
展示客户节点、交易节点、受益人节点和银行节点之间的关系
MATCH (c:客户)-[:发起交易]->(t:交易)-[:转账给]->(b:受益人), (c)-[:持有账户]->(bank:银行)
RETURN c, t, b, bank
实体关系分析
通过构建客户、受益人、银行、交易等节点,并建立它们之间的关系,可以分析实体之间的交互模式和关联关系。例如,通过分析客户与受益人之间的交易关系,可以发现潜在的洗钱行为。如分析客户与受益人之间的关系,以发现潜在的洗钱行为。如反洗钱定义:交易数量大于2 或 交易金额总和大于等于3000 的行为。
MATCH (c:客户)-[:发起交易]->(t:交易)-[:转账给]->(b:受益人)
WITH c, b, COUNT(t) AS transactionCount, sum(t.金额) as totalAmount
WHERE transactionCount > 2 or totalAmount >= 3000
RETURN c, b, transactionCount, totalAmount
交易异常检测
检测大额交易:金额超过 10000
MATCH (c:客户)-[:发起交易]->(t:交易)
WHERE t.金额 > 10000
RETURN c, t
检测频繁的小额交易:金额1000,且超过10笔交易
MATCH (c:客户)-[:发起交易]->(t:交易)
WHERE t.金额 < 1000
WITH c, COUNT(t) AS transactionCount
WHERE transactionCount > 10
RETURN c, transactionCount
交易路径分析
分析资金从一个银行到另一个银行的转账路径,以识别可能的洗钱行为。
查询所有资金转账路径,金额总和大于1000000。
MATCH path = (startBank:银行)-[:转账给*1..5]->(endBank:银行) WHERE startBank <> endBank WITH path, [rel in relationships(path) | rel.金额] AS amounts WHERE reduce(total = 0, amount in amounts | total + amount) > 1000000 RETURN path
关系网络分析
识别关键节点和关键关系,帮助发现洗钱网络。
查询拥有最多交易的3个客户及起转账笔数,总金额
MATCH (c:客户)-[:发起交易]->(t:交易)
WITH c, COUNT(t) AS transactionCount,sum(t.金额) as totalAmount
ORDER BY transactionCount DESC
LIMIT 3
RETURN c, transactionCount, totalAmount
查询频繁交易的客户与受益人
转账超过2次的客户与受益人以及交易次数、交易金额
MATCH (c:客户)-[:发起交易]->(t:交易)-[:转账给]->(b:受益人)
WITH c, b, COUNT(t) AS transactionCount,sum(t.金额) as totalAmount
WHERE transactionCount > 2
RETURN c, b, transactionCount,totalAmount
实时监测和预警
实时识别可疑交易并触发预警机制。
假设存在以下嫌疑人实体数据
MATCH (c:客户 {id: 1}) MERGE (c)-[:嫌疑人]->();
MATCH (c:客户 {id: 2}) MERGE (c)-[:嫌疑人]->();
使用Neo4j的触发器(Trigger),当嫌疑人有新的转账交易创建时,触发器会检测该交易是否涉及到嫌疑人,并触发报警。
监听嫌疑人是否触发转账交易
CALL apoc.trigger.add('check_suspicious_transaction', ' UNWIND $createdNodes AS transaction MATCH (s:嫌疑人)-[:持有账户]->(:银行)-[:发起交易]->(transaction) WITH s, transaction MATCH (transaction)-[:转账给]->(b:受益人) RETURN s.name AS suspectName, transaction.id AS transactionId, b.name AS beneficiaryName ', {phase: 'before'})
创建报警触发器,发送通知。
CALL apoc.trigger.add('trigger_alert', ' UNWIND $suspiciousTransactions AS transaction CALL dbms.sendNotification("alert", "嫌疑人 " + transaction.suspectName + " 进行了转账交易 " + transaction.transactionId + ",转账给了受益人 " + transaction.beneficiaryName + ",触发报警!") YIELD value RETURN value ', {phase: 'after'})
拓展
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)