Neo4j 基础教程(三):数据建模与程序连接实战

Neo4j 基础教程(三):数据建模与程序连接实战

环境:macOS + Neo4j + Python


Part 1:数据建模最佳实践

建模原则

原则一:按业务语义建模,而非表结构

图数据库的优势在于关系,先想清楚「是什么」和「如何关联」。

场景 节点标签 关系类型 关键属性
社交网络 :User :FOLLOWS since
电商 :Product, :Customer :PURCHASED quantity, date
推荐系统 :User, :Item :RATED score
组织架构 :Employee :REPORTS_TO since

关系方向的设计

  • 有天然方向:REPORTS_TO(有向)
  • 双向均可查询:[:KNOWS] 可两端 MATCH
  • 无方向:属性关系如 MATCH (a)-[r:distance {km: 100}]-(b)

建模示例:电影推荐系统

cypher 复制代码
// 创建电影数据模型
CREATE
  (u1:User {name: '张三', age: 28}),
  (u2:User {name: '李四', age: 35}),
  (m1:Movie {title: '流浪地球', genre: '科幻', rating: 8.5}),
  (m2:Movie {title: '满江红', genre: '悬疑', rating: 7.8}),
  (a1:Actor {name: '吴京', country: '中国'}),
  (a2:Actor {name: '沈腾', country: '中国'});

MATCH (m1:Movie {title:'流浪地球'}), (a1:Actor {name:'吴京'}) CREATE (a1)-[:ACTED_IN]->(m1);
MATCH (m2:Movie {title:'满江红'}), (a2:Actor {name:'沈腾'}) CREATE (a2)-[:ACTED_IN]->(m2);
MATCH (u1:User {name:'张三'}), (m1:Movie {title:'流浪地球'}) CREATE (u1)-[:RATED {score: 9}]->(m1);
MATCH (u1:User {name:'张三'}), (m2:Movie {title:'满江红'}) CREATE (u1)-[:RATED {score: 6}]->(m2);
MATCH (u2:User {name:'李四'}), (m1:Movie {title:'流浪地球'}) CREATE (u2)-[:RATED {score: 8}]->(m1);

查询示例:给用户推荐电影

cypher 复制代码
// 找到张三喜欢的演员主演但张三还没看过的电影
MATCH (u:User {name: '张三'})-[:RATED {score: 8}]->(m:Movie)<-[:ACTED_IN]-(a:Actor)
WHERE NOT (u)-[:RATED]->(m)
RETURN m.title AS 推荐电影, a.name AS 主演, m.rating AS 评分
ORDER BY m.rating DESC

Part 2:Python 连接 Neo4j(neo4j-driver)

安装驱动

bash 复制代码
pip install neo4j

连接数据库

python 复制代码
from neo4j import GraphDatabase

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

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

    def query(self, cypher, parameters=None):
        with self.driver.session() as session:
            result = session.run(cypher, parameters)
            return [dict(record) for record in result]

# 连接(Docker 默认地址)
conn = Neo4jConnection(
    uri="bolt://localhost:7687",
    user="neo4j",
    password="password"
)

完整示例:增删改查

python 复制代码
# ========== 写入数据 ==========
def create_user(conn, name, age):
    cypher = """
        MERGE (u:User {name: $name})
        SET u.age = $age
        RETURN u
    """
    result = conn.query(cypher, {"name": name, "age": age})
    print(f"创建用户: {result[0]['u']['name']}")

create_user(conn, "王五", 30)

# ========== 查询数据 ==========
def find_friends(conn, user_name):
    cypher = """
        MATCH (u:User {name: $name})-[:KNOWS]->(friend)
        RETURN friend.name AS name, friend.age AS age
    """
    return conn.query(cypher, {"name": user_name})

friends = find_friends(conn, "Alice")
for f in friends:
    print(f"好友: {f['name']}, 年龄: {f['age']}")

# ========== 事务写入 ==========
def create_relationship(conn, from_name, to_name, rel_type):
    cypher = f"""
        MATCH (a:User {{name: $from}}), (b:User {{name: $to}})
        MERGE (a)-[:{rel_type}]->(b)
    """
    conn.query(cypher, {"from": from_name, "to": to_name})
    print(f"创建关系: {from_name} -> {to_name}")

create_relationship(conn, "Bob", "Carol", "KNOWS")

conn.close()

推荐学习路径

复制代码
第1天:安装 Neo4j,熟悉 Browser 操作   → 教程一
第2天:掌握 Cypher CRUD              → 教程二
第3天:设计自己的数据模型,写 Python 连接

常用资源


三篇教程已完成!涵盖:安装入门 → Cypher 查询 → 数据建模与代码连接

相关推荐
大龄程序员狗哥1 天前
第27篇:PyTorch动态图 vs TensorFlow静态图——深度框架核心机制对比(原理解析)
pytorch·tensorflow·neo4j
许彰午1 天前
# 一个Java老鸟的TensorFlow入门——从计算图到GradientTape
java·tensorflow·neo4j
西兰先森3 天前
使用Antv G6渲染neo4j知识图谱数据
python·知识图谱·neo4j
倘来之遇4 天前
Neo4j 超详细入门
neo4j·graphrag
深念Y8 天前
图数据库 vs 向量数据库:AI时代的两个“最强大脑”
数据库·人工智能·neo4j·图论··向量·rag
MediaTea10 天前
知识图谱工具简介:Protégé、Neo4j、Jena
人工智能·知识图谱·neo4j
java1234_小锋11 天前
Spring AI快速入门
人工智能·spring·neo4j
深圳市快瞳科技有限公司12 天前
端侧喂鸟器上的轻量化鸟类识别:从模型选型到低功耗部署实战
计算机视觉·neo4j
醉挽清风78313 天前
服务器安装neo4j和jupyter
服务器·jupyter·neo4j