摘要: 在大数据与 AI 时代,数据之间的关系价值连城。传统的 SQL 数据库难以处理复杂的网状关系,而 知识图谱图数据库 Neo4j 正是为此而生。

本文将带你从 0 基础出发,手把手教你部署 Neo4j Community Edition(社区服务器版),如何通过浏览器访问其可视化界面,并使用 Python 代码构建一个生动的人物关系图谱。拒绝繁琐理论,全是实战干货!


一、 核心概念:图谱与 Neo4j

在动手之前,我们用大白话把两个核心概念捋清楚。

1. 什么是知识图谱?

知识图谱本质上就是把世界上的事物(节点)和它们之间的联系(关系)画成一张巨大的网

  • Excel 思维:罗列数据(行与列)。

  • 图谱思维:链接数据(点与线)。例如:(孙悟空)--[师弟]-->(猪八戒)

2. 为什么选择 Neo4j?

Neo4j 是图数据库领域的绝对霸主。

  • 高性能:查询深度关系(如“朋友的朋友的朋友”)速度秒杀 MySQL。

  • 可视化:自带 Web 界面,数据不再是枯燥的表格,而是生动的网络图。


二、 环境部署:Neo4j 社区版 (Community Edition)

很多教程推荐 Desktop 版,但社区版更轻量、更硬核,且更接近服务器真实环境。以下是 Windows/Mac 通用的部署步骤。

步骤 1:准备 Java 环境(必读!)

Neo4j 是基于 Java 开发的,因此必须先安装 JDK。

  • Neo4j 5.x 版本:需要安装 JDK 17

  • Neo4j 4.x 版本:需要安装 JDK 11

  • 如果不确定,请先在终端输入 java -version 检查。如果没有安装,请去 Oracle 官网下载 JDK 17 安装。

步骤 2:下载 Neo4j 社区版

  1. 访问 Neo4j 下载中心

  2. 找到 Neo4j Community Edition

  3. 根据你的系统(Windows 或 macOS/Linux)下载对应的压缩包(zip 或 tar)。

步骤 3:解压与启动

这是一个绿色免安装软件,解压即可用。

  1. 将下载的压缩包解压到一个你喜欢的文件夹(路径最好不要有中文)。

  2. 打开终端(CMD 或 PowerShell),进入解压后的 bin 目录。

  3. 输入启动命令:

    • Windows: neo4j.bat console

    • Mac/Linux: ./neo4j console

当看到控制台输出类似 Started. 或者 Remote interface available at http://localhost:7474/ 的字样时,说明数据库引擎已成功启动!


三、 访问网页版控制台 (Neo4j Browser)

社区版虽然是命令行启动,但它自带了一个强大的网页可视化界面

1. 如何进入?

保持刚才的黑色终端窗口不要关闭(关闭它数据库就停了),打开你的 Chrome 或 Edge 浏览器,输入:

👉 http://localhost:7474

2. 登录配置

第一次访问会看到登录框:

  • Connect URL: 保持默认 bolt://localhost:7687

  • Username: 输入默认用户名 neo4j

  • Password: 输入默认密码 neo4j

点击 Connect 后,系统会强制要求你修改新密码

  • 输入新密码(例如 123456),一定要记住它!

进入后,当你看到有一个 $ 符号的输入框,说明你已经成功进入了 Neo4j 的可视化世界。


四、 实战:使用 Python 构建知识图谱

环境通了,接下来我们用 Python 来自动化构建一个 “西游记人物关系图谱”

1. 安装 Python 驱动

打开一个新的 CMD 窗口(不要动刚才跑数据库的那个),运行:

Bash

pip install neo4j

2. 编写构建代码

新建一个 Python 文件 build_graph.py,复制以下代码。该代码封装了连接逻辑,采用了 MERGE 语法防止重复创建数据。

Python

from neo4j import GraphDatabase

