Cypher语法

news/2025/11/18 22:17:44/文章来源:https://www.cnblogs.com/huangdh/p/19239523
目标:掌握 Cypher 的基本语法规则,能独立完成 “创建 - 查询 - 更新 - 删除”(CRUD)操作,理解图数据的表达逻辑。

1. 先搞懂 3 个核心语法符号(基础中的基础)

Cypher 语法高度可视化,记住这 3 个符号就能描述任何图结构:
 
符号 含义 示例
() 节点(可加标签 / 属性) (u:User)(标签:User)、(p:Product {name:"手机"})(带属性)
-[:类型]-> 有向关系(可加属性) -[:FRIENDS_WITH]->(类型:FRIENDS_WITH)、-[:PURCHASED {time:"2025-11-18"}]->(带属性)
[] 关系变量(用于引用) -[r:PURCHASED]->(用 r 指代该关系,后续可查询 / 更新 r 的属性)

 

步骤 1:创建节点(用户、商品)

// 创建3个用户节点(标签:User,带id/name/age属性)
CREATE (u1:User {id:1, name:"张三", age:28, city:"北京"}),(u2:User {id:2, name:"李四", age:30, city:"上海"}),(u3:User {id:3, name:"王五", age:25, city:"广州"});// 创建2个商品节点(标签:Product,带id/name/price/category属性)
CREATE (p1:Product {id:101, name:"iPhone 15", price:7999, category:"手机"}),(p2:Product {id:102, name:"华为Mate 60", price:6999, category:"手机"}),(p3:Product {id:103, name:"AirPods Pro", price:1999, category:"配件"});
Cypher CREATE 语法中,u1u2u3 是 节点变量(Node Variables),它们的核心区别和作用如下:

一、本质区别:指向不同的节点实例

u1u2u3 是三个独立的变量名,分别对应你创建的 3 个 User 节点:
 
  • u1 → 指向 {id:1, name:"张三", ...} 的 User 节点
  • u2 → 指向 {id:2, name:"李四", ...} 的 User 节点
  • u3 → 指向 {id:3, name:"王五", ...} 的 User 节点
 
变量名本身可以任意定义(比如改成 zhangsanlisiwangwu),但必须唯一(同一语句中不能重复用同一个变量指向不同节点)。

二、核心作用:临时引用节点,方便后续操作

变量的核心价值是「在当前 Cypher 语句中临时引用节点」,避免重复写匹配条件。具体有两个常见场景:

1. 同一 CREATE 语句中创建关联关系(简化语法)

如果创建节点的同时要创建节点间的关系,变量可以直接关联,无需额外 MATCH
// 创建3个用户节点(u1/u2/u3),同时创建张三和李四的好友关系
CREATE (u1:User {id:1, name:"张三"}),(u2:User {id:2, name:"李四"}),(u3:User {id:3, name:"王五"}),(u1)-[:FRIENDS_WITH]->(u2); // 直接用u1/u2引用节点,创建关系
如果没有变量,你需要先 CREATE 节点,再 MATCH 节点才能创建关系,步骤更繁琐。
 

2. 后续语句中匹配 / 操作指定节点

如果后续要对某个节点单独操作(比如修改属性、创建关系、删除),可以通过变量快速定位(仅限同一语句上下文):
// 创建节点后,立即给u1(张三)添加一个新属性
CREATE (u1:User {id:1, name:"张三"}),(u2:User {id:2, name:"李四"}),(u3:User {id:3, name:"王五"})
SET u1.email = "zhangsan@xxx.com"; // 用u1直接定位张三,添加属性
 

三、关键注意点

  1. 变量仅在当前语句有效u1u2u3 只在你写的这个 CREATE 语句中起作用,语句执行结束后,变量会失效。如果之后要操作这些节点,需要通过 MATCH (u:User {id:1}) 重新匹配(不能直接用 u1)。
  2. 变量名不影响节点本身:节点的本质是「标签(User)+ 属性(id/name/age 等)」,变量名只是临时引用,哪怕把 u1 改成 x,节点的内容(属性、标签)完全不变。
  3. 变量可省略(但不推荐):如果创建节点后不需要立即操作,也可以省略变量:
     
    // 省略变量,仅创建节点(无法直接关联关系)
    CREATE (:User {id:1, name:"张三"}),(:User {id:2, name:"李四"}),(:User {id:3, name:"王五"});
    但这种写法后续无法在同一语句中创建关系,灵活性差,所以一般都会定义变量

 

