4. Cypher查询语言基础:CREATE、MATCH、RETURN、WHERE、DELETE操作

好,咱们进入图数据库的核心操作环节。Cypher,说白了就是图数据库的SQL。你如果写过SQL,上手会很快。但图数据库的思维方式和关系型数据库不太一样——我们不再关注表连接,而是关注节点和关系。

我个人习惯把Cypher看作「画图的语言」。你想想看,CREATE就是在图上画点画线,MATCH就是沿着线找点,DELETE就是擦掉。嗯,这样理解起来就直观多了。

4.1 CREATE:创建节点和关系

先看怎么创建节点。语法很简单:

// 创建一个用户节点
CREATE (u:User {name: '张三', age: 28, city: '北京'})

// 创建一个设备节点
CREATE (d:Device {device_id: 'DEV001', type: '手机', os: 'Android'})

// 创建关系:用户使用了设备
CREATE (u:User {name: '张三'})-[r:USED_DEVICE {timestamp: '2024-01-15'}]->(d:Device {device_id: 'DEV001'})

我在项目中遇到过一个问题:新手容易把节点属性写错格式。比如age写成字符串'28'而不是整数28。这在后续做数值计算时会出问题。记住,Cypher是类型敏感的。

小技巧:创建节点时,建议先创建节点再创建关系,分两步走。这样如果关系创建失败,节点数据还在,不会丢失。

4.2 MATCH:查询节点和关系

MATCH是Cypher里最常用的操作。它的核心逻辑就是「匹配模式」。你给出一张图的样子,Cypher就去数据库里找符合这个样子的子图。

// 查找所有用户
MATCH (u:User)
RETURN u

// 查找特定用户
MATCH (u:User {name: '张三'})
RETURN u

// 查找用户及其使用的设备
MATCH (u:User)-[:USED_DEVICE]->(d:Device)
RETURN u, d

我曾经踩过一个坑:在MATCH里用了大量属性过滤,结果查询慢得像蜗牛。后来才意识到,图数据库的索引和关系型数据库不一样。你想想看,图数据库的优势是遍历关系,而不是全表扫描。所以,能用关系过滤就别用属性过滤。

注意:MATCH不加任何过滤条件会返回所有节点。如果你的图有几百万节点,这操作会直接把数据库搞崩。我见过有人在生产环境这么干过……嗯,后果很严重。

4.3 RETURN:返回查询结果

RETURN决定了你看到什么。它可以返回节点、关系、属性,甚至是计算结果。

// 返回节点属性
MATCH (u:User)
RETURN u.name, u.age, u.city

// 返回计算结果
MATCH (u:User)-[:USED_DEVICE]->(d:Device)
RETURN u.name, count(d) AS device_count

// 去重返回
MATCH (u:User)-[:USED_DEVICE]->(d:Device)
RETURN DISTINCT u.city

我个人习惯在RETURN里用AS起别名。这样返回的结果列名清晰,后续处理也方便。比如count(d) AS device_count,一看就知道是设备数量。

4.4 WHERE:条件过滤

WHERE和SQL里的WHERE很像,但Cypher的WHERE更灵活。它可以用在MATCH里,也可以用在其他操作里。

// 基本条件过滤
MATCH (u:User)
WHERE u.age > 25 AND u.city = '北京'
RETURN u

// 字符串匹配
MATCH (u:User)
WHERE u.name CONTAINS '张'
RETURN u

// 关系属性过滤
MATCH (u:User)-[r:USED_DEVICE]->(d:Device)
WHERE r.timestamp > '2024-01-01'
RETURN u, d, r

这里有个坑:WHERE里的条件顺序会影响性能。把过滤性强的条件放在前面,能减少中间结果集。比如先过滤city再过滤age,如果city='北京'能过滤掉80%的数据,那后面的age过滤就轻松多了。

核心要点:WHERE和MATCH的区别在于——MATCH负责「找什么」,WHERE负责「怎么筛」。两者配合使用,才能高效查询。

4.5 DELETE:删除节点和关系

删除操作要格外小心。Cypher里删除节点前,必须先删除它的所有关系。否则会报错。

// 删除关系
MATCH (u:User {name: '张三'})-[r:USED_DEVICE]->(d:Device)
DELETE r

// 删除节点(必须先删关系)
MATCH (u:User {name: '张三'})
DELETE u

// 级联删除(慎用!)
MATCH (u:User {name: '张三'})
DETACH DELETE u

DETACH DELETE是个危险操作。它会自动删除节点的所有关系,然后删除节点本身。我曾经在测试环境用过一次,结果不小心把关联数据全删了。嗯,从那以后我再也不敢在生产环境用DETACH DELETE了。

警告:DELETE操作不可逆!建议先做SELECT确认数据,再执行DELETE。我习惯的做法是:先用MATCH + RETURN查一遍,确认数据无误后,再把RETURN改成DELETE。

4.6 综合示例:反欺诈场景

咱们结合反欺诈场景,看一个完整的例子。假设我们要分析一个可疑的登录行为:

// 1. 创建用户和设备
CREATE (u:User {user_id: 'U001', name: '李四', risk_score: 0.3})
CREATE (d:Device {device_id: 'D001', fingerprint: 'FP_ABC123'})

// 2. 创建登录关系
MATCH (u:User {user_id: 'U001'})
MATCH (d:Device {device_id: 'D001'})
CREATE (u)-[r:LOGIN {time: datetime(), ip: '192.168.1.1', success: true}]->(d)

// 3. 查询高风险用户
MATCH (u:User)-[r:LOGIN]->(d:Device)
WHERE u.risk_score > 0.7 AND r.success = true
RETURN u.name, d.device_id, r.time

// 4. 删除测试数据
MATCH (u:User {user_id: 'U001'})-[r]->(d:Device {device_id: 'D001'})
DELETE r
MATCH (u:User {user_id: 'U001'})
DELETE u
MATCH (d:Device {device_id: 'D001'})
DELETE d

这个流程在反欺诈里很常见。先建图,再查图,最后清理数据。每一步都有它的意义。

4.7 知识体系总览

下面这张图总结了Cypher基础操作的逻辑关系:

Cypher基础操作知识体系 Cypher查询语言 CREATE MATCH RETURN WHERE DELETE 创建节点 和关系 匹配图模式 查找数据 返回查询 结果 条件过滤 筛选数据 删除节点 和关系 核心逻辑:CREATE建图 → MATCH+WHERE查图 → RETURN看结果 → DELETE清理

这五个操作构成了Cypher的基础。你掌握了它们,就能完成大部分图数据库的日常操作。记住,图数据库的威力在于关系遍历,而不是单点查询。多用关系,少用属性过滤,这是我在实战中总结出来的经验。

专注资料整理