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
// 查询所有约束信息
SHOW CONSTRAINTS

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

c)删除所有的关系数据
MATCH ()-[r]->():这部分是匹配模式,()表示任意节点,[r]->()表示任意关系(r是关系的变量名)
DELETE r:删除所有匹配到的关系
注意事项

  • 执行此操作会删除数据库中所有类型的关系,但不会删除节点
  • 关系被删除后无法恢复,请确保在执行前做好数据备份
  • 如果数据库中关系数量非常多,这个操作可能需要一些时间完成
  • 不需要先删除节点,因为 Neo4j 允许节点在没有关系的情况下存在
// 删除数据库中所有关系
MATCH ()-[r]->()
DELETE r

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 role

UNION

MATCH (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 前缀来分析查询性能。
posted @ 2025-09-23 09:32  PyAj  阅读(17)  评论(0)    收藏  举报