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 转账金额列表
Cypher 路径查询在反欺诈中的应用示例 设备 FINGERPRINT_XYZ 借款人 A 借款人 B 借款人 C 使用设备 使用设备 使用设备 转账 5000 转账 8000 路径查询结果分析 • 1跳路径:设备 → 借款人A/B/C(共享设备风险) • 2跳路径:借款人A → 借款人B(设备关联后的资金流转) • 可变路径:A→B→C 构成3跳资金链,需设定路径深度阈值

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 基础语法和路径查询后,你已经具备了从反欺诈图谱中提取关联数据的能力。下一阶段,我们将学习如何将这些查询结果转化为可量化的特征指标,为阈值调优提供数据输入。