Neo4j

原生图数据库 - 关系优先建模、强大遍历能力、Cypher 查询语言

TL;DR

是什么:用于关联数据的原生图数据库。

为什么用:关系优先、直观的数据建模、强大的遍历能力、Cypher 查询语言。

Quick Start

使用 Docker 安装

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

访问:打开 http://localhost:7474(浏览器 UI)

连接:使用 neo4j / password

创建节点和关系

CREATE (john:Person {name: 'John', age: 30})
CREATE (jane:Person {name: 'Jane', age: 28})
CREATE (john)-[:KNOWS]->(jane)
RETURN john, jane

Cheatsheet

操作Cypher
创建节点CREATE (n:Label {props})
创建关系CREATE (a)-[:TYPE]->(b)
查找节点MATCH (n:Label) RETURN n
按属性查找MATCH (n {name: 'John'}) RETURN n
查找关系MATCH (a)-[r:TYPE]->(b) RETURN r
更新SET n.prop = value
删除DELETE nDETACH DELETE n

Gotchas

基础 CRUD

// 创建
CREATE (p:Person {name: 'Alice', email: '[email protected]'})

// 读取
MATCH (p:Person {name: 'Alice'}) RETURN p

// 更新
MATCH (p:Person {name: 'Alice'})
SET p.age = 25
RETURN p

// 删除(包含关系)
MATCH (p:Person {name: 'Alice'})
DETACH DELETE p

关系模式

// 有向关系
MATCH (a:Person)-[:KNOWS]->(b:Person)
RETURN a, b

// 无向(任意方向)
MATCH (a:Person)-[:KNOWS]-(b:Person)
RETURN a, b

// 多跳
MATCH (a:Person)-[:KNOWS*1..3]->(b:Person)
RETURN a, b

// 可变长度路径
MATCH path = (a:Person)-[:KNOWS*]->(b:Person)
RETURN path

聚合

// 统计好友数
MATCH (p:Person)-[:KNOWS]->(friend)
RETURN p.name, count(friend) as friendCount

// 分组
MATCH (p:Person)
RETURN p.city, count(p) as population
ORDER BY population DESC

索引

// 创建索引
CREATE INDEX FOR (p:Person) ON (p.name)

// 创建约束(唯一)
CREATE CONSTRAINT FOR (p:Person) REQUIRE p.email IS UNIQUE

// 显示索引
SHOW INDEXES

Next Steps