Neo4j

安装

docker

1
2
3
4
5
6
7
8
9
10
# windows
docker run -d --name neo4j -p 7474:7474 -p 7687:7687 -e NEO4J_AUTH=neo4j/password neo4j

# linux
docker run -d \
--name neo4j \
-p 7474:7474 \
-p 7687:7687 \
-e NEO4J_AUTH=neo4j/password \
neo4j

浏览器访问:http://localhost:7474,用户名:neo4j,密码:password

概念

  • 节点(Node):表示实体
  • 标签(label):给节点的分类,一个节点可以有多个标签
  • 关系(Relationship):两个节点之间的有向边
  • 属性(Property):节点/关系上的键值对

使用

Neo4j使用Cypher语言(类似SQL)来操作

用:

  • ():表示节点
  • []:表示关系
  • ->:表示方向

创建

创建节点

1
2
3
CREATE (p:Person {name: "张三", age: 25})
CREATE (m:Movie {title: "流浪地球", year: 2023})
MERGE (p:Person {name:"张三"})

解释:

  • p:给节点起的变量名,只在当前命令有效
  • Person:标签,也可以有多个标签,如(p:Person:Student:Male)
  • {name: “张三”, age: 25}:节点的属性
  • MERGE:如果不存在才创建

创建关系

1
2
MATCH (p:Person {name:"张三"}), (m:Movie {title:"流浪地球"})
CREATE (p)-[:ACTED_IN {role: "主角"}]->(m)

解释:

  • MATCH (p:Person {name:”张三”}):查找标签为Person且name为张三的节点,并赋值给变量p,m同理
  • -[]->:创建关系
  • ACTED_IN:关系的类型/名字
  • {role: “主角”}:关系的属性

批量创建

1
FOREACH (i IN range(1,10) | CREATE (p:Person{name:"用户"+i}))

查找

查找所有节点

1
MATCH (n) RETURN n LIMIT 10

解释:

  • (n):没有给任何筛选条件,就是查找所有节点,并赋值给变量n
  • LIMIT 10:展示前10个

条件查询

1
2
MATCH (p:Person {name:"张三"})-[r]-(n)
RETURN p, r, n

解释:查询和张三节点有直接关联的节点和联系

1
2
3
MATCH (p:Person)
WHERE p.age > 20 AND p.name CONTAINS "张"
RETURN p

解释:模糊查询,查询名字包含“张”的人

结果排序

1
2
3
MATCH (p:Person)
RETURN p.name, p.age
ORDER BY p.age DESC

多层查询

1
2
MATCH (a:Person {name:"A"})-[:FRIENDS*2]->(c)
RETURN a.name, c.name

解释:图数据库的优势区间。查找A的朋友的朋友

数据统计

计数

1
2
MATCH (p:Person)
RETURN COUNT(p) AS 总人数

平均数

1
2
MATCH (p:Person)
RETURN AVG(p.age) AS 平均年龄

删除

只有断开了关系的节点才能删除

删除节点

1
2
MATCH (p:Person {name:"张三"})
DETACH DELETE p

解释:

  • DETACH:断开这个节点的所有关系

删除关系

1
2
MATCH (p:Person {name:"张三"})-[r:ACTED_IN]->(m:Movie)
DELETE r

删除属性

1
2
3
MATCH (p:Person {name:"张三"})
REMOVE p.age // 删除 age 属性
REMOVE p:Person // 删除 Person 标签

修改

1
2
3
MATCH (p:Person {name:"张三"})
SET p.age = 26
RETURN p

约束

唯一约束

1
CREATE CONSTRAINT IF NOT EXISTS FOR (p:Person) REQUIRE p.name IS UNIQUE;

解释:Person标签下的name不能重复,且自动创建索引

主键

1
CREATE CONSTRAINT IF NOT EXISTS FOR (p:Person) REQUIRE p.id IS NODE KEY;

解释:等效于IS UNIQUE + IS NOT NULL

社区版创建不了

建索引

1
CREATE INDEX IF NOT EXISTS FOR (p:Person) ON (p.age);

查看创建的约束和索引

1
2
SHOW CONSTRAINTS;
SHOW INDEXES;

管道

1
2
3
4
5
MATCH (p:Person)
WHERE p.age > 20
WITH p // 把符合条件的人传给下一段
MATCH (p)-[:ACTED_IN]->(m:Movie)
RETURN p.name, m.title

解释:把第一个查询的值传递到第二个查询里


Neo4j
http://xwww12.github.io/2026/04/14/数据库/Neo4j/
作者
xw
发布于
2026年4月14日
许可协议