neo4j--Cypher语法练习(where、return)

1.3 WHERE

WHERE在MATCH或者OPTINAL MATCH语句中添加约束,或者与WITH一起使用来过滤结果。

1.3.1 基本使用

(1)布尔运算

             返回发行日期介于1990~2000年的电影名称。

               MATCH (nineties:Movie)

               WHERE nineties.released > 1990 AND nineties.released < 2000

               RETURN nineties.title

             

(2)节点标签的过滤

         可以在WHERE中类似使用WHERE n:foo写入标签断言来过滤节点。

            将返回’Movie节点。

MATCH (n)

WHERE n:Movie

RETURN n

(3)节点属性的过滤

      返回released > 1990的"Movie"节点。

MATCH (n)

WHERE n.released > 1990

RETURN n

(4)关系属性的过滤

        返回参演过1990年后发布的电影的演员。

MATCH (n)-[:ACTED_IN]->(m)

WHERE m.released > 1990

RETURN n

     (5)属性存在性检查

      返回拥有title属性的节点 

MATCH (n)

WHERE exists(n.title)

RETURN n

1.3.2 字符串匹配

(1)匹配字符串的开始

       STARTS WITH用于以大小写敏感的方式匹配字符串的开始。

      返回名字以"Tom"开始的节点。

<

MATCH (n)

WHERE n.name STARTS WITH 'Tom'

RETURN n

