知识图谱实战(二):Neo4j 构建与导入(完整代码)

知识图谱实战(二):Neo4j 构建与导入(完整代码)

《知识图谱(一)数据采集》产出了三元组 CSV,这篇把它变成真正的"图":安装 Neo4j 图数据库、用 Cypher 建节点和关系、把 triples.csv 批量导入、浏览器里可视化。照做就能看到一张能查询的知识图谱。

前言

三元组(华为 - 创始人 - 任正非)存在 Excel 里只是表格,存进图数据库才是知识图谱。图数据库专门为"实体+关系"设计:查询"和华为直接相关的所有实体""任正非和贵州有什么关系"这类问题,一条 Cypher 就出来,比关系型数据库 JOIN 快得多、直观得多。

Neo4j 是使用最广的开源图数据库,这篇从安装到导入到可视化全走一遍。

在这里插入图片描述

一、Neo4j 是什么(先建立概念)

概念 图数据库 关系型数据库(MySQL)
存储 节点(实体)+ 关系(边) 表 + 行
查询 Cypher(MATCH 模式匹配) SQL(JOIN)
擅长 关系密集型查询(人脉、供应链、图谱) 事务、报表
适合 知识图谱、社交网络、推荐 订单、账务

图数据三要素:节点(Node)、关系(Relationship)、属性(Property)。关系有方向(华为 → 创始人 → 任正非),这是图的核心。

在这里插入图片描述

二、安装与启动(两种方式)

方式一:Docker(推荐,一条命令)

:: 需先装 Docker Desktop(见 《Docker 容器化实战》)
docker run -d --name neo4j -p 7474:7474 -p 7687:7687 ^
  -e NEO4J_AUTH=neo4j/12345678 neo4j:5

方式二:Windows 直接运行

  1. Neo4j 官网下载 Community 版 zip,解压到 D:\neo4j(路径别带中文);
  2. 管理员终端进入 D:\neo4j\bin,执行 neo4j.bat console 启动;
  3. 首次启动后浏览器打开 http://localhost:7474,默认账号 neo4j,首次登录必须改密码。

启动成功的标志:浏览器能打开 Neo4j Browser(可以执行 Cypher 的界面)。端口说明:7474 是浏览器界面,7687 是程序连接(bolt)端口。

三、Cypher 手动建图(先理解语法)

在 Neo4j Browser 的输入框逐条执行:

// 1. 建两个节点(MERGE:不存在才建,重复执行不报错)
MERGE (h:Company {name: '华为'}) ON CREATE SET h.founded = '1987';
MERGE (r:Person {name: '任正非'}) ON CREATE SET r.born = '贵州';

// 2. 建关系(方向:华为 → 任正非)
MATCH (h:Company {name: '华为'}), (r:Person {name: '任正非'})
CREATE (h)-[:FOUNDER {since: '1987'}]->(r);

// 3. 查询:和华为有关系的所有实体
MATCH (h:Company {name: '华为'})-[rel]-(n) RETURN h, rel, n;

CREATE 无条件新建(会重复);MERGE 去重(推荐)。第三条查询执行后,浏览器右侧会出现可视化图谱:两个圆点一条箭头。

四、批量导入三元组(完整代码)

用 Python 驱动把 《知识图谱(一)数据采集》生成的 triples.csv 批量导入:

pip install neo4j
# import_kg.py — 读取 triples.csv 批量导入 Neo4j(完整可运行)
from neo4j import GraphDatabase
import csv

URI = "bolt://localhost:7687"
AUTH = ("neo4j", "12345678")      # 改成你设置的密码

driver = GraphDatabase.driver(URI, auth=AUTH)

def import_triple(tx, head, rel, tail):
    # 节点不存在则建、存在则复用;关系同理(MERGE 全去重)
    tx.run(
        "MERGE (h:Entity {name: $head}) "
        "MERGE (t:Entity {name: $tail}) "
        "MERGE (h)-[r:REL {type: $rel}]->(t)",
        head=head, tail=tail, rel=rel,
    )

with driver.session() as session:
    with open("triples.csv", encoding="utf-8-sig") as f:
        reader = csv.DictReader(f)
        count = 0
        for row in reader:
            session.execute_write(import_triple,
                                  row["head"], row["relation"], row["tail"])
            count += 1
            print("导入:", row["head"], "-", row["relation"], "-", row["tail"])
    print(f"共导入 {count} 条三元组")

driver.close()
print("完成!打开 http://localhost:7474 查看图谱")

运行验证:python import_kg.py,期望逐条打印"导入: ...",结束时提示完成;浏览器 Neo4j Browser 里执行 MATCH (n) RETURN n LIMIT 50,能看到节点和连线组成的图谱——这就是你采集数据构建出来的知识图谱。

五、可视化与基础查询

Neo4j Browser 自带可视化,常用验证查询:

// 全部实体和关系(数据多时加 LIMIT)
MATCH (n)-[r]->(m) RETURN n, r, m LIMIT 100;

// 只看某个实体的邻居
MATCH (n {name: '华为'})-[r]-(m) RETURN n, r, m;

图谱一眼能看出:哪些实体是"枢纽"(连接的边多),哪些关系类型最多——论文/汇报里截图就是很好的配图。

六、常见坑

坑 解决
浏览器打不开 7474 Docker 方式确认容器在跑(docker ps);zip 方式确认 neo4j.bat console 窗口没关
登录被拒 首次登录必须改默认密码;Docker 方式密码在 NEO4J_AUTH 里定义
导入报认证错 AUTH 里的密码要和浏览器登录的一致
节点重复建 用 MERGE 别用 CREATE;实体名做归一化(《知识图谱(一)数据采集》)
关系方向反了 三元组顺序 (head→tail) 与 Cypher -> 方向对应,导入代码里已固定

七、总结

  • 一句话:Neo4j 把三元组变成节点和关系,浏览器就能看到、Cypher 就能查;
  • 到这一步,"采集 → 构建"已完成,下一篇《知识图谱(三):图查询调用与 GraphRAG》讲怎么把图谱用起来(API 调用 + 和 LLM 结合);
  • 接单角度:企业图谱项目(人事/供应链/文档)都落在"Neo4j 建图 + 查询"上,这篇就是建图的标准流程。

觉得有用点个赞收藏,下一篇见。

posted @ 2026-08-12 00:54  橘和柠  阅读(18)  评论(0)    收藏  举报