原理

 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'})

拓展

利用AI大模型绘制知识图谱

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