返回主页 学习路径
Neo4j
节点 · 边 · 属性 · 关系查询
Neo4j 是由 Neo4j Inc. 于 2007 年创建的图数据库管理系统,是图数据库领域的领导者。Neo4j 将数据存储为节点(Node)、关系(Relationship)和属性(Property),通过 Cypher 查询语言实现高效的关系遍历和分析。Neo4j 在社交网络、推荐系统、欺诈检测、知识图谱、网络分析等场景中表现出色,被 eBay、Uber、Airbnb、思科等众多企业采用。
图数据库之王 · 关系分析
📅 诞生时间2007年 · Neo4j Inc.
🧩 类型图数据库 · 关系型
📊 查询语言Cypher
⚡性能
8/10
📦生态
7/10
🧠易用
6/10
🚀扩展性
8/10

📑 本文目录

📌 第一部分:Neo4j 概览与定位

1.1 定义与全称

Neo4j 是由 Neo4j Inc. 于 2007 年创建的图数据库管理系统,是图数据库领域的领导者。Neo4j 将数据存储为 节点(Node)、关系(Relationship)和属性(Property),通过 Cypher 查询语言实现高效的关系遍历和分析。

1.2 核心定位

Neo4j 的核心定位是 关系数据的高效存储和查询。它提供了:

1.3 主要应用领域

1.4 知名案例


⚙️ 第二部分:核心概念

2.1 图数据模型

2.2 Cypher 查询语言

// 创建节点
CREATE (u:User {name: "Alice", age: 30})
CREATE (p:Product {name: "Laptop", price: 999})

// 创建关系
MATCH (u:User {name: "Alice"})
MATCH (p:Product {name: "Laptop"})
CREATE (u)-[:PURCHASED {date: "2024-01-15"}]->(p)

// 查询好友关系
MATCH (u:User {name: "Alice"})-[:FRIEND]->(friend)
RETURN friend.name

// 查询多级关系(好友的朋友)
MATCH (u:User {name: "Alice"})-[:FRIEND*2]->(friend_of_friend)
RETURN friend_of_friend.name

// 查询最短路径
MATCH p = shortestPath(
    (a:User {name: "Alice"})-[:FRIEND*]-(b:User {name: "Bob"})
)
RETURN p

// 查询购买推荐
MATCH (u:User {name: "Alice"})-[:PURCHASED]->(p:Product)<-[:PURCHASED]-(other:User)
MATCH (other)-[:PURCHASED]->(recommend:Product)
WHERE NOT (u)-[:PURCHASED]->(recommend)
RETURN recommend.name, COUNT(*) AS score
ORDER BY score DESC
LIMIT 10

2.3 高级查询

// 聚合查询
MATCH (u:User)-[:PURCHASED]->(p:Product)
RETURN u.name, COUNT(p) AS purchase_count
ORDER BY purchase_count DESC

// 路径查询
MATCH path = (start:User {name: "Alice"})-[:FRIEND*1..5]-(end:User)
WHERE end.name = "Bob"
RETURN path

// 条件过滤
MATCH (u:User)
WHERE u.age > 25 AND u.city = "Beijing"
RETURN u.name

// 创建多条关系
MATCH (u1:User {name: "Alice"}), (u2:User {name: "Bob"})
CREATE (u1)-[:FRIEND]->(u2)

// 更新节点
MATCH (u:User {name: "Alice"})
SET u.age = 31
RETURN u

// 删除关系
MATCH (u:User {name: "Alice"})-[r:PURCHASED]->(p:Product {name: "Laptop"})
DELETE r

// 删除节点
MATCH (u:User {name: "Alice"})
DETACH DELETE u

2.4 索引和约束

// 创建索引(加速查询)
CREATE INDEX ON :User(name)
CREATE INDEX ON :Product(name)

// 创建唯一约束
CREATE CONSTRAINT ON (u:User) ASSERT u.id IS UNIQUE
CREATE CONSTRAINT ON (p:Product) ASSERT p.sku IS UNIQUE

