Neo4j常用Cypher 查询语句详解

2025博客之星年度评选已开启 10w+人浏览 2.8k人参与

说明

在图数据库领域,Neo4j 凭借其高性能和易用性占据着重要地位,而 Cypher 作为 Neo4j 的查询语言,以其简洁直观的语法,让开发者能够轻松地对图数据进行各种操作。本文将详细介绍 Cypher 常用的查询语句,帮助读者快速掌握图数据的读写技巧。

一、Cypher 语言简介

Cypher 是一种声明式的图查询语言,专门为图数据库设计。它通过模式匹配的方式来描述图数据中的节点、关系以及它们的属性,使得查询意图更加清晰易懂。与传统的关系型数据库查询语言 SQL 相比,Cypher 在处理复杂的关联数据时具有明显优势,能够以更简洁的语句实现多表连接等复杂操作。

二、读取操作(Read)

读取操作是 Cypher 查询中最常用的功能,主要通过 MATCH 关键字实现模式匹配,从而获取图中的数据。

2.1 匹配节点

匹配节点是读取操作的基础,通过指定节点的标签和属性来筛选出符合条件的节点。

cypher

// 匹配所有标签为 Person 的节点
MATCH (p:Person)
RETURN p.name, p.age;

// 匹配标签为 Person 且年龄大于 30 的节点
MATCH (p:Person)
WHERE p.age > 30
RETURN p.name, p.age;

2.2 匹配关系

关系是图数据的核心组成部分,Cypher 可以通过 -- 表示无向关系,通过 --> 或 <-- 表示有向关系来匹配节点之间的关系。

cypher

// 匹配 Person 节点之间的 FRIENDS 关系
MATCH (p1:Person)-[r:FRIENDS]-(p2:Person)
RETURN p1.name, r.since, p2.name;

// 匹配 Person 节点到 City 节点的 BORN_IN 关系
MATCH (p:Person)-[r:BORN_IN]->(c:City)
RETURN p.name, c.city;

2.3 路径查询

路径查询用于查找两个节点之间的路径,通过指定路径的长度范围或关系类型来获取不同的路径。

cypher

// 查找 Person 节点之间长度为 1 到 3 的路径
MATCH path = (p1:Person)-[*1..3]-(p2:Person)
RETURN path;

// 查找从 John 到 Liz 的最短路径
MATCH shortestPath((p1:Person {name: "John"})-[*]-(p2:Person {name: "Liz"}))
RETURN shortestPath;

三、创建操作(Create)

创建操作用于向图数据库中添加节点和关系,主要通过 CREATE 和 MERGE 关键字实现。

3.1 创建节点

使用 CREATE 关键字可以创建一个或多个节点,并为节点添加标签和属性。

cypher

// 创建一个标签为 Person 的节点,并添加属性
CREATE (p:Person {name: "Alice", age: 25})
RETURN p;

// 同时创建多个节点
CREATE (p1:Person {name: "Bob", age: 28}), (p2:Person {name: "Charlie", age: 32});

3.2 创建关系

创建关系需要先匹配到相关的节点,然后使用 CREATE 关键字在节点之间创建关系,并为关系添加属性。

cypher

// 为已存在的 Person 节点创建 FRIENDS 关系
MATCH (p1:Person {name: "Alice"}), (p2:Person {name: "Bob"})
CREATE (p1)-[r:FRIENDS {since: 2020}]->(p2)
RETURN r;

3.3 合并操作(Merge)

MERGE 关键字用于合并节点或关系,如果节点或关系不存在,则创建它们;如果已存在,则返回已有的节点或关系。这在避免重复数据方面非常有用。

cypher

// 合并一个标签为 Person 的节点,如果不存在则创建
MERGE (p:Person {name: "David"})
ON CREATE SET p.age = 30
RETURN p;

// 合并节点之间的关系
MATCH (p1:Person {name: "David"}), (p2:Person {name: "Alice"})
MERGE (p1)-[r:FRIENDS]->(p2)
ON CREATE SET r.since = 2023
RETURN r;

四、更新操作(Update)

更新操作用于修改节点和关系的属性,主要通过 SET 关键字实现。

4.1 更新节点属性

使用 SET 关键字可以为节点添加新属性或更新现有属性的值。

cypher

// 为标签为 Person 的节点添加 email 属性
MATCH (p:Person {name: "Alice"})
SET p.email = "alice@example.com"
RETURN p;

// 更新节点的 age 属性
MATCH (p:Person {name: "Bob"})
SET p.age = 29
RETURN p;

4.2 更新关系属性

与更新节点属性类似,使用 SET 关键字可以更新关系的属性。

cypher

// 更新 FRIENDS 关系的 since 属性
MATCH (p1:Person {name: "Alice"})-[r:FRIENDS]->(p2:Person {name: "Bob"})
SET r.since = 2021
RETURN r;

五、删除操作(Delete)

删除操作用于从图数据库中删除节点和关系,主要通过 DELETE 关键字实现。

5.1 删除节点

删除节点时,需要先匹配到要删除的节点,然后使用 DELETE 关键字进行删除。如果节点存在关系,需要先删除关系,或者使用 DETACH DELETE 关键字同时删除节点和其相关的关系。

cypher

// 删除标签为 Person 且 name 为 Charlie 的节点(节点无关系时)
MATCH (p:Person {name: "Charlie"})
DELETE p;

// 删除节点及其相关的所有关系
MATCH (p:Person {name: "David"})
DETACH DELETE p;

5.2 删除关系

删除关系时,需要先匹配到要删除的关系,然后使用 DELETE 关键字进行删除。

cypher

// 删除 Alice 和 Bob 之间的 FRIENDS 关系
MATCH (p1:Person {name: "Alice"})-[r:FRIENDS]->(p2:Person {name: "Bob"})
DELETE r;

六、其他常用操作

6.1 聚合函数

Cypher 提供了多种聚合函数,如 COUNTSUMAVG 等,用于对查询结果进行统计分析。

cypher

// 统计标签为 Person 的节点数量
MATCH (p:Person)
RETURN COUNT(p);

// 计算 Person 节点的平均年龄
MATCH (p:Person)
RETURN AVG(p.age);

6.2 排序和分页

使用 ORDER BY 关键字可以对查询结果进行排序,使用 SKIP 和 LIMIT 关键字可以实现分页功能。这里LIMIT是不是和sql查询有点类似呢?

cypher

// 按年龄降序排列 Person 节点
MATCH (p:Person)
RETURN p.name, p.age
ORDER BY p.age DESC;

// 获取第 2 页的 Person 节点,每页 10 条
MATCH (p:Person)
RETURN p.name, p.age
SKIP 10
LIMIT 10;

6.3 索引和约束

索引和约束可以提高查询性能和保证数据完整性。通过 CREATE INDEX 可以创建索引,通过 CREATE CONSTRAINT 可以创建约束。

cypher

// 为 Person 节点的 name 属性创建索引
CREATE INDEX idx_person_name FOR (p:Person) ON (p.name);

// 为 Person 节点的 email 属性创建唯一约束
CREATE CONSTRAINT constraint_person_email UNIQUE FOR (p:Person) REQUIRE p.email IS UNIQUE;

七、总结

本文详细介绍了 Neo4j 中常用的 Cypher 查询语句,包括读取、创建、更新、删除等基本操作,以及聚合函数、排序分页、索引约束等高级功能。通过掌握这些查询语句,开发者可以更加高效地操作图数据库,实现各种复杂的业务需求。在实际使用中,还需要根据具体的业务场景灵活运用 Cypher 语言,不断优化查询性能,以充分发挥图数据库的优势。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

angelasp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值