惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Microsoft Azure Blog
Microsoft Azure Blog
量子位
小众软件
小众软件
C
Cybersecurity and Infrastructure Security Agency CISA
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Tenable Blog
V
Vulnerabilities – Threatpost
Know Your Adversary
Know Your Adversary
T
Threat Research - Cisco Blogs
Latest news
Latest news
Spread Privacy
Spread Privacy
C
Cyber Attacks, Cyber Crime and Cyber Security
NISL@THU
NISL@THU
T
Tor Project blog
Hacker News: Ask HN
Hacker News: Ask HN
V2EX - 技术
V2EX - 技术
T
The Exploit Database - CXSecurity.com
博客园 - 三生石上(FineUI控件)
K
Kaspersky official blog
Cyberwarzone
Cyberwarzone
博客园 - 叶小钗
博客园 - 聂微东
Last Week in AI
Last Week in AI
爱范儿
爱范儿
腾讯CDC
博客园 - Franky
美团技术团队
J
Java Code Geeks
O
OpenAI News
L
Lohrmann on Cybersecurity
Simon Willison's Weblog
Simon Willison's Weblog
有赞技术团队
有赞技术团队
T
Threatpost
G
GRAHAM CLULEY
Hugging Face - Blog
Hugging Face - Blog
博客园 - 【当耐特】
宝玉的分享
宝玉的分享
I
Intezer
N
News and Events Feed by Topic
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
The Blog of Author Tim Ferriss
S
Security @ Cisco Blogs
Forbes - Security
Forbes - Security
N
News | PayPal Newsroom
Stack Overflow Blog
Stack Overflow Blog
Scott Helme
Scott Helme
H
Hacker News: Front Page
Cloudbric
Cloudbric

博客园 - 哥本哈士奇(aspnetx)

Raw Data Vault vs Business Data Vault Neo4j 多跳查询实战:从社交网络场景理解图遍历 Git 本地版本管理学习笔记 看完《低智商犯罪》,学习Cypher构建知识图谱 LangChain DeepAgents 学习笔记 LangChain Deepagent 版本0.6.1中间件一个bug Neo4j笔记(五):查询的处理流程 微软 SQL Server 版本演进史:从诞生到 SQL Server 2025 提升 Text2SQL 准确率 SQLServer Management Studio(SSMS) 22 Copilot 最佳实践学习笔记 SQLServer RAG笔记4:从服务层到前端交互 SQLServer RAG笔记5:为SQLServer 2025配置Ollama SQL Server RAG 笔记3:SQLServer2025 向量数据库 详解传统RAG、Text2SQL、Graph RAG:适用场景与问题示例汇总 SQL Server RAG 笔记2:图数据库服务层与前端可视化构建 SQL Server RAG 笔记1:图数据库构建 Neo4j 笔记(四):一篇文章如何入库的 数据仓库笔记 第六篇:PSA 层 SCD2 处理方式 数据仓库笔记 第五篇:Data Mart 层(数据集市) 数据仓库笔记 第四篇:Star Schema 层(维度建模) 数据仓库笔记 第三篇:常用缓慢变化维处理方式介绍 数据仓库笔记 第二篇:PSA 层(持久化暂存区)详解 数据仓库笔记 第一篇:数据仓库的定义、历史与意义 Neo4j 基础教程(二):Cypher CRUD 完全指南 Neo4j 基础教程(一):安装与快速入门 Power BI学习笔记第20篇:面试题汇总 · 第三篇:高级应用与最佳实践篇 Power BI学习笔记第19篇:面试题汇总 · 第二篇:数据建模与 DAX 篇 Power BI学习笔记第18篇:面试题汇总 · 第一篇:基础概念篇 Power BI学习笔记第15篇:企业级报表开发与最佳实践 Power BI学习笔记第13篇:高级可视化与自定义图表 Power BI学习笔记第14篇:Power Query 高级数据处理 Power BI学习笔记第12篇:DAX 高级计算与性能优化 Power BI学习笔记第11篇:高级数据建模与关系设计 Power BI学习笔记第10篇:实战案例 — 销售数据分析仪表板 Power BI学习笔记第08篇:报表交互与筛选器 Power BI学习笔记第09篇:Power BI Service 发布与共享 Power BI学习笔记第07篇:可视化图表设计与最佳实践 Power BI学习笔记第06篇:DAX 进阶:时间智能与复杂计算 Power BI学习笔记第05篇:DAX 基础:计算列与度量值 Power BI学习笔记第04篇:数据建模与关系管理 Power BI学习笔记第03篇:Power Query 数据清洗与转换 Power BI学习笔记第02篇:数据获取与连接数据源 Power BI学习笔记第01篇:Power BI 简介与环境搭建 Power BI Dashboard 常用布局方案推荐 Power BI 示例一览 OpenClaw 核心八大 MD 文件 Microsoft Agent Framework 智能体调用工具 Microsoft Agent Framework 创建智能体 一个简单案例理解OpenClaw的做梦过程 SQLAlchemy 学习笔记 LangChain RAG索引与查询 - 学习笔记 LangChain使用deep agent并且加载SKILL 本地系统对接大模型智能体的若干尝试 财务分析报告 - 常用Power BI DAX公式详解 用SKILL实现请假流程信息收集 使用小龙虾来操作猿编程的遥控车 使用OpenClaw的Skills对接本地系统 OpenClaw必装Skill全指南 Dify Agentic RAG 笔记 # 简单的神经网络计算过程 - 正负判断 使用Gradio构建AI前端 - RAG的QA模块 使用Gradio构建AI前端 - RAG召回测试 Streamlit + LangChain 1.0 简单实现智能问答前后端 利用AI Agent,辅助销售团队制定培训和考试内容 实现AI和BI整合的初步思路和探索-Part3 实现AI和BI整合的初步思路和探索-Part2 实现AI和BI整合的初步思路和探索 以《出师表》作为例子,对比通用分块和父子分块的区别 LangChain RAG 学习笔记:从文档加载到问答服务 记录无法修改OneDrive文件的解决方法 Power BI制作指标达成跟踪器 Power BI学习笔记-周报销售数据分析
Neo4j 笔记(三):数据建模与程序连接实战
哥本哈士奇(aspnetx) · 2026-04-26 · via 博客园 - 哥本哈士奇(aspnetx)

环境: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 查询 → 数据建模与代码连接