2.5 Python 示例

# 使用 neo4j 驱动
from neo4j import GraphDatabase

class Neo4jClient:
    def __init__(self, uri, user, password):
        self.driver = GraphDatabase.driver(uri, auth=(user, password))

    def close(self):
        self.driver.close()

    def create_user(self, name, age):
        with self.driver.session() as session:
            result = session.run(
                "CREATE (u:User {name: $name, age: $age}) RETURN u",
                name=name, age=age
            )
            return result.single()[0]

    def find_friends(self, name):
        with self.driver.session() as session:
            result = session.run(
                "MATCH (u:User {name: $name})-[:FRIEND]->(friend) RETURN friend.name",
                name=name
            )
            return [record["friend.name"] for record in result]

# 使用
client = Neo4jClient("bolt://localhost:7687", "neo4j", "password")
client.create_user("Alice", 30)
friends = client.find_friends("Alice")
client.close()

2.6 Java Spring Boot 集成

// Spring Data Neo4j 实体
@Node
public class User {
    @Id
    @GeneratedValue
    private Long id;

    private String name;
    private int age;

    @Relationship(type = "FRIEND")
    private Set friends = new HashSet<>();
}

// Repository
@Repository
public interface UserRepository extends Neo4jRepository {
    @Query("MATCH (u:User {name: $name})-[:FRIEND]->(friend) RETURN friend")
    List findFriends(@Param("name") String name);

    @Query("MATCH (u:User {name: $name}) SET u.age = $age RETURN u")
    User updateAge(@Param("name") String name, @Param("age") int age);
}

// Service
@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    public User createUser(String name, int age) {
        User user = new User();
        user.setName(name);
        user.setAge(age);
        return userRepository.save(user);
    }

    public List getFriends(String name) {
        return userRepository.findFriends(name);
    }
}

2.7 图算法

// 社区检测(Louvain 算法)
CALL gds.louvain.stream('my-graph')
YIELD nodeId, communityId
RETURN gds.util.asNode(nodeId).name AS name, communityId
ORDER BY communityId

// 中心度分析(PageRank)
CALL gds.pageRank.stream('my-graph')
YIELD nodeId, score
RETURN gds.util.asNode(nodeId).name AS name, score
ORDER BY score DESC
LIMIT 10

// 最短路径(Dijkstra)
CALL gds.shortestPath.astar.stream({
  nodeProjection: 'User',
  relationshipProjection: {
    FRIEND: {
      type: 'FRIEND',
      properties: 'distance',
      orientation: 'UNDIRECTED'
    }
  },
  startNode: {id: 1},
  endNode: {id: 10}
})
YIELD path
RETURN path

⚖️ 第三部分:Neo4j vs 其他数据库

对比项 Neo4j MySQL MongoDB
数据模型关系型(表)文档型
关系查询极快(原生)慢(JOIN)慢(聚合)
深度遍历极快极慢极慢
事务支持✅ ACID✅ ACID
查询语言CypherSQLMQL
适用场景关系分析OLTP文档存储

🧠 第四部分:学习建议

1
基础入门

图数据库概念、Neo4j 安装、Cypher 基础(创建/查询)

2
核心进阶

Cypher 高级查询、索引约束、关系遍历

3
高级特性

图算法(PageRank、社区检测)、集群部署

4
实战应用

社交网络分析、推荐系统、知识图谱构建

推荐学习资源


🎯 总结升华

Neo4j 是关系分析的最佳工具。

它用 节点、关系、Cypher 查询 让复杂关系的存储和查询变得简单高效。Neo4j 是图数据库领域的领导者。

"Neo4j 让复杂关系变得清晰可见。" 🔗

🔖 相关标签
#图数据库 #Cypher #关系分析 #社交网络 #推荐系统 #知识图谱 #Neo4j
📄 本文档为 Neo4j 完整白皮书 · 最后更新于 2026年06月28日