步骤 2:创建关系(好友、购买)

// 1. 创建好友关系(张三↔李四,张三→王五)
MATCH (u1:User {id:1}), (u2:User {id:2})
CREATE (u1)-[:FRIENDS_WITH {since:2020, status:"close"}]->(u2),(u2)-[:FRIENDS_WITH {since:2020, status:"close"}]->(u1);  // 双向关系需单独创建MATCH (u1:User {id:1}), (u3:User {id:3})
CREATE (u1)-[:FRIENDS_WITH {since:2022, status:"ordinary"}]->(u3);// 2. 创建购买关系(张三买了iPhone 15,李四买了华为Mate 60和AirPods)
MATCH (u1:User {id:1}), (p1:Product {id:101})
CREATE (u1)-[:PURCHASED {time:"2025-01-10", amount:1}]->(p1);MATCH (u2:User {id:2}), (p2:Product {id:102}), (p3:Product {id:103})
CREATE (u2)-[:PURCHASED {time:"2025-03-15", amount:1}]->(p2),(u2)-[:PURCHASED {time:"2025-03-15", amount:1}]->(p3);

 

步骤 3:查询练习(从简单到复杂)

// 1. 基础查询:查询所有用户的姓名和年龄
MATCH (u:User) RETURN u.name AS 用户名, u.age AS 年龄;// 2. 条件查询:查询年龄>25的用户
MATCH (u:User) WHERE u.age > 25 RETURN u.name, u.age;// 3. 关系查询:查询“购买了手机的用户”
MATCH (u:User)-[r:PURCHASED]->(p:Product {category:"手机"})
RETURN u.name AS 用户名, r.time AS 购买时间, p.name AS 商品名;// 4. 关联查询:查询“张三的朋友购买了什么商品”(1度关联)
MATCH (z:User {name:"张三"})-[:FRIENDS_WITH]->(f:User)-[r:PURCHASED]->(p:Product)
RETURN z.name AS 本人, f.name AS 朋友, p.name AS 朋友购买的商品;// 5. 多深度查询:查询“张三的1-2度朋友”(直接朋友+朋友的朋友)
MATCH (z:User {name:"张三"})-[:FRIENDS_WITH*1..2]->(f:User)
RETURN z.name, f.name, length(relationships(p)) AS 关系深度;  // length()计算路径长度// 6. 聚合查询:统计每个商品的购买次数
MATCH (u:User)-[r:PURCHASED]->(p:Product)
RETURN p.name AS 商品名, sum(r.amount) AS 总销量
ORDER BY 总销量 DESC;

步骤 4:更新与删除练习

 

// 1. 更新:给张三增加“职业”属性,修改年龄为29
MATCH (u:User {name:"张三"})
SET u.job = "工程师", u.age = 29
RETURN u;// 2. 更新关系:修改李四购买华为Mate 60的数量为2
MATCH (u:User {name:"李四"})-[r:PURCHASED]->(p:Product {name:"华为Mate 60"})
SET r.amount = 2
RETURN r;// 3. 删除:删除王五的所有关系和王五节点
MATCH (u:User {name:"王五"})-[r]->()  // 匹配王五的所有关系
DELETE r, u;  // 先删关系,再删节点// 4. 删除属性:删除张三的“city”属性
MATCH (u:User {name:"张三"})
REMOVE u.city
RETURN u;

 

二、进阶阶段:掌握高频场景语法

入门后,重点攻克 Cypher 的 “高级特性”,覆盖实际开发中的高频场景:

1. 索引与约束(性能优化核心)

当数据量较大(万级 +)时,必须通过索引加速查询,约束保证数据一致性:
// 1. 创建索引:对User的name属性创建索引(高频查询字段)
CREATE INDEX idx_user_name ON :User(name);// 2. 创建唯一约束:保证User的id属性不重复(类似主键)
CREATE CONSTRAINT unique_user_id ON :User(id) ASSERT id IS UNIQUE;// 3. 查看索引/约束
SHOW INDEXES;
SHOW CONSTRAINTS;// 4. 删除索引/约束
DROP INDEX idx_user_name;
DROP CONSTRAINT unique_user_id;

