当前位置: 首页 > news >正文

Neo4j常用的语句记录

1. 核心概念:节点、关系、属性

在开始学习语句之前,先理解三个核心概念:

  • 节点:表示实体(如人、电影、产品)。用圆括号表示:()
    • (p:Person):一个带有标签 Person 的节点,变量名为 p
  • 关系:表示节点之间的连接。用方括号表示:[]。关系总是有方向的(--><--)。
    • [r:LIKES]:一个类型为 LIKES 的关系,变量名为 r
  • 属性:键值对,用于存储节点或关系的详细信息。用大括号表示:{}
    • {name: 'Tom Hanks', born: 1956}

2. 增(CREATE)

用于创建新的节点和关系。

a) 创建节点

// 创建一个带有 Person 标签的节点,并设置 name 和 born 属性
CREATE (p:Person {name: 'Tom Hanks', born: 1956})// 创建多个节点
CREATE (p1:Person {name: 'Alice'}), (p2:Person {name: 'Bob'})

b) 创建关系
需要先找到已存在的节点,然后在它们之间创建关系。

// 先找到两个节点,然后创建关系
MATCH (a:Person {name: 'Tom Hanks'}), (m:Movie {title: 'Forrest Gump'})
CREATE (a)-[r:ACTED_IN {roles: ['Forrest']}]->(m)
// 这里 r 是关系变量,ACTED_IN 是关系类型,roles 是关系的属性。

更常用的方法是 MERGE(见下文第5点),它可以避免创建重复数据。


3. 查(MATCH)

用于查询图中的数据。这是最常用的语句,通常与 WHERE 子句和 RETURN 子句一起使用。

a) 查找所有节点

// 查找所有节点(谨慎使用,数据量大时很慢)
MATCH (n) RETURN n

b) 根据标签查找节点

// 查找所有 Person 节点
MATCH (p:Person) RETURN p// 查找特定属性的节点 (方式一:直接在模式中指定)
MATCH (p:Person {name: 'Tom Hanks'}) RETURN p// 查找特定属性的节点 (方式二:使用 WHERE 子句)
MATCH (p:Person)
WHERE p.name = 'Tom Hanks' AND p.born > 1950
RETURN p

c) 查找关系(路径)

// 查找 Tom Hanks 演过的所有电影
MATCH (p:Person {name: 'Tom Hanks'})-[:ACTED_IN]->(movie:Movie)
RETURN p, movie// 查找谁导演了 'Forrest Gump' 这部电影
MATCH (director:Person)-[:DIRECTED]->(m:Movie {title: 'Forrest Gump'})
RETURN director.name

d) 可变长度路径

// 查找 Tom Hanks 的 1到3度好友(朋友的朋友的朋友)
MATCH (p:Person {name: 'Tom Hanks'})-[:FRIENDS_WITH*1..3]-(friend)
RETURN friend.name

4. 改(SET, REMOVE)

用于更新节点或关系的属性。

a) SET:设置或更新属性

// 为某个节点添加或修改属性
MATCH (p:Person {name: 'Tom Hanks'})
SET p.country = 'USA', p.awards = 100
RETURN p

b) REMOVE:移除属性或标签

// 移除一个属性
MATCH (p:Person {name: 'Tom Hanks'})
REMOVE p.awards
RETURN p// 移除一个标签(注意:不是删除节点)
MATCH (p:Person {name: 'Tom Hanks'})
REMOVE p:OldLabel

5. 删(DELETE)

用于删除节点和关系。

重要:删除节点前,必须先删除其所有关系。

a) 删除关系

// 删除 Tom Hanks 和某部电影之间的 ACTED_IN 关系
MATCH (p:Person {name: 'Tom Hanks'})-[r:ACTED_IN]->(m:Movie {title: 'A Movie'})
DELETE r

b) 删除节点(及其所有关系)

// 先删除关系,再删除节点
MATCH (p:Person {name: 'Someone'})-[r]-() // 匹配该节点的所有进出关系
DELETE r, p// 更简洁的方式:使用 DETACH DELETE(强制删除节点及其所有关系)
MATCH (p:Person {name: 'Someone'})
DETACH DELETE p

6. 高级且实用的语句

a) MERGE
“有则返回,无则创建”。它确保了图数据库中的唯一性,是 CREATE 的更安全版本。