class KnowledgeGraph:
    def __init__(self, uri, user, password):
        """
        连接 Neo4j 数据库
        """
        self.driver = GraphDatabase.driver(uri, auth=(user, password))

    def close(self):
        """
        关闭连接
        """
        self.driver.close()

    def create_relation(self, person1, relation, person2):
        """
        创建节点和关系
        """
        with self.driver.session() as session:
            # Cypher 语句说明:
            # MERGE 只有在节点不存在时才创建,存在则复用
            query = """
            MERGE (p1:Character {name: $name1})
            MERGE (p2:Character {name: $name2})
            MERGE (p1)-[r:RELATION {type: $rel}]->(p2)
            RETURN p1, p2, r
            """
            session.run(query, name1=person1, name2=person2, rel=relation)
            print(f"构建成功:{person1} --[{relation}]--> {person2}")

    def clear_data(self):
        """
        清空数据库(慎用!)
        """
        with self.driver.session() as session:
            session.run("MATCH (n) DETACH DELETE n")
            print("数据库已重置。")

# --- 主程序入口 ---
if __name__ == "__main__":
    # 1. 配置连接信息
    # 社区版默认地址是 bolt://localhost:7687
    URI = "bolt://localhost:7687"
    USER = "neo4j"
    PASSWORD = "123456"  # 【重要】这里改成你在网页端设置的新密码

    # 2. 准备图谱数据
    data = [
        ("唐僧", "师徒", "孙悟空"),
        ("唐僧", "师徒", "猪八戒"),
        ("唐僧", "师徒", "沙僧"),
        ("孙悟空", "师兄弟", "猪八戒"),
        ("孙悟空", "结拜", "牛魔王"),
        ("牛魔王", "夫妻", "铁扇公主"),
        ("铁扇公主", "母子", "红孩儿"),
        ("东海龙王", "被抢", "孙悟空")
    ]

    # 3. 运行构建
    kg = KnowledgeGraph(URI, USER, PASSWORD)
    try:
        kg.clear_data() # 清空旧数据,方便演示
        print("开始写入图数据...")
        
        for p1, rel, p2 in data:
            kg.create_relation(p1, rel, p2)
            
        print("\n图谱构建完成!请去浏览器 (http://localhost:7474) 查看效果。")
    except Exception as e:
        print(f"连接失败,请检查密码或Java环境: {e}")
    finally:
        kg.close()

3. 运行代码

运行脚本,如果控制台输出“构建成功”,说明数据已经通过 Bolt 协议飞入了你的本地数据库。


五、 见证时刻:可视化查询

回到浏览器 http://localhost:7474

  1. 在顶部的 $ 输入框中,输入查询所有数据的命令:

    Cypher

    MATCH (n) RETURN n
    
  2. 点击右侧蓝色的播放按钮 ▶️。

瞬间,一张错综复杂的人物关系网就会呈现在你眼前!

  • Tips:你可以用鼠标拖拽节点,它们会像弹簧一样弹动(力导向图效果),非常解压。也可以点击节点,在底部修改颜色和大小。


六、 新手必读:一个数据库能存多个图谱吗?

这是很多小伙伴最容易困惑的问题:

“博主,我现在建了西游记图谱,如果我想再建一个三国演义图谱,需要重新建一个数据库吗?”

答案是:不需要!

在 Neo4j 中,我们通常把所有数据都放在同一个库里,但是通过 Label(标签) 来进行逻辑隔离。这就好比在一个 Excel 文件里,用不同的 Sheet 来区分数据。

  • 西游记图谱:给节点打上 :WestJourney 标签。

    • 查询时:MATCH (n:WestJourney) RETURN n

  • 三国演义图谱:给节点打上 :SanGuo 标签。

    • 查询时:MATCH (n:SanGuo) RETURN n

只要查询时带上标签,它们就是两个完全独立的平行宇宙,互不干扰;如果不带标签查,你就会看到孙悟空和诸葛亮同台竞技(这正是图数据库做跨域关联分析的优势所在)!

1. 标签 (Label) 在代码的哪里?

回顾一下我们上一篇文章的核心代码,标签就在 Cypher 语句的冒号后面:

Python

# 之前的写法
query = """
MERGE (p1:Character {name: $name1})  <-- 这里的 :Character 就是标签
...
"""

如果你想把标签改成“西游记”,最笨的办法是直接把 :Character 改成 :XiYou。但这样代码就不灵活了。

