cookbook/ Finance & AML Patterns
Last Updated: October 20, 2018Graph patterns for fraud detection, anti-money laundering, and risk.
Financial Services Cookbook
A collection of graph-native patterns for the banking and finance sector.
1. Anti-Money Laundering (AML)
Simple Money Circular Flow
gsqlterminal// Detects if money moves from Account A back to Account A through 3-5 hops CREATE QUERY detect_circular_transfer(VERTEX<Account> start_account, INT max_hops) FOR GRAPH FinanceGraph { OrAccum @visited = false; ListAccum<VERTEX<Account>> @path; Start = {start_account}; // Traverse through transfers WHILE Start.size() > 0 AND max_hops > 0 DO Start = SELECT t FROM Start:s -(TRANSFER:e)-> Account:t ACCUM t.@path += s POST_ACCUM IF t == start_account THEN PRINT "Circular flow detected", t.@path END; max_hops = max_hops - 1; END; }
High Frequency Layering
gsqlterminal// Detect accounts with more than 10 incoming transfers within 1 hour CREATE QUERY layering_detection(DATETIME window_start) FOR GRAPH FinanceGraph { SumAccum<INT> @transfer_count; Accounts = {Account.*}; Result = SELECT t FROM Accounts:s -(TRANSFER:e)-> Account:t WHERE e.timestamp BETWEEN window_start AND datetime_add(window_start, INTERVAL 1 HOUR) ACCUM t.@transfer_count += 1 HAVING t.@transfer_count > 10; PRINT Result; }
2. Fraud Detection
Synthetic Identity Check
gsqlterminal// Find accounts sharing the same Phone or SSN but different Names CREATE QUERY synthetic_identity() FOR GRAPH FinanceGraph { MapAccum<STRING, SetAccum<VERTEX<Account>>> @@shared_attrs; Users = {User.*}; // Group users by SSN Result = SELECT s FROM Users:s ACCUM @@shared_attrs += (s.ssn -> s); // Filter for SSNs linked to multiple names FOREACH (ssn, user_set) IN @@shared_attrs DO IF user_set.size() > 1 THEN PRINT ssn, user_set; END; END; }
3. Credit Risk
Path to Delinquent Entity
gsqlterminal// Find exposure to a high-risk entity within 3 hops CREATE QUERY risk_exposure(VERTEX<Entity> risk_source) FOR GRAPH FinanceGraph { SumAccum<INT> @dist = 0; OrAccum @is_exposed = false; Start = {risk_source}; FOR i IN 1..3 DO Start = SELECT t FROM Start:s -(:e)-> Entity:t WHERE t.@is_exposed == false ACCUM t.@is_exposed = true, t.@dist = i; END; PRINT Start[Start.name, Start.@dist]; }
4. Merchant Analytics
Common Customer Analysis
gsqlterminal// Merchants sharing the most customers CREATE QUERY shared_customers(VERTEX<Merchant> m1, VERTEX<Merchant> m2) FOR GRAPH FinanceGraph { SumAccum<INT> @@common_count; Start = {m1}; Customers = SELECT t FROM Start:s -(PURCHASED_AT:e)- Customer:t; Result = SELECT s FROM Customers:s -(PURCHASED_AT:e)- Merchant:t WHERE t == m2 ACCUM @@common_count += 1; PRINT @@common_count; }
5. Transaction Monitoring (Batch)
Daily Aggregate by Region
gsqlterminalCREATE QUERY regional_daily_volume(DATETIME d) FOR GRAPH FinanceGraph { SumAccum<DOUBLE> @daily_sum; Regions = {Region.*}; Result = SELECT s FROM Regions:s -(CONTAINS:e)- City:c -(HAS_ACCOUNT:e)- Account:a -(TRANSFER:t)- Account:a2 WHERE t.timestamp BETWEEN d AND datetime_add(d, INTERVAL 1 DAY) ACCUM s.@daily_sum += t.amount; PRINT Result; }
[!NOTE] These patterns can be scaled to billions of transactions by leveraging TigerGraph's massive parallel processing (MPP) capabilities.
On this page
TigerGraph Book
v1.0 Curated