Neo4j Cypher查询语言深度指南

作为图数据库的核心查询语言,Cypher以其直观的图形模式匹配语法而闻名。本文将系统讲解Cypher的基础语法和高级特性,帮助您高效操作图数据。

一、基本语法

1. CREATE - 创建数据

// 创建节点(带标签和属性)
CREATE (:Person {name: 'Alice', age: 30})

// 创建关系
MATCH (a:Person), (b:Person)
WHERE a.name = 'Alice' AND b.name = 'Bob'
CREATE (a)-[:FRIENDS_WITH {since: '2020'}]->(b)

实践建议:批量创建时使用UNWIND减少事务次数:

UNWIND $people AS person
CREATE (:Person {name: person.name, age: person.age})

2. MATCH - 模式匹配

// 基本匹配
MATCH (p:Person) RETURN p

// 多跳关系查询
MATCH (a:Person)-[:FRIENDS_WITH*2..3]->(b:Person)
RETURN a, b

3. WHERE - 条件过滤

MATCH (p:Person)
WHERE p.age > 25 AND p.name STARTS WITH 'A'
RETURN p

性能提示:优先在MATCH中使用标签缩小搜索范围

4. RETURN - 结果返回

// 返回特定属性
MATCH (p:Person) RETURN p.name, p.age

// 结果别名
MATCH (p:Person) RETURN p.name AS userName

5. DELETE/DETACH DELETE

// 删除节点(需先删除关系)
MATCH (p:Person {name: 'Alice'}) 
DETACH DELETE p

// 仅删除关系
MATCH (:Person {name: 'Alice'})-[r:FRIENDS_WITH]->()
DELETE r

6. SET/REMOVE - 更新属性

// 设置/更新属性
MATCH (p:Person {name: 'Alice'})
SET p.age = 31, p.city = 'Shanghai'

// 移除属性
REMOVE p.city

二、高级查询

1. 聚合函数

MATCH (p:Person)
RETURN avg(p.age) AS avgAge, count(*) AS totalPeople

2. 排序与分页

MATCH (p:Person)
RETURN p
ORDER BY p.age DESC
SKIP 10 LIMIT 5

3. 索引与约束

// 创建索引
CREATE INDEX FOR (p:Person) ON (p.name)

// 唯一性约束
CREATE CONSTRAINT FOR (p:Person) REQUIRE p.email IS UNIQUE

最佳实践:为高频查询条件创建索引

4. 模式匹配技巧

// 可选匹配(类似SQL左连接)
MATCH (p:Person)
OPTIONAL MATCH (p)-[:WORKS_AT]->(c:Company)
RETURN p, c

三、图遍历

1. 可变长度路径

图1

// 查询2-3度好友
MATCH (a:Person {name: 'Alice'})-[:FRIENDS_WITH*2..3]->(fof)
RETURN fof

2. 最短路径

MATCH path = shortestPath((a:Person)-[*]-(b:Person))
WHERE a.name = 'Alice' AND b.name = 'David'
RETURN path

3. 所有最短路径

MATCH path = allShortestPaths((a:Person)-[*]-(b:Person))
WHERE a.name = 'Alice' AND b.name = 'David'
RETURN path

四、性能优化建议

  1. EXPLAIN/PROFILE:分析查询执行计划

    PROFILE MATCH (p:Person)-[:FRIENDS_WITH]->() RETURN p
  2. 参数化查询:避免重复解析

    MATCH (p:Person {name: $name}) RETURN p
  3. 限制路径深度:避免过度遍历

    MATCH path = (a)-[:REL*..5]->(b)
  4. 使用APOC扩展:复杂操作用存储过程

    CALL apoc.periodic.iterate(
      "MATCH (p:Person) RETURN p",
      "SET p.lastUpdated = timestamp()",
      {batchSize:1000}
    )

五、实战案例:社交网络分析

// 查找影响力人物(被关注最多)
MATCH (p:Person)<-[f:FOLLOWS]-()
RETURN p.name, count(f) AS followers
ORDER BY followers DESC
LIMIT 10

// 共同好友推荐
MATCH (a:Person)-[:FRIENDS_WITH]->(mutual)-[:FRIENDS_WITH]->(b:Person)
WHERE a <> b AND NOT (a)-[:FRIENDS_WITH]->(b)
RETURN a.name, b.name, count(mutual) AS commonFriends
ORDER BY commonFriends DESC

掌握Cypher是发挥Neo4j威力的关键。建议从简单查询开始,逐步尝试复杂图模式,结合EXPLAIN不断优化。对于生产环境,务必添加适当的索引和约束。

添加新评论