2. 路径操作与函数

Cypher 内置大量函数,简化路径分析、属性处理等操作:
// 1. 路径函数:获取路径中的所有节点/关系
MATCH p = (u:User)-[:PURCHASED]->(p:Product)
RETURN nodes(p) AS 路径节点, relationships(p) AS 路径关系;// 2. 最短路径查询(内置算法)
MATCH shortestPath(p = (u1:User {name:"张三"})-[*]->(u2:User {name:"李四"}))
RETURN p, length(p) AS 最短路径长度;// 3. 字符串函数:模糊查询(类似SQL的LIKE)
MATCH (p:Product) WHERE p.name CONTAINS "手机"  // 包含“手机”
RETURN p.name;// 4. 聚合函数:统计、分组
MATCH (u:User)-[r:PURCHASED]->(p:Product)
GROUP BY p.category  // 按商品分类分组
RETURN p.category AS 分类, count(u) AS 购买人数, sum(r.amount) AS 总销量;

3. 批量操作(高效处理大量数据)

实际项目中常需批量导入 / 更新数据,避免逐条执行:
// 1. 批量创建:通过UNWIND遍历列表批量创建节点
WITH ["赵六", "孙七", "周八"] AS names  // 定义姓名列表
UNWIND names AS name  // 遍历列表,每个name对应一条记录
CREATE (u:User {name: name, age: 26, city: "深圳"});// 2. 批量更新:给所有手机类商品降价1000
MATCH (p:Product {category:"手机"})
SET p.price = p.price - 1000
RETURN p.name, p.price;

4. 条件分支(CASE 语句)

类似 SQL 的 CASE,支持复杂逻辑判断:
// 根据商品价格分类
MATCH (p:Product)
RETURN p.name AS 商品名,CASEWHEN p.price > 5000 THEN "高端产品"WHEN p.price > 2000 THEN "中端产品"ELSE "低端产品"END AS 价格等级;

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/969400.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025江浙沪方向专线物流、(冷库)往返运输、智能仓储优选服务商推荐:深耕江苏苏州、高邮、镇江,覆盖全国及国际线路,供应链定制方案/当日往返物流/智能共享仓储/分拨中心

随着区域经济一体化加速,高效精准的物流服务成为商贸企业降本增效的关键。在2025年物流市场中,山东大金物流有限公司(以下简称“大金物流”)凭借近二十年的线路深耕与标准化服务体系,成为江浙沪及多区域专线物流的…

【Wireshark数据分析实战】 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【贪心】P9525 [JOIST 2022] 团队竞技 / Team Contest 题解

