导航菜单

  • 1.langchain.intro
  • 2.langchain.chat_models
  • 3.langchain.prompts
  • 4.langchain.example_selectors
  • 5.output_parsers
  • 6.Runnable
  • 7.memory
  • 8.document_loaders
  • 9.text_splitters
  • 10.embeddings
  • 11.tool
  • 12.retrievers
  • 13.optimize
  • 14.项目介绍
  • 15.启动HTTP
  • 16.数据与模型
  • 17.权限管理
  • 18.知识库管理
  • 19.设置
  • 20.文档管理
  • 21.聊天
  • 22.API文档
  • 23.RAG优化
  • 24.索引时优化
  • 25.检索前优化
  • 26.检索后优化
  • 27.系统优化
  • 28.GraphRAG
  • 29.图
  • 30.为什么选择图数据库
  • 31.什么是 Neo4j
  • 32.安装和连接 Neo4j
  • 33.Neo4j核心概念
  • 34.Cypher基础
  • 35.模式匹配
  • 36.数据CRUD操作
  • 37.GraphRAG
  • 38.查询和过滤
  • 39.结果处理和聚合
  • 40.语句组合
  • 41.子查询
  • 42.模式和约束
  • 43.日期时间处理
  • 44.Cypher内置函数
  • 45.Python操作Neo4j
  • 46.neo4j
  • 47.py2neo
  • 48.Streamlit
  • 49.Pandas
  • 50.graphRAG
  • 51.deepdoc
  • 52.deepdoc
  • 53.deepdoc
  • 55.deepdoc
  • 54.deepdoc
  • Pillow
  • 1. 什么是 Cypher
    • 1.1 基础概念
    • 1.2 前置知识:什么是查询语言?
    • 1.3 Cypher 的特点
    • 1.4 为什么叫 Cypher?
  • 2. Cypher 的基本语法
    • 2.1 前置知识:什么是声明式语言?
    • 2.2 Cypher 的基本结构
    • 2.3 用自然语言理解 Cypher
  • 3. Cypher 关键字速览
    • 3.1 常用函数
  • 4. Cypher 查询示例
    • 4.1 基本查询
    • 4.2 使用 WHERE 过滤
    • 4.3 使用 RETURN 返回结果
  • 5. 小结
    • 5.1 Cypher 是什么?
    • 5.2 Cypher 的特点
    • 5.3 基本结构
    • 5.4 常用关键字

1. 什么是 Cypher #

1.1 基础概念 #

Cypher® 是 Neo4j 图数据库的查询语言,就像 SQL 是关系型数据库的查询语言一样。Cypher 专门为图数据库设计,让你能够用接近自然语言的方式来查询和操作图数据。

1.2 前置知识:什么是查询语言? #

查询语言是一种用来与数据库"对话"的语言。就像人类用语言交流一样,你需要用查询语言告诉数据库你想要什么数据。

常见的查询语言:

  • SQL:用于关系型数据库(MySQL、PostgreSQL等)
  • Cypher:用于图数据库(Neo4j)
  • MongoDB Query Language:用于文档数据库(MongoDB)

1.3 Cypher 的特点 #

  1. 直观易读:语法接近自然语言,读起来就像在描述图的结构
  2. ASCII 艺术风格:使用括号、箭头等符号直观表示图结构
  3. 声明式语言:你只需要描述"想要什么",不需要说明"如何获取"
  4. 模式匹配:强大的模式识别和匹配能力

1.4 为什么叫 Cypher? #

Cypher 这个名字来源于"密码"(Cipher),但这里不是指加密,而是指"用符号表示"的意思。Cypher 用符号(括号、箭头)来表示图的结构,就像用密码符号表示信息一样。

2. Cypher 的基本语法 #

2.1 前置知识:什么是声明式语言? #

声明式语言(Declarative Language)是一种编程范式,你只需要描述"想要什么结果",而不需要说明"如何得到这个结果"。

对比:

  • 命令式语言(如 Python):你需要一步步告诉计算机怎么做
  • 声明式语言(如 Cypher):你只需要描述结果,数据库自己决定怎么做

示例对比:

# 定义一个函数,查找某个人的朋友
def find_friends(person):
    # 新建一个空列表用于存储朋友
    friends = []
    # 遍历此人的所有关系
    for relationship in person.relationships:
        # 判断关系类型是否为"IS_FRIENDS_WITH"(朋友关系)
        if relationship.type == "IS_FRIENDS_WITH":
            # 如果是朋友关系,把关系的目标节点加入朋友列表
            friends.append(relationship.end_node)
    # 返回所有找到的朋友列表
    return friends
# 匹配所有标签为 Person 的节点,变量名为 p
MATCH (p:Person)-[:IS_FRIENDS_WITH]->(friend)
# 查找通过 IS_FRIENDS_WITH 关系连接的 friend 节点
RETURN friend

2.2 Cypher 的基本结构 #

Cypher 查询通常由以下几个部分组成:

  1. MATCH:匹配图中的模式(查找数据)
  2. WHERE:过滤条件(可选)
  3. RETURN:返回结果

基本格式:

MATCH (模式)
WHERE (条件)
RETURN (结果)

2.3 用自然语言理解 Cypher #

Cypher 的语法设计让你可以用接近自然语言的方式描述图:

自然语言:

  • "Sally 喜欢图数据库"
  • "Sally 与 John 是朋友"
  • "Sally 为 Neo4j 公司工作"

Cypher 表示:

(Sally)-[:LIKES]->(Graphs)
(Sally)-[:IS_FRIENDS_WITH]->(John)
(Sally)-[:WORKS_FOR]->(Neo4j)