2. 进阶写法:让 Python 动态传标签 (推荐)

我们可以修改 Python 函数,让它接收一个 label 参数。这样同一个函数,既能建西游记,也能建三国。

注意: 在 Neo4j 的驱动中,标签名不能通过 $参数 传递(这是为了安全),只能通过 Python 的 f-string (字符串格式化) 拼接到语句中。

请将你的 create_relation 函数修改为如下版本:

修改后的 Python 代码 (build_graph.py)

Python

    # 增加了一个 label 参数
    def create_relation(self, label, person1, relation, person2):
        with self.driver.session() as session:
            # 【重点】使用 f-string (f"...") 将 label 变量拼接到 Cypher 语句中
            # 注意看 p1:{label},这里的大括号是 Python 的占位符
            query = f"""
            MERGE (p1:{label} {{name: $name1}})
            MERGE (p2:{label} {{name: $name2}})
            MERGE (p1)-[r:RELATION {{type: $rel}}]->(p2)
            RETURN p1, p2, r
            """
            # 注意:上面用了 f-string 后,Cypher 原本的大括号 {} 需要写成双重大括号 {{ }} 来转义
            
            session.run(query, name1=person1, name2=person2, rel=relation)
            print(f"[{label}] 构建成功:{person1} --[{relation}]--> {person2}")

# --- 主程序调用方式 ---
if __name__ == "__main__":
    # ... (连接部分省略,同上篇) ...
    kg = KnowledgeGraph(URI, USER, PASSWORD)

    # 1. 导入西游记数据 (打上 XiYou 标签)
    xiyou_data = [("孙悟空", "师弟", "猪八戒"), ("唐僧", "徒弟", "孙悟空")]
    print("--- 开始构建西游记 ---")
    for p1, rel, p2 in xiyou_data:
        kg.create_relation("XiYou", p1, rel, p2)  # <--- 看这里,传入标签

    # 2. 导入三国数据 (打上 SanGuo 标签)
    sanguo_data = [("刘备", "兄弟", "关羽"), ("关羽", "兄弟", "张飞")]
    print("\n--- 开始构建三国 ---")
    for p1, rel, p2 in sanguo_data:
        kg.create_relation("SanGuo", p1, rel, p2) # <--- 看这里,换了个标签

    kg.close()

3. 运行后的效果

当你运行这段代码后,Python 会自动执行以下操作:

  1. xiyou_data 里的数据,全部盖上 :XiYou 的章,存入数据库。

  2. sanguo_data 里的数据,全部盖上 :SanGuo 的章,存入数据库。

4. 怎么在浏览器里分开看?

现在你去 Neo4j Browser (localhost:7474),就可以分开查询了:

  • 只想看西游记:

    Cypher

    MATCH (n:XiYou) RETURN n
    

    (此时你绝对看不到关羽)

  • 只想看三国:

    Cypher

    MATCH (n:SanGuo) RETURN n
    

    (此时你绝对看不到孙悟空)

  • 想看数据库里所有东西(大杂烩):

    Cypher

    MATCH (n) RETURN n
    

总结

不需要在 Excel 或原始数据里手动加一列叫“标签”。 你只需要在 Python 循环读取数据的时候,告诉代码:“现在读的这个列表是西游记的,请用 XiYou 标签;待会儿读那个列表,请用 SanGuo 标签”即可。


七、 总结与下一步

恭喜!你已经学会了最硬核的 Neo4j 社区版 的搭建与使用。

回顾一下流程:

  1. 下载社区版解压。

  2. 命令行 neo4j console 启动服务。

  3. 浏览器访问 localhost:7474

  4. Python 脚本批量写入数据。

下一步挑战: 现在的图谱只能“看”,还不够智能。 在下一期文章中,我将讲解 《进阶篇:如何结合 BERT 模型与 Neo4j 实现智能问答系统 (KBQA)》,教你做一个能回答“孙悟空的大嫂是谁?”的 AI 机器人。

如果你觉得这篇文章对你有帮助,欢迎点赞、收藏、关注三连!有任何安装报错,请在评论区留言!

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