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 |
构建复杂查询 |
最佳实践建议:
- 总是先用
MATCH
查询确认要操作的数据,再执行写操作(CREATE
,SET
,DELETE
)。 - 优先使用
MERGE
而不是CREATE
来避免创建重复数据。 - 使用
DETACH DELETE
删除节点时要非常小心,因为它会同时删除所有关系。 - 利用
PROFILE
或EXPLAIN
前缀来分析查询性能。