4. Cypher 基础:CREATE、MATCH、RETURN、WHERE、DELETE
Cypher 是 Neo4j 图数据库的声明式查询语言,专为属性图模型设计。在金融风险传导链路场景中,Cypher 用于创建实体节点、关系边,并通过模式匹配快速定位风险路径。本章聚焦五个核心子句,覆盖图数据的增、删、查全流程。
4.1 核心子句速览
| 子句 | 功能 | 金融场景示例 |
|---|---|---|
| CREATE | 创建节点或关系 | 新增一个企业节点或一笔担保关系 |
| MATCH | 匹配图模式 | 查找所有持股路径 |
| RETURN | 返回查询结果 | 返回风险传导链上的节点属性 |
| WHERE | 过滤条件 | 筛选逾期金额大于 500 万的节点 |
| DELETE | 删除节点或关系 | 移除已结清的担保关系 |
4.2 CREATE — 构建金融图谱的基石
CREATE 用于向图数据库写入节点和关系。节点用圆括号 () 表示,关系用方括号 [] 表示,箭头 -> 或 <- 指示方向。
4.2.1 创建节点
// 创建一个企业节点,包含标签和属性
CREATE (c:Company {name: '恒信集团', credit_code: '91110000MA12345678', industry: '房地产'})
4.2.2 创建关系
// 先匹配两个节点,再创建担保关系
MATCH (a:Company {name: '恒信集团'})
MATCH (b:Company {name: '盛达建设'})
CREATE (a)-[g:GUARANTEE {amount: 20000000, date: '2024-06-15'}]->(b)
实践要点:创建关系前务必先用 MATCH 定位两端节点,避免重复创建。金融图谱中关系必须携带金额、日期、合同号等关键属性。
4.3 MATCH + RETURN — 模式匹配与结果输出
MATCH 按图模式搜索,RETURN 决定输出内容。两者通常组合使用,是风险传导链路查询的核心。
// 查询所有持股路径,返回股东和被投企业
MATCH (s:Company)-[h:HOLD]->(t:Company)
RETURN s.name AS 股东, t.name AS 被投企业, h.ratio AS 持股比例
4.3.1 路径变量与多跳查询
// 查询两跳以内的担保传导链
MATCH path = (a:Company)-[:GUARANTEE*1..2]->(b:Company)
RETURN path, length(path) AS 传导深度
4.4 WHERE — 精准过滤风险节点
WHERE 子句在 MATCH 或 OPTIONAL MATCH 之后添加过滤条件,支持比较运算、字符串匹配、列表包含等。
4.4.1 常用过滤模式
// 查询逾期金额超过 1000 万且行业为房地产的节点
MATCH (c:Company)-[:LOAN]->(l:Loan)
WHERE l.overdue_amount > 10000000 AND c.industry = '房地产'
RETURN c.name, l.overdue_amount, l.due_date
4.4.2 路径条件过滤
// 查找持股比例超过 50% 的实际控制路径
MATCH path = (a:Company)-[h:HOLD*1..3]->(b:Company)
WHERE ALL(r IN h WHERE r.ratio > 0.5)
RETURN a.name AS 实际控制人, b.name AS 目标公司
常见陷阱:WHERE 不能直接引用关系属性中的路径变量。多跳查询中过滤每条关系属性时,必须使用
ALL() 或 ANY() 谓词遍历关系列表。
4.5 DELETE — 安全移除图谱元素
DELETE 用于删除节点或关系。删除节点前必须先删除其所有关联关系,否则会报约束错误。
4.5.1 删除关系
// 删除特定担保关系
MATCH (a:Company {name: '恒信集团'})-[g:GUARANTEE]->(b:Company {name: '盛达建设'})
DELETE g
4.5.2 级联删除节点
// 删除节点及其所有关系(DETACH DELETE)
MATCH (c:Company {name: '已注销企业'})
DETACH DELETE c
安全建议:生产环境中执行 DELETE 前,先用同结构的 MATCH + RETURN 预览待删除数据。金融图谱中的历史关系应标记为“已失效”而非直接删除,保留审计轨迹。
4.6 子句组合实战:风险传导链路查询
以下完整示例将 CREATE、MATCH、WHERE、RETURN 串联,模拟一条从“恒信集团”出发、经过两跳担保到达“天元建材”的风险传导链路。
// 步骤1:创建节点
CREATE (a:Company {name: '恒信集团', industry: '房地产'})
CREATE (b:Company {name: '盛达建设', industry: '建筑'})
CREATE (c:Company {name: '天元建材', industry: '建材'})
// 步骤2:创建担保关系
MATCH (a:Company {name: '恒信集团'})
MATCH (b:Company {name: '盛达建设'})
CREATE (a)-[:GUARANTEE {amount: 20000000}]->(b)
MATCH (b:Company {name: '盛达建设'})
MATCH (c:Company {name: '天元建材'})
CREATE (b)-[:GUARANTEE {amount: 15000000}]->(c)
// 步骤3:查询担保金额超过1000万的传导路径
MATCH path = (start:Company)-[:GUARANTEE*1..2]->(end:Company)
WHERE start.name = '恒信集团' AND ALL(r IN relationships(path) WHERE r.amount > 10000000)
RETURN start.name AS 风险源头,
[node IN nodes(path) | node.name] AS 传导路径,
[rel IN relationships(path) | rel.amount] AS 担保金额,
length(path) AS 传导深度
输出结果解读:查询返回“恒信集团 → 盛达建设 → 天元建材”的完整路径,每段担保金额均超过 1000 万,传导深度为 2。该路径可直接用于风险敞口计算和预警触发。
4.7 子句对比与选择指南
| 操作类型 | 推荐子句 | 注意事项 |
|---|---|---|
| 新增实体 | CREATE | 避免重复创建,可配合 MERGE 使用 |
| 查询路径 | MATCH + RETURN | 使用路径变量捕获整条链路 |
| 条件过滤 | WHERE | 多跳过滤必须用 ALL/ANY 谓词 |
| 删除元素 | DELETE / DETACH DELETE | 优先使用 DETACH DELETE 避免孤立关系 |
4.8 本章小结
- CREATE 是图谱构建入口,节点和关系必须携带业务属性。
- MATCH + RETURN 是风险传导链路查询的标准组合,路径变量
path可捕获多跳传导过程。 - WHERE 支持复杂过滤,多跳场景下使用
ALL()确保每条关系都满足条件。 - DELETE 配合
DETACH安全移除节点,金融场景建议软删除保留历史。 - 五个子句可灵活组合,覆盖金融图谱从构建到风险传导分析的全生命周期。