Neo4j
→ 返回图数据库
原生图数据库,以节点(Node)、关系(Relationship)、属性(Property)存储数据,擅长处理高度关联的数据和复杂关系查询。
核心概念
概念 说明 节点(Node) 图中的实体,如 Person、Movie 关系(Relationship) 有方向、有类型的边,如 ACTED_IN、KNOWS 属性(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 );
}
典型使用场景
场景 说明 社交网络 好友关系、关注链、共同好友 知识图谱 实体关系、语义推理 推荐系统 基于关系的协同过滤 权限系统 角色继承、资源访问控制 欺诈检测 关联账户、资金链路分析 供应链 上下游依赖链路追踪
与关系型数据库对比
维度 Neo4j MySQL 数据模型 图(节点+关系) 表(行+列) 关系表达 直接存储,O(1) 遍历 JOIN,随深度指数增长 多跳查询 天然高效 递归 CTE,性能差 模式灵活性 无固定 Schema 强 Schema 适用场景 关系密集、多跳查询 结构化、事务性业务
相关文档