4. 图谱查询语言基础:Cypher基础语法、MATCH/RETURN/WHERE/CREATE操作、简单路径查询
在反欺诈图谱系统中,Cypher 是操作图数据库的核心语言。它专为属性图设计,通过直观的 ASCII 艺术语法描述节点和关系,让分析师能够快速从关联数据中提取欺诈线索。本章将系统讲解 Cypher 的基础语法、四大核心操作以及路径查询方法,为后续的阈值调优奠定数据检索基础。
4.1 Cypher 语法基础
Cypher 的语法围绕图结构的三要素设计:节点(用圆括号 () 表示)、关系(用方括号 [] 表示,置于箭头 --> 或 <-- 中)和属性(键值对形式)。其核心思想是用模式匹配来描述你想从图中查找的结构。
| 语法元素 | 表示方式 | 示例 | 说明 |
|---|---|---|---|
| 节点 | (变量:标签 {属性}) |
(p:Person {name:'张三'}) |
变量 p 引用标签为 Person、属性 name 为张三的节点 |
| 关系 | -[变量:类型 {属性}]-> |
-[t:转账 {金额:5000}]-> |
变量 t 引用类型为转账、属性金额为 5000 的关系 |
| 路径 | (节点1)-[关系]->(节点2) |
(a)-[:转账]->(b) |
从节点 a 到节点 b 的一条转账关系路径 |
| 模式 | 多个节点和关系组合 | (a)-[:转账]->(b)<-[:转账]-(c) |
描述 a 转账给 b,同时 c 也转账给 b 的结构 |
Person、Device、Account),关系类型代表行为(如转账、登录、共享设备)。合理设计标签和类型是高效查询的前提。
4.2 核心操作:MATCH / RETURN / WHERE / CREATE
这四个子句构成了 Cypher 查询的骨架:MATCH 用于匹配图模式,RETURN 用于返回结果,WHERE 用于过滤条件,CREATE 用于创建节点或关系。
4.2.1 MATCH 与 RETURN
MATCH 是查询的起点,它告诉数据库你要寻找什么样的图结构。RETURN 则指定查询结果中需要返回哪些字段、节点或关系。
// 查询所有 Person 节点
MATCH (p:Person)
RETURN p
// 查询特定人员的姓名和年龄
MATCH (p:Person)
WHERE p.name = '李四'
RETURN p.name, p.age
// 查询所有转账关系及其金额
MATCH (a:Person)-[t:转账]->(b:Person)
RETURN a.name AS 转出方, b.name AS 接收方, t.金额 AS 转账金额
4.2.2 WHERE 过滤
WHERE 子句用于对 MATCH 的结果进行精细化过滤,支持比较运算符、逻辑运算符和字符串匹配等。
| 运算符类型 | 常用符号/函数 | 反欺诈应用示例 |
|---|---|---|
| 比较 | =, <>, >, <, >=, <= |
WHERE t.金额 > 10000(筛选大额转账) |
| 逻辑 | AND, OR, NOT |
WHERE p.年龄 > 60 AND p.注册天数 < 7 |
| 字符串 | STARTS WITH, CONTAINS, ENDS WITH |
WHERE p.手机号 STARTS WITH '170'(虚拟运营商号段) |
| 列表 | IN |
WHERE p.设备ID IN ['DEV001','DEV002'] |
| 存在性 | exists() |
WHERE exists(p.身份证号) |
// 查询单日转账超过5笔且总金额大于5万的账户
MATCH (a:Account)-[t:转账]->(b:Account)
WHERE t.日期 = '2025-01-15'
WITH a, count(t) AS 转账次数, sum(t.金额) AS 总金额
WHERE 转账次数 > 5 AND 总金额 > 50000
RETURN a.账号, 转账次数, 总金额
4.2.3 CREATE 创建
CREATE 用于向图谱中插入新的节点和关系,是构建反欺诈知识图谱的基础操作。
// 创建一个人节点
CREATE (p:Person {姓名: '王五', 身份证号: '110101199001011234', 年龄: 35})
// 创建两个节点并建立关系
CREATE (a:Account {账号: '6222021234567890', 开户行: '北京分行'})
CREATE (b:Account {账号: '6222020987654321', 开户行: '上海分行'})
CREATE (a)-[:转账 {金额: 20000, 时间: datetime('2025-01-20T10:30:00')}]->(b)
// 使用 MERGE 避免重复创建(CREATE OR MATCH 的合体)
MERGE (p:Person {身份证号: '110101199001011234'})
ON CREATE SET p.姓名 = '赵六', p.年龄 = 28
ON MATCH SET p.最后活跃时间 = datetime()
MERGE 比 CREATE 更安全,因为它能防止重复节点导致的数据冗余。对于身份证号、设备指纹等唯一标识,建议始终使用 MERGE。
4.3 简单路径查询
路径查询是反欺诈图谱分析的核心能力,它允许我们沿着关系链发现隐藏的关联模式。Cypher 通过可变长度路径和方向控制来实现灵活查询。
4.3.1 固定长度路径
当你知道两个节点之间的具体步数时,使用固定长度路径查询。
// 查询与目标账户直接发生转账的账户(1跳)
MATCH (a:Account {账号: 'TARGET001'})-[t:转账]->(b:Account)
RETURN b.账号, t.金额
// 查询通过一个中间人的间接转账(2跳)
MATCH (a:Account {账号: 'TARGET001'})-[t1:转账]->(m:Account)-[t2:转账]->(b:Account)
RETURN a.账号, m.账号, b.账号, t1.金额, t2.金额
4.3.2 可变长度路径
当你不确定具体步数时,使用 *min..max 语法指定路径长度范围。
// 查询1到3跳内的所有转账路径
MATCH path = (a:Account {账号: 'TARGET001'})-[:转账*1..3]->(b:Account)
RETURN path, length(path) AS 路径长度
// 查询所有通过转账可达的账户(不限跳数,但需设置上限防止全图扫描)
MATCH path = (a:Account {账号: 'TARGET001'})-[:转账*1..5]->(b:Account)
WHERE a <> b
RETURN b.账号, length(path) AS 跳数
ORDER BY 跳数
4.3.3 路径方向与过滤
在反欺诈中,关系方向往往携带重要语义。Cypher 支持双向查询和方向无关查询。
// 查询所有与目标账户有转账关系的账户(不分方向)
MATCH (a:Account {账号: 'TARGET001'})-[:转账]-(b:Account)
RETURN DISTINCT b.账号
// 查询资金流入路径(只关心转入目标账户的路径)
MATCH path = (a:Account)-[:转账]->(b:Account {账号: 'TARGET001'})
RETURN a.账号, length(path) AS 入金跳数
// 结合 WHERE 过滤路径中的中间节点属性
MATCH path = (a:Account {账号: 'TARGET001'})-[:转账*1..3]->(b:Account)
WHERE ALL(x IN nodes(path) WHERE x.开户行 <> '高风险分行')
RETURN path
4.4 反欺诈路径查询实战示例
以下是一个完整的反欺诈路径查询案例,用于发现“多头借贷”模式——多个借款人共享同一设备或联系方式。
// 查询与目标设备关联的所有借款人(1跳)
MATCH (d:Device {设备指纹: 'FINGERPRINT_XYZ'})<-[:使用设备]-(p:Person)
RETURN p.姓名, p.身份证号, p.申请时间
// 查询通过设备关联的借款人之间的转账关系(2跳)
MATCH (d:Device {设备指纹: 'FINGERPRINT_XYZ'})<-[:使用设备]-(p1:Person),
(p1)-[:转账]->(p2:Person)
RETURN p1.姓名 AS 转出方, p2.姓名 AS 接收方,
p1.身份证号 AS 转出方ID, p2.身份证号 AS 接收方ID
// 查询共享设备的借款人构成的完整网络(可变路径)
MATCH path = (d:Device {设备指纹: 'FINGERPRINT_XYZ'})<-[:使用设备]-(p1:Person)
-[:转账*1..3]-(p2:Person)
WHERE p1 <> p2
RETURN p1.姓名 AS 起点, p2.姓名 AS 终点,
length(path) AS 关联深度,
[r IN relationships(path) | r.金额] AS 转账金额列表
4.5 常见错误与避坑指南
| 错误类型 | 错误示例 | 正确写法 | 说明 |
|---|---|---|---|
| 标签未指定 | MATCH (n) RETURN n |
MATCH (n:Person) RETURN n |
无标签匹配会扫描全图节点,性能极差 |
| 方向错误 | (a)-[:转账]-(b) 期望单向 |
(a)-[:转账]->(b) |
无箭头表示双向匹配,结果可能不符合预期 |
| 路径无上限 | [:转账*] |
[:转账*1..5] |
无上限路径可能导致查询超时或内存溢出 |
| 属性引用错误 | WHERE 金额 > 10000 |
WHERE t.金额 > 10000 |
属性必须通过变量引用,不能直接使用属性名 |
| 忘记 DISTINCT | RETURN b.账号 有重复 |
RETURN DISTINCT b.账号 |
路径查询常产生重复结果,需去重 |
CREATE INDEX FOR (p:Person) ON (p.身份证号),这能将查询时间从秒级降至毫秒级。
掌握 Cypher 基础语法和路径查询后,你已经具备了从反欺诈图谱中提取关联数据的能力。下一阶段,我们将学习如何将这些查询结果转化为可量化的特征指标,为阈值调优提供数据输入。