Neo4j

返回图数据库

原生图数据库,以节点(Node)、关系(Relationship)、属性(Property)存储数据,擅长处理高度关联的数据和复杂关系查询。


核心概念

概念说明
节点(Node)图中的实体,如 Person、Movie
关系(Relationship)有方向、有类型的边,如 ACTED_INKNOWS
属性(Property)节点或关系上的键值对
标签(Label)节点的分类标记,一个节点可有多个标签
路径(Path)节点与关系的序列

Cypher 查询语言

基础语法

-- 节点:()  关系:-[]-  方向:-->
(n:Person {name: 'Alice'})
-[:KNOWS]->
(m:Person)

创建

-- 创建节点
CREATE (p:Person {name: 'Alice', age: 30})
 
-- 创建关系
MATCH (a:Person {name: 'Alice'}), (b:Person {name: 'Bob'})
CREATE (a)-[:KNOWS {since: 2020}]->(b)
 
-- MERGE:存在则匹配,不存在则创建
MERGE (p:Person {name: 'Charlie'})
ON CREATE SET p.createdAt = timestamp()
ON MATCH  SET p.updatedAt = timestamp()

查询

-- 基础查询
MATCH (p:Person) RETURN p.name, p.age ORDER BY p.age
 
-- 关系查询
MATCH (a:Person)-[:KNOWS]->(b:Person)
WHERE a.name = 'Alice'
RETURN b.name
 
-- 可变长路径(1到3跳)
MATCH (a:Person {name: 'Alice'})-[:KNOWS*1..3]->(b:Person)
RETURN b.name
 
-- 最短路径
MATCH p = shortestPath(
  (a:Person {name: 'Alice'})-[:KNOWS*]-(b:Person {name: 'Dave'})
)
RETURN p
 
-- 聚合
MATCH (p:Person)-[:ACTED_IN]->(m:Movie)
RETURN p.name, count(m) AS movieCount
ORDER BY movieCount DESC

更新与删除

-- 更新属性
MATCH (p:Person {name: 'Alice'})
SET p.age = 31, p.city = 'Beijing'
 
-- 删除属性
MATCH (p:Person {name: 'Alice'})
REMOVE p.city
 
-- 删除节点(需先删关系)
MATCH (p:Person {name: 'Alice'})
DETACH DELETE p

索引与约束

-- 创建索引
CREATE INDEX person_name FOR (p:Person) ON (p.name)
 
-- 唯一约束(自动创建索引)
CREATE CONSTRAINT person_id FOR (p:Person) REQUIRE p.id IS UNIQUE
 
-- 查看索引
SHOW INDEXES

Spring Data Neo4j

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-neo4j</artifactId>
</dependency>
spring:
  neo4j:
    uri: bolt://localhost:7687
    authentication:
      username: neo4j
      password: password
@Node("Person")
public class Person {
    @Id @GeneratedValue
    private Long id;
    private String name;
    private Integer age;
 
    @Relationship(type = "KNOWS", direction = OUTGOING)
    private List<Person> friends;
}
 
public interface PersonRepository extends Neo4jRepository<Person, Long> {
    List<Person> findByName(String name);
 
    @Query("MATCH (p:Person)-[:KNOWS*1..2]->(f:Person) WHERE p.name = $name RETURN f")
    List<Person> findFriendsOfFriends(String name);
}

典型使用场景

场景说明
社交网络好友关系、关注链、共同好友
知识图谱实体关系、语义推理
推荐系统基于关系的协同过滤
权限系统角色继承、资源访问控制
欺诈检测关联账户、资金链路分析
供应链上下游依赖链路追踪

与关系型数据库对比

维度Neo4jMySQL
数据模型图(节点+关系)表(行+列)
关系表达直接存储,O(1) 遍历JOIN,随深度指数增长
多跳查询天然高效递归 CTE,性能差
模式灵活性无固定 Schema强 Schema
适用场景关系密集、多跳查询结构化、事务性业务

相关文档