交易与账户数据模型
1. 节点标签与属性
|
拟议变更
以下关于欺诈调查的增补内容为拟议变更,待最终确定
|
Account (账户)
标签
-
Account: (必填) 系统中所有银行账户的基础标签 -
Internal: 本行持有的账户标签(即我行客户账户)。对于识别流出本组织的资金(内部→外部交易)或流入的流动资金(外部→内部交易)至关重要 -
External: 其他金融机构持有的账户标签。对于监控跨机构转账和识别潜在的洗钱模式至关重要 -
HighRiskJurisdiction: 位于监管或合规风险较高国家/地区的账户标签 -
Flagged: (拟议) 由欺诈检测规则标记的账户的可选标签(适用于可视化和演示查询) -
UnderInvestigation: (拟议) 当前处于欺诈调查中的账户的可选标签 -
Confirmed: (拟议) 已确认为欺诈或遭入侵账户的可选标签
属性
-
accountNumber(字符串): 唯一账户标识符(例如,分类代码和账号、IBAN) -
accountType(字符串): 可选:账户类型(例如,“CURRENT/活期”、“SAVINGS/储蓄”、“BUSINESS/对公”、“LOAN/贷款”) -
openedDate(日期时间): 可选:账户首次开立的日期和时间 -
closedDate(日期时间): 可选:账户永久关闭的日期和时间(若仍处于活跃状态则为空) -
suspendedDate(日期时间): 可选:账户暂时冻结的日期和时间(若未冻结则为空)
Alert (警报) (拟议)
属性
-
alertId(字符串): 警报的唯一标识符 -
ruleName(字符串): 触发此警报的欺诈检测规则的可读名称 -
ruleId(字符串): 可选:规则的系统标识符(用于跟踪规则版本) -
severity(字符串): 可选:警报严重程度(例如,“LOW/低”、“MEDIUM/中”、“HIGH/高”、“CRITICAL/紧急”) -
triggeredAt(日期时间): 警报触发的时间戳
Address (地址)
属性
-
addressLine1(字符串): 包含门牌号/建筑名和街道名称的主要地址行 -
addressLine2(字符串): 可选:次要地址详情,如公寓号、建筑名称或地产名称 -
postTown(字符串): 英国皇家邮政定义的邮政城镇(用于投递的城镇或城市) -
postCode(字符串): 地址的英国邮政编码或国际邮政编码 -
region(字符串): 可选:县、州或行政区域 -
latitude(浮点数): 可选:用于精确位置映射的地理纬度坐标 -
longitude(浮点数): 可选:用于精确位置映射的地理经度坐标 -
createdAt(日期时间): 此地址首次记录在系统中的时间戳
Case (案件) (拟议)
属性
-
caseId(字符串): 调查案件的唯一标识符 -
status(字符串): 调查的当前状态(例如,“OPEN/开放”、“UNDER_INVESTIGATION/调查中”、“CLOSED/已关闭”、“ESCALATED/已升级”) -
outcome(字符串): 可选:调查结果(例如,“PROVEN_FRAUD/证实欺诈”、“FRAUD_UNPROVABLE/无法证明欺诈”、“NOT_FRAUD/非欺诈”、“EXCESSIVE_CLAIM/过度索赔”) -
financialStakes(浮点数): 可选:案件涉及或处于风险中的货币价值 -
investigatedBy(字符串): 可选:分配给此案件的调查员的用户 ID 或姓名 -
createdAt(日期时间): 案件开启的时间戳 -
closedAt(日期时间): 可选:案件关闭的时间戳(若仍处于开放状态则为空)
Counterparty (交易对手)
属性
-
counterpartyId(字符串): 交易对手实体的唯一系统标识符 -
name(字符串): 交易对手的法定名称(个人的全名或注册公司名称) -
type(字符串): 交易对手的分类(例如,“INDIVIDUAL/个人”、“BUSINESS/企业”、“GOVERNMENT/政府”、“CHARITY/慈善机构”) -
registrationNumber(字符串): 可选:官方注册编号(公司注册号、慈善机构编号等) -
createdAt(日期时间): 此交易对手首次记录在系统中的时间戳
Country (国家/地区)
属性
-
code(字符串): 双字母 ISO 3166-1 alpha-2 国家/地区代码(例如,英国为“GB”,美国为“US”) -
name(字符串): 官方全称(英文)
Customer (客户)
属性
-
customerId(字符串): 客户记录的唯一系统标识符 -
firstName(字符串): 可选:客户的名字 -
middleName(字符串): 可选:客户的中间名或首字母缩写 -
lastName(字符串): 可选:客户的姓氏 -
dateOfBirth(日期): 可选:客户出生日期(用于身份验证和年龄计算) -
placeOfBirth(字符串): 可选:客户出生城市或地点(如官方文件所示) -
countryOfBirth(字符串): 可选:客户出生国的 ISO 3166-1 代码(可能与国籍不同)
Device (设备)
属性
-
deviceId(字符串): 访问系统的设备的唯一指纹或标识符 -
deviceType(字符串): 可选:设备类别(例如,“mobile/移动端”、“desktop/桌面端”、“tablet/平板”、“unknown/未知”) -
userAgent(字符串): 可选:包含设备和软件信息的浏览器或应用程序用户代理字符串 -
createdAt(日期时间): 此设备首次在系统中被检测并记录的时间戳
DrivingLicense (驾照)
属性
-
licenseNumber(字符串): 打印在实体证件上的唯一驾照编号 -
issueDate(日期): 可选:驾照最初签发的日期 -
expiryDate(日期): 可选:驾照过期并需要更新的日期 -
issuingCountry(字符串): 可选:签发该驾照的主管机构的 ISO 3166-1 国家/地区代码 -
createdAt(日期时间): 此驾照记录首次在系统中创建的时间戳
Email (电子邮件)
属性
-
address(字符串): 完整的电子邮件地址(例如,“john.smith@example.com”) -
domain(字符串): 可选:电子邮件地址的域名部分(例如,“example.com”) -
createdAt(日期时间): 此电子邮件地址首次记录在系统中的时间戳
Face (人脸)
属性
-
faceId(字符串): 人脸生物识别记录的唯一标识符 -
embedding(浮点数列表): 面部特征的高维向量表示(通常为 512-1536 维) -
createdAt(日期时间): 此人脸生物识别记录在系统中创建的时间戳
Location (位置)
属性
-
city(字符串): 城市或主要人口中心名称 -
postCode(字符串): 一般区域的邮政编码(为保护隐私可能为部分代码) -
country(字符串): 此位置所在的 ISO 3166-1 国家/地区代码 -
latitude(浮点数): 可选:位置中心的地理纬度坐标 -
longitude(浮点数): 可选:位置中心的地理经度坐标 -
createdAt(日期时间): 此位置首次记录在系统中的时间戳
Movement (资金移动)
属性
-
movementId(字符串): 此单次资金移动的唯一系统标识符 -
amount(浮点数): 此特定移动的货币价值(始终为正数) -
currency(字符串): 三字母 ISO 4217 货币代码(例如,“GBP”、“USD”、“EUR”) -
date(日期时间): 此移动执行或计划的日期和时间 -
description(字符串): 可选:解释移动目的的可读描述(例如,“保险赔付 1/3”) -
status(字符串): 可选:当前处理状态(例如,“PENDING/挂起”、“COMPLETED/完成”、“CANCELLED/取消”、“FAILED/失败”) -
sequenceNumber(整数): 此移动在系列中的时间顺序(从 1 开始) -
authorisedBy(字符串): 可选:批准此移动的人员的用户 ID 或姓名 -
validatedBy(字符串): 可选:提供二次审批的人员的用户 ID 或姓名(用于双重控制流程) -
createdAt(日期时间): 此移动记录最初在系统中创建的时间戳
Passport (护照)
属性
-
passportNumber(字符串): 打印在证件上的唯一护照号码 -
issueDate(日期): 可选:护照最初签发的日期 -
expiryDate(日期): 可选:护照过期并需要更新的日期 -
issuingCountry(字符串): 可选:签发该护照的政府的 ISO 3166-1 国家/地区代码 -
nationality(字符串): 可选:护照中记录的国籍(可能与签发国不同) -
createdAt(日期时间): 此护照记录首次在系统中创建的时间戳
Phone (电话)
属性
-
phoneNumber(字符串): 包含国家代码的完整电话号码 -
countryCode(字符串): 可选:带加号前缀的国际拨号代码(例如,“+44”、“+1”) -
createdAt(日期时间): 此电话号码首次记录在系统中的时间戳
2. 关系类型与属性
|
拟议变更
以下关于欺诈调查的关系为拟议变更,待最终确定
|
:HAS_ACCOUNT (拥有账户)
-
方向: 客户→账户
-
属性
-
role(字符串): 客户在账户上的角色(例如,“owner/所有者”、“joint/联名”、“authorised_signatory/授权签署人”) -
since(日期时间): 建立此账户关系的日期和时间
-
:HAS_ADDRESS (拥有地址)
-
方向: 客户→地址
-
属性
-
addedAt(日期时间): 此地址首次链接到客户的时间 -
lastChangedAt(日期时间): 地址详情最后一次更新的时间 -
isCurrent(布尔值): 这是否为客户的当前居住地址
-
:HAS_DRIVING_LICENSE (持有驾照)
-
方向: 客户→驾照
-
属性
-
verificationDate(日期时间): 银行验证驾照的时间 -
verificationMethod(字符串): 执行验证的方法(例如,“BRANCH_VERIFIED/网点验证”、“DIGITAL_SCAN/数字扫描”、“VIDEO_KYC/视频 KYC”) -
verificationStatus(字符串): 当前验证状态(例如,“VERIFIED/已验证”、“PENDING/待处理”、“REJECTED/已拒绝”、“EXPIRED/已过期”)
-
:HAS_FACE (拥有人脸记录)
-
方向: 客户→人脸
-
属性
-
verificationDate(日期时间): 将人脸生物识别与客户进行核对的时间 -
verificationMethod(字符串): 执行人脸验证的方法(例如,“SELFIE/自拍”、“VIDEO_KYC/视频 KYC”、“BRANCH_PHOTO/网点现场照”) -
verificationStatus(字符串): 当前验证状态(例如,“VERIFIED/已验证”、“PENDING/待处理”、“REJECTED/已拒绝”)
-
:HAS_PASSPORT (持有护照)
-
方向: 客户→护照
-
属性
-
verificationDate(日期时间): 银行验证护照的时间 -
verificationMethod(字符串): 执行验证的方法(例如,“BRANCH_VERIFIED/网点验证”、“DIGITAL_SCAN/数字扫描”、“VIDEO_KYC/视频 KYC”) -
verificationStatus(字符串): 当前验证状态(例如,“VERIFIED/已验证”、“PENDING/待处理”、“REJECTED/已拒绝”、“EXPIRED/已过期”)
-
:IMPLIED (隐含)
-
方向: 交易→资金移动
-
属性
-
totalMovements(整数): 此交易将产生的资金移动总数
-
-
描述: 当单笔交易产生多笔独立的支付时,将交易链接到其组成的资金移动(例如,分期支付的保险赔偿、分批发放的贷款)
3. 约束与索引
// Constraints
CREATE CONSTRAINT customer_id IF NOT EXISTS
FOR (c:Customer) REQUIRE c.customerId IS NODE KEY;
CREATE CONSTRAINT email_address IF NOT EXISTS
FOR (e:Email) REQUIRE e.address IS NODE KEY;
CREATE CONSTRAINT phone_number IF NOT EXISTS
FOR (p:Phone) REQUIRE p.number IS NODE KEY;
CREATE CONSTRAINT passport_composite IF NOT EXISTS
FOR (p:Passport) REQUIRE (p.passportNumber, p.issuingCountry) IS NODE KEY;
CREATE CONSTRAINT driving_license_composite IF NOT EXISTS
FOR (d:DrivingLicense) REQUIRE (d.licenseNumber, d.issuingCountry) IS NODE KEY;
CREATE CONSTRAINT device_id IF NOT EXISTS
FOR (d:Device) REQUIRE d.deviceId IS NODE KEY;
CREATE CONSTRAINT ip_address IF NOT EXISTS
FOR (i:IP) REQUIRE i.ipAddress IS NODE KEY;
CREATE CONSTRAINT session_id IF NOT EXISTS
FOR (s:Session) REQUIRE s.sessionId IS NODE KEY;
CREATE CONSTRAINT account_number IF NOT EXISTS
FOR (a:Account) REQUIRE a.accountNumber IS NODE KEY;
CREATE CONSTRAINT transaction_id IF NOT EXISTS
FOR (t:Transaction) REQUIRE t.transactionId IS NODE KEY;
CREATE CONSTRAINT face_id IF NOT EXISTS
FOR (f:Face) REQUIRE f.faceId IS NODE KEY;
CREATE CONSTRAINT counterparty_id IF NOT EXISTS
FOR (cp:Counterparty) REQUIRE cp.counterpartyId IS NODE KEY;
CREATE CONSTRAINT movement_id IF NOT EXISTS
FOR (m:Movement) REQUIRE m.movementId IS NODE KEY;
CREATE CONSTRAINT isp_name IF NOT EXISTS
FOR (i:ISP) REQUIRE i.name IS NODE KEY;
CREATE CONSTRAINT country_code IF NOT EXISTS
FOR (c:Country) REQUIRE c.code IS NODE KEY;
CREATE CONSTRAINT address_composite IF NOT EXISTS
FOR (a:Address) REQUIRE (a.addressLine1, a.postTown, a.postCode) IS NODE KEY;
// Proposed: Fraud investigation constraints
CREATE CONSTRAINT alert_id IF NOT EXISTS
FOR (a:Alert) REQUIRE a.alertId IS NODE KEY;
CREATE CONSTRAINT case_id IF NOT EXISTS
FOR (c:Case) REQUIRE c.caseId IS NODE KEY;
// Additional Indexes
CREATE INDEX transaction_date_idx IF NOT EXISTS FOR (t:Transaction) ON (t.date);
CREATE INDEX transaction_amount_idx IF NOT EXISTS FOR (t:Transaction) ON (t.amount);
// Vector index for face embeddings (used for biometric matching)
CALL db.index.vector.createNodeIndex(
'face_embedding_idx',
'Face',
'embedding',
1536, // dimensionality of the face embeddings (typical range: 512-1536)
'cosine' // similarity metric for comparing facial features
);
// Full Text Search
// Full-text index for customer name search
CREATE FULLTEXT INDEX customer_name_idx IF NOT EXISTS FOR (c:Customer) ON EACH [c.firstName, c.lastName, c.middleName];
4. 客户增强功能
位置数据源增强
在审查此数据模型时,我们发现了提高欺诈检测场景下位置准确性的机会。目前,该模型从 IP 地址派生位置数据,但移动设备的 GPS 坐标(若可用)可提供更高的精度。
拟议增强
-
建立从
Session节点到Location节点的直接LOCATED_IN关系 -
为关系添加一个
source属性以指示数据来源(例如,“IP”、“Device_GPS”、“WiFi_Network”) -
这将允许系统在保持备选方案的同时优先考虑更准确的位置数据
优势
-
通过精确的地理定位增强欺诈检测
-
灵活的数据源层次结构 (GPS > WiFi > IP)
-
保持与基于 IP 的位置数据的向后兼容性
5. 欺诈调查与风险管理
|
拟议变更
整个章节描述了待最终确定的拟议欺诈调查模式。这些增补内容提供了既适合演示又可用于生产的欺诈案件管理方法。 |
本节描述了两种管理欺诈调查工作流的互补方法
5.1 用于欺诈检测的账户标签 (演示/可视化)
为了可视化和演示目的,数据模型支持在 Account 节点上添加可选的欺诈相关标签
-
:Flagged- 由自动欺诈检测规则标记的账户 -
:UnderInvestigation- 当前处于主动欺诈调查中的账户 -
:Confirmed- 已确认为欺诈或遭入侵的账户
这些标签实现了简单的邻近查询,适用于演示、Bloom 可视化和快速模式分析。例如,查找已确认欺诈行为 3 跳范围内的账户
优势
-
用于演示的简单直观的查询
-
非常适合 Neo4j Bloom 中的图可视化
-
基于标签的遍历过滤可扩展至 Infinigraph
-
对不同欺诈状态的清晰分离
应用场景
-
演示和概念验证实施
-
调查期间的快速欺诈网络分析
-
基于 Bloom 的欺诈调查仪表板
5.2 案件节点模式 (生产环境)
对于生产环境实施,:Case 节点模式提供了一种更健壮且在法律上更可辩护的欺诈调查跟踪方法。该模式将调查元数据与客户和账户数据分离,从而解决了法律和合规问题。
关键优势
-
法律保护: 避免直接在客户/账户节点上使用指控性标签,降低了客户行使“访问权”时的法律责任
-
访问控制: 调查案件可与客户数据隔离并设置单独的权限,这对于内部欺诈调查尤为重要
-
丰富的元数据: 案件可存储详细的调查信息,包括调查人员、财务风险、结果和时间线
-
匿名化路径: 案件可以分离出来进行匿名化,同时保留对历史欺诈模式的报告能力
-
警报跟踪: 链接到
:Alert节点,以捕获触发调查的具体规则
模式结构
该模式使用三个主要组件
-
案件节点 - 代表调查本身,包含状态、结果、调查人员和财务细节
-
警报节点 - 捕获欺诈检测规则触发情况,包含规则名称、严重等级和时间戳
-
关系 -
:SUBJECT_OF将账户/客户链接到案件,:TRIGGERED将警报链接到案件
这种分离允许调查人员建立完整的案卷,同时保持客户数据的清洁和合规。
6. 最简演示代码
以下 Cypher 代码创建了一个完整的示例数据集,演示了该模型中的所有主要实体和关系。此代码适用于测试和演示目的。
//--------------------
// Create base countries
//--------------------
CREATE (uk:Country {code: "GB", name: "United Kingdom"})
CREATE (us:Country {code: "US", name: "United States"})
//--------------------
// Create customer and their identity information
//--------------------
// Create main customer node
CREATE (c:Customer {
customerId: "CUS001",
firstName: "John",
middleName: "Michael",
lastName: "Smith",
dateOfBirth: date("1990-01-01"),
placeOfBirth: "Manchester",
countryOfBirth: "GB"
})
// Create customer's address
CREATE (addr:Address {
addressLine1: "123 High Street",
addressLine2: "Flat 4B",
postTown: "London",
postCode: "SW1A 1AA",
region: "Greater London",
latitude: 51.5074,
longitude: -0.1278,
createdAt: datetime("2024-01-01T00:00:00")
})
// Create customer's contact information
CREATE (e:Email {
address: "john@example.com",
domain: "example.com",
createdAt: datetime("2024-01-01T00:00:00")
})
CREATE (ph:Phone {
number: "447971020304",
countryCode: "+44",
createdAt: datetime("2024-01-01T00:00:00")
})
// Create customer's identity documents
CREATE (p:Passport {
passportNumber: "123456789",
issueDate: date("2020-01-01"),
expiryDate: date("2030-01-01"),
issuingCountry: "GB",
nationality: "British",
createdAt: datetime("2024-01-01T00:00:00")
})
CREATE (dl:DrivingLicense {
licenseNumber: "SMITH901011J99AB",
issueDate: date("2018-01-01"),
expiryDate: date("2028-01-01"),
issuingCountry: "GB",
createdAt: datetime("2024-01-01T00:00:00")
})
// Create customer's face biometric
CREATE (f:Face {
faceId: "FACE001",
embedding: [0.153, 0.254, 0.255, 0.0, 0.0, 0.253, 0.200, 0.252, 0.254, 0.100, 0.253], // Truncated example of 1536-dimension vector
createdAt: datetime("2024-01-01T00:00:00")
})
//--------------------
// Create all identity relationships
//--------------------
// Link customer to their identity information
CREATE (c)-[:HAS_ADDRESS {
addedAt: datetime("2024-01-01T00:00:00"),
lastChangedAt: datetime("2024-01-01T00:00:00"),
isCurrent: true
}]->(addr)
CREATE (addr)-[:LOCATED_IN]->(uk)
CREATE (c)-[:HAS_EMAIL {since: datetime("2024-01-01T00:00:00")}]->(e)
CREATE (c)-[:HAS_PHONE {since: datetime("2024-01-01T00:00:00")}]->(ph)
CREATE (c)-[:HAS_NATIONALITY]->(uk)
// Link customer to their identity documents
CREATE (c)-[:HAS_PASSPORT {
verificationDate: datetime("2024-01-01T00:00:00"),
verificationMethod: "VIDEO_KYC",
verificationStatus: "VERIFIED"
}]->(p)
CREATE (c)-[:HAS_DRIVING_LICENSE {
verificationDate: datetime("2024-01-01T00:00:00"),
verificationMethod: "BRANCH_VERIFIED",
verificationStatus: "VERIFIED"
}]->(dl)
CREATE (c)-[:HAS_FACE {
verificationDate: datetime("2024-01-01T00:00:00"),
verificationMethod: "SELFIE",
verificationStatus: "VERIFIED"
}]->(f)
//--------------------
// Create digital access nodes
//--------------------
// Create device, IP, ISP, and session information
CREATE (d:Device {
deviceId: "DEV001",
deviceType: "desktop",
userAgent: "Mozilla/5.0 Chrome/91.0",
createdAt: datetime("2024-01-01T00:00:00")
})
CREATE (ip:IP {ipAddress: "192.168.1.1", createdAt: datetime("2024-01-01T00:00:00")})
CREATE (isp:ISP {name: "BT", createdAt: datetime("2024-01-01T00:00:00")})
CREATE (loc:Location {
city: "London",
postCode: "SW1A",
country: "GB",
latitude: 51.5074,
longitude: -0.1278,
createdAt: datetime("2024-01-01T00:00:00")
})
CREATE (s:Session {
sessionId: "SESS001",
status: "success",
createdAt: datetime("2024-03-01T10:00:00")
})
// Create digital access relationships
CREATE (d)-[:USED_BY {lastUsed: datetime("2024-03-01T10:00:00")}]->(c)
CREATE (s)-[:USES_IP]->(ip)
CREATE (ip)-[:IS_ALLOCATED_TO {createdAt: datetime("2024-01-01T00:00:00")}]->(isp)
CREATE (ip)-[:LOCATED_IN {createdAt: datetime("2024-01-01T00:00:00")}]->(loc)
CREATE (loc)-[:LOCATED_IN]->(uk)
CREATE (s)-[:SESSION_USES_DEVICE]->(d)
//--------------------
// Create banking nodes
//--------------------
// Create internal and external accounts
CREATE (a:Account:Internal {
accountNumber: "ACC001",
accountType: "CURRENT",
openedDate: datetime("2024-01-01T00:00:00"),
closedDate: null,
suspendedDate: null
})
CREATE (a2:Account:External:HighRiskJurisdiction {
accountNumber: "ACC002",
accountType: null,
openedDate: null,
closedDate: null,
suspendedDate: null
})
// Create transaction
CREATE (t1:Transaction {
transactionId: "TXN001",
amount: 1000.00,
currency: "GBP",
date: datetime("2024-03-01T11:00:00"),
message: "Payment for services",
type: "SWIFT"
})
//--------------------
// Create banking relationships
//--------------------
// Link accounts to customer and countries
CREATE (c)-[:HAS_ACCOUNT {role: "OWNER", since: datetime("2024-01-01T00:00:00")}]->(a)
CREATE (a)-[:IS_HOSTED]->(uk)
CREATE (a2)-[:IS_HOSTED]->(us)
// Create transaction flow
CREATE (a)-[:PERFORMS]->(t1)-[:BENEFITS_TO]->(a2)
//--------------------
// Create movements for transaction (example: insurance claim paid in instalments)
//--------------------
// Create movements
CREATE (m1:Movement {
movementId: "MOV001",
amount: 400.00,
currency: "GBP",
date: datetime("2024-03-05T10:00:00"),
description: "Insurance claim payment 1 of 3",
status: "COMPLETED",
sequenceNumber: 1,
authorisedBy: "USER001",
validatedBy: "MANAGER001",
createdAt: datetime("2024-03-01T11:00:00")
})
CREATE (m2:Movement {
movementId: "MOV002",
amount: 400.00,
currency: "GBP",
date: datetime("2024-03-12T10:00:00"),
description: "Insurance claim payment 2 of 3",
status: "COMPLETED",
sequenceNumber: 2,
authorisedBy: "USER001",
validatedBy: "MANAGER002",
createdAt: datetime("2024-03-01T11:00:00")
})
CREATE (m3:Movement {
movementId: "MOV003",
amount: 200.00,
currency: "GBP",
date: datetime("2024-03-19T10:00:00"),
description: "Insurance claim payment 3 of 3",
sequenceNumber: 3,
authorisedBy: "USER001",
validatedBy: null,
createdAt: datetime("2024-03-01T11:00:00")
})
// Link transaction to movements
CREATE (t1)-[:IMPLIED {totalMovements: 3}]->(m1)
CREATE (t1)-[:IMPLIED {totalMovements: 3}]->(m2)
CREATE (t1)-[:IMPLIED {totalMovements: 3}]->(m3)
//--------------------
// Create counterparty
//--------------------
// Create counterparty and their address
CREATE (cp:Counterparty {
counterpartyId: "CP001",
name: "ACME Corporation Ltd",
type: "BUSINESS",
registrationNumber: "12345678",
createdAt: datetime("2024-02-01T00:00:00")
})
CREATE (cpAddr:Address {
addressLine1: "456 Business Park",
addressLine2: "Suite 100",
postTown: "Birmingham",
postCode: "B1 1AA",
region: "West Midlands",
latitude: 52.4862,
longitude: -1.8904,
createdAt: datetime("2024-02-01T00:00:00")
})
// Link counterparty to address and account
CREATE (cp)-[:HAS_ADDRESS {
since: datetime("2024-02-01T00:00:00"),
isCurrent: true
}]->(cpAddr)
CREATE (cpAddr)-[:LOCATED_IN]->(uk)
CREATE (cp)-[:HAS_ACCOUNT {
since: datetime("2024-02-01T00:00:00")
}]->(a2)
//--------------------
// Create fraud investigation example
//--------------------
// Create a flagged account (demonstrates label-based fraud detection)
CREATE (a3:Account:Internal:Flagged {
accountNumber: "ACC003",
accountType: "CURRENT",
openedDate: datetime("2023-06-15T00:00:00"),
closedDate: null,
suspendedDate: null
})
CREATE (a3)-[:IS_HOSTED]->(uk)
// Create a second customer who owns the flagged account
CREATE (c2:Customer {
customerId: "CUS002",
firstName: "Jane",
lastName: "Doe",
dateOfBirth: date("1985-05-15"),
placeOfBirth: "Birmingham",
countryOfBirth: "GB"
})
CREATE (c2)-[:HAS_ACCOUNT {role: "OWNER", since: datetime("2023-06-15T00:00:00")}]->(a3)
// Create transaction from flagged account to high-risk jurisdiction
CREATE (t2:Transaction {
transactionId: "TXN002",
amount: 15000.00,
currency: "GBP",
date: datetime("2024-03-10T14:30:00"),
message: "Large transfer",
type: "SWIFT"
})
CREATE (a3)-[:PERFORMS]->(t2)-[:BENEFITS_TO]->(a2)
// Create alerts that triggered for this account
CREATE (alert1:Alert {
alertId: "ALERT001",
ruleName: "Large Transaction to High Risk Jurisdiction",
ruleId: "RULE_FR_001",
severity: "HIGH",
triggeredAt: datetime("2024-03-10T14:35:00")
})
CREATE (alert2:Alert {
alertId: "ALERT002",
ruleName: "Unusual Transaction Pattern",
ruleId: "RULE_FR_015",
severity: "MEDIUM",
triggeredAt: datetime("2024-03-10T15:00:00")
})
// Create investigation case (demonstrates production case pattern)
CREATE (case1:Case {
caseId: "CASE001",
status: "UNDER_INVESTIGATION",
outcome: null,
financialStakes: 15000.00,
investigatedBy: "FRAUD_TEAM_001",
createdAt: datetime("2024-03-10T16:00:00"),
closedAt: null
})
// Link alerts to the case
CREATE (alert1)-[:TRIGGERED]->(case1)
CREATE (alert2)-[:TRIGGERED]->(case1)
// Link account and customer to the investigation case
CREATE (a3)-[:SUBJECT_OF]->(case1)
CREATE (c2)-[:SUBJECT_OF]->(case1)