安装
docker
1 2 3 4 5 6 7 8 9 10
| docker run -d --name neo4j -p 7474:7474 -p 7687:7687 -e NEO4J_AUTH=neo4j/password neo4j
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
|
解释:
删除关系
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
|
解释:把第一个查询的值传递到第二个查询里