// 如果不存在名为 ‘Tom Hanks’ 的 Person 节点,则创建它;如果存在,则只是匹配到它。
MERGE (p:Person {name: 'Tom Hanks'})
ON CREATE SET p.created = timestamp() // 仅在创建时执行
ON MATCH SET p.lastSeen = timestamp()  // 仅在匹配时执行
RETURN p

b) WITH
将查询的一部分结果传递到下一部分,类似于管道。常用于聚合后过滤。

// 查找出演电影超过 5 部的演员
MATCH (p:Person)-[:ACTED_IN]->(m:Movie)
WITH p, count(m) AS movieCount // 将演员和其电影计数传递下去
WHERE movieCount > 5
RETURN p.name, movieCount
ORDER BY movieCount DESC

c) UNION
合并两个查询的结果集(字段必须一致)。

// 查找所有演员和导演的名字
MATCH (p:Person)-[:ACTED_IN]->(:Movie)
RETURN p.name AS name, 'Actor' AS roleUNIONMATCH (p:Person)-[:DIRECTED]->(:Movie)
RETURN p.name AS name, 'Director' AS role

7. 常用函数和子句

  • RETURN:指定返回什么。
  • WHERE:过滤条件。
  • ORDER BY:排序。ORDER BY p.name DESC
  • LIMIT / SKIP:分页。RETURN ... LIMIT 10 SKIP 20
  • COUNT(), SUM(), AVG():聚合函数。
  • DISTINCT:去重。RETURN DISTINCT p.name
  • COLLECT():将值收集到列表中。RETURN p.name, COLLECT(m.title) AS movies

总结

语句 关键字 用途
创建 CREATE, MERGE 添加新数据
查询 MATCH, WHERE, RETURN 读取数据,这是核心
更新 SET, REMOVE 修改现有数据
删除 DELETE, DETACH DELETE 删除数据
高级操作 WITH, UNION 构建复杂查询

最佳实践建议

  1. 总是先用 MATCH 查询确认要操作的数据,再执行写操作(CREATE, SET, DELETE)。
  2. 优先使用 MERGE 而不是 CREATE 来避免创建重复数据。
  3. 使用 DETACH DELETE 删除节点时要非常小心,因为它会同时删除所有关系。
  4. 利用 PROFILEEXPLAIN 前缀来分析查询性能。
http://www.hskmm.com/?act=detail&tid=14386

相关文章:

  • p1-1002
  • Model Context Protocol (MCP) 完整协议流程详解
  • 常用的 HTTP 请求方法和区别
  • 第七届机器学习、大数据与商务智能国际会议(MLBDBI 2025)
  • 【OpenCV】11 形态学操作
  • 安装与使用trex
  • 自建 Supabase 云服务与 BeeCount 云同步详解
  • CF2134 Codeforces Round 1045 (Div. 2) 游记(VP)
  • jemter 安装
  • Day20创建对象内存分析
  • 熬夜三天!SpringCloud Gateway 动态路由失效,背后黑手竟是它……
  • cmd 执行git bash 命令
  • 安全向量模板类SiVector - 实践
  • 最佳三维文件格式,以及怎么在线浏览编辑FBX/OBJ/GLB/GLTF
  • FR报表下拉框高度(JS添加css样式方式)调整
  • 基于Python+Vue开发的新闻管理系统源码+运行步骤
  • 鸿蒙应用开发从入门到实战(十二):ArkUI组件ButtonToggle
  • Spring框架中的注解主要有哪些
  • 从视觉、文案到交互:三步彻底去除产品AI味
  • 理解WPF Stylet中Command={s:Action 方法名}的设计与实现
  • 帆软报表下拉框高度(JS添加css样式方式)调整
  • 探索 12 种 3D 文件格式:综合指南
  • 剑指offer-32、把数组排成最⼩的数
  • WPF 一个Label标签中的文字 Binding两个值
  • Session和Cookie的定义是什么?他们之间有什么区别?
  • 使用C++编写的一款射击五彩敌人的游戏 - 详解
  • CG-65 剖面细管式温度传感器 可实时监测不同土层温度动态
  • list集合根据某字段获取某个对象
  • .NET STS 版本支持 24 个月
  • 后缀数组基础 Suffix Array