Problem \(\text{Description}\) 给定 \(n\) 个含有三元组 \((x_i ,y_i ,z_i)\),需要从中选出三个不同的对编号 \(i\),\(j\),\(k\),使得 \(x_i +y_j +z_k\) 最大,并且 \(x_i > \max\{x_j ,x_k\} ,y_j > \ma…

noip9

11.1611.16 感觉大家这场挂分比较严重啊,我都到rk4了。 顺带一提,这场是原场,洛谷上都有原题(但数据太水了,不如原数据) t1 模拟题。 赛时没算时间复杂度,用了个set以为对了,赛后才发现若卡满还不如暴力跳(多…

常见的steam游戏的营销错误

https://howtomarketagame.com/wp-content/uploads/2023/05/Zukowski_60MistakesEbookV1.pdf 翻译版下载 https://files-cdn.cnblogs.com/files/sanyejun/%E5%B8%B8%E8%A7%81%E7%9A%84steam%E8%90%A5%E9%94%80%E9%94%9…

MX Round 26 解题报告

T1 场上 没有头绪,打了挂大分的 \(O(n^2)\) 暴力。 T2 场上 没有头绪,打了挂打分的 \(O(n^2\log n)\) 暴力。 T3 切了。 一个观察:操作二只会往前走。 状态定义为“到每一个位置的期望花费”,我只想得到 \(O(n^3)\…

linux c 编译命令

在 Linux 系统中,C 语言的编译通常使用 gcc(GNU C Compiler)来进行编译。下面是一些常见的 C 语言编译命令和相关说明:1. 编译单个源文件 gcc -o output_file source_file.c-o output_file:指定输出文件名(例如 …

N8N工作流中文转换神器!一键转中文

无论是 N8N 官方的工作流模板,还是社区开源的工作流都是英文的,这对国内用户来说是非常不友好的。 因此,我花了一些时间开发了一个「N8N 工作流中文转换器」,一键将英文工作流转换为中文,先看效果吧。 这是原版工…

今天学习黑马的Java基础

今天学习黑马的Java基础,进行补充生成一个随机数Random r = new Random(); int number = r.nextInt(10);//生成[0,10)之间的一个随机整数,左开右闭Math.random()//会随机生成[0,1)的小数生成验证码实验import java.u…

linux c 线程编程

在 Linux 系统中进行 C 线程编程,通常使用 POSIX 线程(pthread),这是 Linux 系统中标准的线程库。下面我将为你提供一些常见的 C 线程编程示例和解释,帮助你理解如何在 Linux 环境下进行线程编程。? 一、C 线程编…

容器网络虚拟化

参考资料:深入理解Linux网络 相关实际问题 1、容器中的eth0和母机上的eth0是一个东西吗? 2、veth设备是什么,它是如何工作的? 3、Linux是如何实现虚拟网络环境的? 4、Linux如何保证同宿主机上多个虚拟网络环境中的…

整体二分学习笔记

整体二分学习笔记 整体二分,就是对所有的操作进行一个整体的二分答案,需要数据结构题满足以下性质:询问的答案具有可二分性。 修改对判定答案的贡献相对独立,修改之间互不影响效果。 修改如果对判定答案有贡献,则…

CF1721F Matching Reduction

CF1721F Matching Reduction 题目 给定一个二分图,第一部分有 \(n_1\) 个顶点,第二部分有 \(n_2\) 个顶点,共有 \(m\) 条边。该图的最大匹配是指选取尽可能多的边,使得没有任何一个顶点被多于一条选中的边连接。 你…

树上求值 tree

考场上想不出t2,于是把t3写了,感觉比较板。 思路: 暴力很显然,直接枚举每个点,暴力计算,复杂度\(O(Tn^2log_n)\) 。 看到贡献与 \(\operatorname{lca}\) 相关,想到在 \(\operatorname{lca}\) 处统计贡献。 显然…

DL 2 自动微分模块

自动微分模块 1. 自动微分模块=对损失函数求导,结合反向传播,更新权重参数w,bpytorch不支持向量张量对向量张量的求导,只支持标量张量对向量张量的求导 import torch# 定义参数,requires_grad默认为false w = torc…

NSSCTF刷题日记

2025.11.18 刚开始使用这个网站,感觉像。。。付费制洛谷?(会员制) 先白嫖做几道看看吧。 [SWPUCTF 2021 新生赛]简简单单的逻辑 好水的题,题目给出了一个 python 文件,打开就能看到源代码。点击查看代码 flag = …

《计算机网络》学习心得

一、学习背景与学习目标 《计算机网络》是我们计算机专业人才培养体系中不可或缺的核心基础课,它如同搭建专业知识大厦的“地基”,贯穿于软件开发、系统运维、网络安全、云计算等多个核心职业方向。无论是未来从事后…

2025防晒品牌TOP8精准推荐:按肤质与场景科学选择

2025防晒品牌TOP8精准推荐:按肤质与场景科学选择一、2025 年中国防晒产品品牌推荐榜(附榜单) 选购防晒霜的核心逻辑是肤质匹配 + 场景适配,没有万能产品。以下基于 2025 年天猫 618 防晒霜热卖榜、亚洲皮肤健康联盟…

黑马程序员SpringCloud微服务开发与实战- Docker基础-02

黑马程序员SpringCloud微服务开发与实战- Docker基础-02Posted on 2025-11-18 21:49 心默默言 阅读(0) 评论(0) 收藏 举报1. 常见命令