<think>我们正在讨论Neo4jCypher查询语言。用户要求了解基本语法和常用命令。根据引用[1][2][3],Cypher是一种声明式查询语言,专为图数据库设计,具有直观的图形模式匹配能力。以下我将系统性地介绍Cypher的核心语法和常用命令,并辅以示例说明。 ### 一、Cypher基本结构 Cypher语法设计围绕图数据的三个核心元素:**节点**、**关系**和**属性**。其查询结构通常包含以下部分: 1. **MATCH**:定义要匹配的图模式(相当于SQL的FROM) 2. **WHERE**:添加过滤条件(相当于SQL的WHERE) 3. **RETURN**:指定返回结果(相当于SQL的SELECT) 例如,查找名为"Alice"的用户的所有朋友: ```cypher MATCH (a:User)-[:FRIEND]->(b:User) WHERE a.name = 'Alice' RETURN b.name ``` 这里: - `(a:User)` 表示标签为User的节点,别名为a - `-[:FRIEND]->` 表示类型为FRIEND的关系 - `b.name` 返回朋友节点的名字属性[^1] ### 二、节点与关系语法 #### 1. 节点表示 - **基础格式**:`(变量:标签 {属性键:属性值})` - 变量:可选,用于后续引用(如`n`) - 标签:可选,类别的分类(如`User`) - 属性:可选,键值对(如`{name: "Alice"}`) ```cypher (:Person) // 匿名Person节点 (p:Employee) // 别名为p的Employee节点 (:Book {title:"Neo4j Guide"}) // 带属性的匿名节点 ``` #### 2. 关系表示 - **基础格式**:`[变量:类型 {属性键:属性值}]` - 方向:`-->` 或 `<--` ```cypher // 无属性关系 (a)-[:KNOWS]->(b) // 带属性和变量 (a)-[r:FOLLOWS {since:2020}]->(b) ``` ### 三、常用命令详解 #### 1. 数据查询(MATCH) - **基本匹配**:查找所有电影及其导演 ```cypher MATCH (d:Director)-[:DIRECTED]->(m:Movie) RETURN d.name, m.title ``` - **多跳关系**:查找朋友的朋友(2跳) ```cypher MATCH (a:User)-[:FRIEND*2]->(c:User) WHERE a.id = 123 RETURN c.name ``` #### 2. 数据过滤(WHERE- **属性过滤**:年龄大于30的用户 ```cypher MATCH (u:User) WHERE u.age > 30 RETURN u ``` - **正则匹配**:名字以"A"开头的用户 ```cypher MATCH (u:User) WHERE u.name =~ 'A.*' RETURN u ``` #### 3. 数据创建(CREATE) - **创建节点**:添加新用户 ```cypher CREATE (u:User {name: "Bob", age: 25}) ``` - **创建关系**:建立好友关系 ```cypher MATCH (a:User), (b:User) WHERE a.name = "Alice" AND b.name = "Bob" CREATE (a)-[:FRIEND]->(b) ``` #### 4. 数据更新(SET) - **修改属性**:更新用户年龄 ```cypher MATCH (u:User {name: "Alice"}) SET u.age = 31 ``` - **添加标签**:为用户添加VIP标签 ```cypher MATCH (u:User {name: "Bob"}) SET u:VIP ``` #### 5. 数据删除(DELETE) - **删除节点**:需先删除关联关系 ```cypher MATCH (u:User {name: "Bob"})-[r]-() DELETE r, u ``` - **删除属性**:移除用户年龄 ```cypher MATCH (u:User {name: "Alice"}) REMOVE u.age ``` ### 四、高级功能 #### 1. 聚合函数 类似SQL的GROUP BY,常用函数包括`COUNT()`, `SUM()`, `AVG()` ```cypher MATCH (u:User)-[:BOUGHT]->(p:Product) RETURN u.name, COUNT(p) AS purchase_count ``` #### 2. 路径查询 查找最短路径(内置函数`shortestPath`) ```cypher MATCH path = shortestPath((a:User)-[:FRIEND*..5]-(b:User)) WHERE a.id = 1 AND b.id = 100 RETURN path ``` #### 3. 索引优化 为属性创建索引加速查询(需在大型数据集上使用) ```cypher CREATE INDEX FOR (u:User) ON (u.email) ``` ### 五、最佳实践建议 1. **避免全图扫描**:始终通过标签或索引限定查询范围 2. **控制关系深度**:使用`*n..m`限制跳数(如`[:KNOWS*1..3]`) 3. **参数化查询**:防止Cypher注入(类似SQL预处理) ```cypher MATCH (u:User) WHERE u.name = $name RETURN u ``` > 注:Cypher语法仍在演进,建议参考官方文档获取最新特性[^3]。 §§相关问题§§ 1. 如何在Cypher中实现复杂条件查询(如多标签过滤)? 2. Cypher查询性能调优有哪些具体技巧? 3. 如何将Cypher查询结果导出为CSV或JSON格式? 4. Cypher与其他图查询语言(如Gremlin)有何区别? 5. Neo4j的APOC扩展库提供了哪些增强的Cypher功能?</think>### Neo4j Cypher 查询语言详解 CypherNeo4j 的专用查询语言,采用声明式语法设计,专注于高效表达图数据模式匹配。其语法融合了 SQL 的可读性和图遍历的简洁性,核心结构围绕**节点**、**关系**和**属性**展开。以下是核心语法和常用命令详解: --- #### 一、基础语法结构 1. **节点表示** - 格式:`(变量:标签 {属性键: 属性值})` - 示例: ```cypher (:Person) // 匿名Person节点 (p:Employee) // 别名为p的Employee节点 (:User {name: "Alice"}) // 带属性的匿名节点 ``` 2. **关系表示** - 格式:`[变量:关系类型 {属性键: 属性值}]` - 方向:`-->`(出边)或 `<--`(入边) - 示例: ```cypher (a)-[:FRIEND]->(b) // 无属性关系 (a)-[r:FOLLOWS {since:2020}]->(b) // 带属性的关系 ``` --- #### 二、核心命令详解 1. **MATCH(模式匹配)** - 功能:定位图中的节点/关系 - 示例: ```cypher // 查找Alice的朋友 MATCH (a:User {name: "Alice"})-[:FRIEND]->(friend) RETURN friend.name ``` 2. **WHERE(条件过滤)** - 支持运算符:`=`, `>`, `CONTAINS`, `STARTS WITH` - 示例: ```cypher MATCH (u:User) WHERE u.age > 30 AND u.city = "Shanghai" RETURN u ``` 3. **RETURN(结果返回)** - 支持聚合函数:`COUNT()`, `COLLECT()`, `SUM()` - 示例: ```cypher MATCH (p:Product)<-[:BOUGHT]-(u) RETURN p.name, COUNT(u) AS buyers ``` 4. **CREATE(数据创建)** - 节点与关系同步创建: ```cypher CREATE (a:User {name: "Bob"})-[:WORKS_AT]->(c:Company {name: "Neo4j"}) ``` 5. **SET(属性更新)** ```cypher MATCH (u:User {id: 123}) SET u.vip = true, u.level = "Gold" ``` 6. **DELETE(数据删除)** - 需先删除关系再删节点: ```cypher MATCH (u:User)-[r]-() DELETE r, u ``` --- #### 三、高级操作 1. **路径查询** - 多跳关系:`*n..m` 指定跳数范围 ```cypher // 查找3-5度好友 MATCH (a)-[:FRIEND*3..5]->(distant_friend) ``` 2. **索引加速** - 创建索引提升查询性能: ```cypher CREATE INDEX FOR (u:User) ON (u.email) ``` 3. **UNION 结果合并** ```cypher MATCH (a:Admin) RETURN a.name UNION MATCH (u:User) RETURN u.name ``` 4. **CASE 条件分支** ```cypher RETURN CASE WHEN u.age < 18 THEN "Minor" ELSE "Adult" END AS age_group ``` --- #### 四、最佳实践 1. **避免全图扫描** - 始终通过标签限定搜索范围:`MATCH (p:Product) ...` 而非 `MATCH (p) ...` 2. **参数化查询** - 防止注入攻击: ```cypher MATCH (u:User {email: $emailParam}) ``` 3. **PROFILE 性能分析** - 优化查询计划: ```cypher PROFILE MATCH (u)-[:FRIEND*2]->(f) RETURN f ``` > 注:Cypher 语法持续演进,建议参考官方文档获取最新特性[^1][^3]。 --- ### 示例综合应用 **场景**:查找购买过某产品的用户及其好友 ```cypher MATCH (target:Product {id: "P100"})<-[:BOUGHT]-(buyer:User) WITH COLLECT(buyer) AS buyers UNWIND buyers AS b MATCH (b)-[:FRIEND]->(friend) RETURN b.name AS buyer, friend.name AS friend ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值