一、准备 CSV 数据
先把《我是刑警》的人物关系数据集准备好。原文件如果不是 UTF-8,后面读入时很容易直接报错,所以这里先用记事本打开,再另存为 UTF-8。




二、先把 Neo4j 跑起来
创建一个新的 Neo4j 数据库,数据库名和密码按自己的习惯填就行。启动之后先看一下库里是不是空的,确认环境没有被别的数据污染。
match(n) return n;






三、在 Python 里建项目并装依赖
项目本身没什么特别的,重点是把依赖先补齐。这里用到的是 neo4j-python-driver、pandas 和 py2neo。如果你已经装过,可以跳过。
打开 PyCharm 后,先检查解释器里有没有这些包;没有就直接在 Terminal 里装:
pip install neo4j-python-driver pandas py2neo






四、把 CSV 读进来,再写入 Neo4j
先做连接测试,密码换成你自己创建数据库时设置的那个。这里我更倾向于先确认连接成功,再去折腾读取和导入,不然排错会绕远路。

接着把 CSV 读入 DataFrame。路径需要改成你本地文件的地址,其它地方基本不用动。

读完以后先处理一下数据结构,把人物、关系、关系人物整理成一个三元组列表,后面建关系会省事很多。

# 初始化一个空列表来存储所有的元组
tuple_total = []
# 迭代 DataFrame 的每一行
for index, row in invoice_data.iterrows():
ties_total = [row['人物'], row['关系'], row['关系人物']]
# 将所有元组添加到结果列表中
tuple_total.extend([ties_total])
print(tuple_total)
先建节点,再建关系。节点部分比较直白,遍历人物列表,逐个创建 人物 标签的节点。
# 把节点导入 neo4j 中
def create_node(people):
for name in people:
node_1 = Node('人物', name=name)
graph.create(node_1)
create_node(people)





关系导入时,先根据人物名字把两个节点都查出来,再创建关系。这里用的是 NodeMatcher,思路不复杂,但前提是节点已经成功写进库里。
matcher = NodeMatcher(graph)
# 导入关系
for i in range(0, len(tuple_total)):
name_1 = matcher.match('人物', name=tuple_total[i][0]).first()
name_2 = matcher.match('人物', name=tuple_total[i][2]).first()
rel = tuple_total[i][1]
relationship = Relationship(name_1, rel, name_2)
graph.create(relationship)

导入完成后回到 Neo4j 看图谱,节点和关系都能正常显示就算通了。


五、遇到的报错
导入时最常见的问题还是编码。比如这个错误:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc8 in position 0: invalid continuation byte

原因很直接:CSV 不是 UTF-8 编码。回头把文件按 UTF-8 重新保存,再按前面的步骤读入就行。这个坑不大,但挺烦,尤其是你已经把 Neo4j 和 Python 都跑通了,最后卡在文件编码上。



