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)

建模示例:电影推荐系统

// 创建电影数据模型
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);

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

// 找到张三喜欢的演员主演但张三还没看过的电影
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)

安装驱动

pip install neo4j

连接数据库

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"
)

完整示例:增删改查

# ========== 写入数据 ==========
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 查询 → 数据建模与代码连接

posted on 2026-04-26 09:37  哥本哈士奇(aspnetx)  阅读(2)  评论(0)    收藏  举报

导航