是不是很像?这就是 Cypher 的优势——直观易懂!

3. Cypher 关键字速览 #

Cypher 提供了丰富的关键字来操作图数据。以下是常用的关键字:

关键字 作用 示例 说明
MATCH 匹配图中的节点和关系,用于查询 MATCH (p:Person {name: "张三"}) RETURN p 查找名字是张三的节点
MERGE 如果找不到则创建节点/关系,否则返回已存在的 MERGE (n:City {name: "北京"}) RETURN n 没有北京就创建,有则返回
CREATE 创建新的节点和关系 CREATE (p:Person {name: "张三"}) 创建新节点
WHERE 增加过滤条件 MATCH (p:Person) WHERE p.age > 18 RETURN p 查询大于18岁的所有人
NOT 逻辑非,用于反向筛选 MATCH (p:Person) WHERE NOT p.city = "上海" RETURN p 查询不是上海的所有人
RETURN 指定查询结果的输出项 MATCH (p:Person) RETURN p.name, p.age 只返回名字和年龄
DISTINCT 去重,只显示不同的结果 MATCH (p:Person) RETURN DISTINCT p.city 返回去重后的城市列表
AS 给输出结果起别名,方便阅读和使用 MATCH (p:Person) RETURN p.name AS 姓名, p.age AS 年龄 给属性重命名
SET 更新节点或关系的属性 MATCH (p:Person) SET p.age = 30 更新年龄属性
DELETE 删除节点或关系 MATCH (p:Person) DELETE p 删除节点
DETACH DELETE 删除节点及其所有关系 MATCH (p:Person) DETACH DELETE p 删除节点和关系
REMOVE 删除属性或标签 MATCH (p:Person) REMOVE p.email 删除属性
ORDER BY 排序结果 MATCH (p:Person) RETURN p ORDER BY p.age 按年龄排序
LIMIT 限制返回结果数量 MATCH (p:Person) RETURN p LIMIT 10 只返回前10条
SKIP 跳过前面的结果 MATCH (p:Person) RETURN p SKIP 10 LIMIT 10 跳过前10条,返回接下来的10条

3.1 常用函数 #

函数 作用 示例 说明
type() 获取关系的类型 MATCH ()-[r]->() RETURN type(r) 返回关系类型(如 "LIKES")
labels() 获取节点的所有标签(列表) MATCH (n) RETURN n.name, labels(n) 返回节点的所有标签
length() 计算路径的长度(边的数量) MATCH p=(a)-[*]->(b) RETURN length(p) 返回路径包含的关系数(跳数)
nodes() 获取路径上的所有节点列表 MATCH p=(a)-[*]->(b) RETURN nodes(p) 返回路径上所有节点(按顺序排列)
shortestPath() 查找两个节点之间的最短路径 MATCH p=shortestPath((a)-[*]-(b)) RETURN p 返回最短路径

4. Cypher 查询示例 #

4.1 基本查询 #

// 清空数据库
MATCH (n) DETACH DELETE n

// 创建测试数据
CREATE (p1:Person {name: 'Sally', age: 30}),
       (p2:Person {name: 'John', age: 25}),
       (c1:Company {name: 'Neo4j'}),
       (p1)-[:WORKS_FOR]->(c1),
       (p1)-[:IS_FRIENDS_WITH]->(p2)

// 查询所有 Person 节点
MATCH (p:Person)
RETURN p.name, p.age

// 查询名字为 Sally 的 Person 节点
MATCH (p:Person {name: 'Sally'})
RETURN p

// 查询 Sally 的工作关系
MATCH (p:Person {name: 'Sally'})-[r:WORKS_FOR]->(c:Company)
RETURN p.name, c.name, type(r)

// 查询 Sally 的朋友
MATCH (p:Person {name: 'Sally'})-[:IS_FRIENDS_WITH]->(friend:Person)
RETURN friend.name

4.2 使用 WHERE 过滤 #

// 查询年龄大于25岁的人
MATCH (p:Person)
WHERE p.age > 25
RETURN p.name, p.age

// 查询在 Neo4j 公司工作的人
MATCH (p:Person)-[:WORKS_FOR]->(c:Company)
WHERE c.name = 'Neo4j'
RETURN p.name

4.3 使用 RETURN 返回结果 #

// 返回所有属性
MATCH (p:Person)
RETURN p

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

// 使用别名
MATCH (p:Person)
RETURN p.name AS 姓名, p.age AS 年龄

// 返回去重结果
MATCH (p:Person)
RETURN DISTINCT p.city

5. 小结 #

5.1 Cypher 是什么? #

Cypher 是 Neo4j 图数据库的查询语言,专门为图数据库设计,让你能够用接近自然语言的方式来查询和操作图数据。

5.2 Cypher 的特点 #

  • 直观易读:语法接近自然语言
  • ASCII 艺术风格:使用括号、箭头等符号直观表示图结构
  • 声明式语言:只需要描述"想要什么"
  • 模式匹配:强大的模式识别和匹配能力

5.3 基本结构 #

MATCH (模式)
WHERE (条件)
RETURN (结果)

5.4 常用关键字 #

  • MATCH:匹配图中的模式
  • CREATE:创建新数据
  • MERGE:创建或匹配数据
  • WHERE:过滤条件
  • RETURN:返回结果
  • SET:更新属性
  • DELETE:删除数据
← 上一节 33.Neo4j核心概念 下一节 35.模式匹配 →

访问验证

请输入访问令牌

Token不正确,请重新输入