Skip to content

Neo4j数据库操作

  • 标签(Labels) 是用于对节点进行分类的标识符。它可以理解为节点的“类别”或“类型”。通过标签,你可以为节点分组,并定义节点的语义。

  • 节点(Nodes) 是图数据库的基本构建块,表示实体或对象。节点可以包含属性,并通过关系连接到其他节点。

  • 关系(Relationships) 是图中的“边”,用于连接两个节点,表示节点之间的关联或交互。关系可以有方向和属性。

  • 属性(Properties) 是键值对,用于存储节点或关系的附加信息。属性为实体或关系提供了细节。

1.CREATE添加数据

cypher
CREATE (p_zs:Person {id:1, name:"张三", email:"zs@admin.com", position:"研发"})
CREATE (dept_dev:Department { title:"研发组", leader:"李四"})
CREATE (p_zs)-[:BELONGS_TO{join: date("2026-02-01")}]->(dept_dev) // 同一个sql语句中执行
//可独立运行的
MATCH (p:Person {name: "张三"}), (dept:Department {title: "研发组"})
CREATE (p)-[:BELONGS_TO {join: date("2026-02-01")}]->(dept)
  • <id> 是 Neo4j 的内部标识符,是一个系统生成的、唯一的整数标识符。它不会出现在查询中,也不会被直接定义。
  • <elementId> 是 Neo4j 4.4+ 版本中引入的每个节点或关系的稳定标识符,是由 Neo4j 自动生成的字符串(例如 node-123
  • p_zs 是一个变量,用于引用创建的 Skill 节点。它仅在当前查询中有效,不会存储到数据库中。通过这个变量,你可以在同一个查询中对创建的节点进行操作,例如设置属性、创建关系等

CAUTION

create 重复执行,会创建两条数据

为节点属性添加唯一约束

cypher
CREATE CONSTRAINT person_id_unique IF NOT EXISTS
FOR (p:Person)
REQUIRE p.id IS UNIQUE

2.使用 MERGE 实现新增或更新

cypher
MERGE (p_zs:Person {id:1, name:"张三", email:"zs@admin.com", position:"研发"})
MERGE (dept_dev:Department { title:"研发组", leader:"李四"})
MERGE (p_zs)-[:BELONGS_TO{join: date("2026-02-01")}]->(dept_dev)

3.使用SET/REMOVE更新属性值

已有数据

cypher
MATCH (n:Person {name: "张三"}) 
SET n.email = "张三copy", n.updatedAt = datetime()
RETURN n
cypher
MATCH (n:Person {name: "张三"})
REMOVE n.email
RETURN n

保留现有属性而更新部分字段,可以使用 +=

cypher
MATCH (n:Person {name: "张三"})
SET n.vector += [4.4]  // 将新值追加到数组中
RETURN n

已有或新增数据

cypher
MERGE (n:Node {name: "ExampleNode"}) 
SET n.vector = [1.1, 2.2, 3.3], n.updatedAt = datetime()
RETURN n

新增或更新节点的部分属性

cypher
MERGE (n:Node {name: "ExampleNode"})
ON CREATE SET n.createdAt = datetime(), n.vector = [1.1, 2.2, 3.3]
ON MATCH SET n.updatedAt = datetime(), n.vector = [4.4, 5.5, 6.6]
RETURN n

删除

如果节点没有任何关系,可以直接使用 DELETE 删除该节点。

cypher
MATCH (node:Label {property: value})
DELETE node

如果节点有关系,直接使用 DELETE 会报错,因为 Neo4j 不允许删除仍然存在关系的节点。使用 DETACH DELETE 一步删除节点及其关系

cypher
MATCH (a:Person {name: "Alice"})
DETACH DELETE a

删除所有节点及其关系

cypher
MATCH (n)
DETACH DELETE n

保留一个节点,删除其他重复的节点

cypher
MATCH (n:Person)
WITH n.name AS name, COLLECT(n) AS nodes
WHERE SIZE(nodes) > 1
UNWIND TAIL(nodes) AS toDelete
DETACH DELETE toDelete

说明:

  • COLLECT(n) 将具有相同 name 的节点收集到一个列表中。
  • TAIL(nodes) 获取列表中的后续节点(保留第一个节点)。
  • DETACH DELETE toDelete 删除重复节点及其关系。

删除边的基本语法

cypher
MATCH (node1)-[relationship:RELATIONSHIP_TYPE]->(node2)
DELETE relationship

删除所有某种类型的边

cypher
MATCH ()-[r:BELONGS_TO]->()
DELETE r

清空所有数据

cypher
MATCH (n)
OPTIONAL MATCH (n)-[r]-()
DELETE n,r

查询

cypher
// 查看所有
MATCH (n)-[r]->(m)
RETURN n, r, m
cypher
MATCH p=()-[r:BELONGS_TO]->() RETURN p LIMIT 25

关于neo4j中的方向

(a)-[:KNOWS]->(b) 表示节点 a "认识" 节点 b

在 Cypher 查询中,可以显式指定关系的方向,也可以忽略方向:

//指定方向,匹配所有从节点 a 指向节点 b 的 KNOWS 关系
MATCH (a)-[:KNOWS]->(b)
RETURN a, b

//忽略方向,使用无方向的关系匹配符(--)可以忽略关系的方向。
MATCH (a)-[:KNOWS]-(b)
RETURN a, b

注意

社区版本不支持命令create database xxx,只有企业版可以

cypher
//查看数据库
show DATABASE;
//创建新的数据库
CREATE DATABASE dev_portrait_0113;
最近更新