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 传导深度
MATCH 模式匹配示例:两跳担保传导链 恒信集团 盛达建设 天元建材 担保 2000万 担保 1500万 路径变量 path 捕获整条传导链 MATCH path = (a)-[:GUARANTEE*1..2]->(b) 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 避免孤立关系
Cypher 子句执行流程 CREATE MATCH WHERE RETURN 执行顺序:CREATE → MATCH → WHERE → RETURN DELETE 可独立执行,通常放在 MATCH 之后确认目标

4.8 本章小结

  • CREATE 是图谱构建入口,节点和关系必须携带业务属性。
  • MATCH + RETURN 是风险传导链路查询的标准组合,路径变量 path 可捕获多跳传导过程。
  • WHERE 支持复杂过滤,多跳场景下使用 ALL() 确保每条关系都满足条件。
  • DELETE 配合 DETACH 安全移除节点,金融场景建议软删除保留历史。
  • 五个子句可灵活组合,覆盖金融图谱从构建到风险传导分析的全生命周期。