使用 LLM 将白雪公主故事转换为 Neo4j 图数据
本文演示了如何利用大语言模型(LLM)自动从文本中提取实体与关系,并将其存储至 Neo4j 图数据库中。通过白雪公主的故事作为案例,展示了从非结构化文本到结构化图数据的转换流程,包括提示词设计、Python 脚本实现及 Cypher 查询验证。
1. 故事原文数据准备
首先,我们需要一段结构化的文本作为输入源。以下是用于本次演示的《白雪公主》故事片段:
很久很久以前,在一个遥远的王国里,有一位美丽的王后生下了一个皮肤像雪一样白皙、嘴唇像血一样鲜红的女儿。王后给她取名为'白雪公主'。不幸的是,王后不久就去世了。
国王娶了一位新王后,这位新王后非常美丽,但她的心却十分恶毒。她有一面魔镜,每天都会问:'魔镜魔镜告诉我,谁是这个世界上最美的女人?'魔镜总是回答说:'是你,我的王后。'
然而有一天,魔镜的回答变了:'王后啊,你是这城堡里最美的女人,但在森林里,白雪公主比你还要美。'新王后听后非常生气,她命令一位猎人把白雪公主带到森林里杀死,并带回她的肺和肝作为证据。
猎人把白雪公主带到了森林深处,但他不忍心杀害这么善良的女孩,于是放走了她,并带回了一只小鹿的肺和肝欺骗了王后。
白雪公主在森林里迷路了,她遇到了七个小矮人。他们住在一座小木屋里。白雪公主告诉了他们自己的遭遇,小矮人们决定保护她。他们教她如何打扫屋子、做饭,白雪公主也很快乐地和他们一起生活。
新王后得知白雪公主还活着,便三次试图用毒苹果、毒梳子和紧身衣来害死她。但每一次都被小矮人们救了下来。最后,王后自己变成了一个老妇人,带着一个毒苹果再次来到了森林里。这一次,白雪公主吃下了毒苹果,陷入了沉睡。
小矮人们非常伤心,但他们无法唤醒白雪公主。他们做了一个透明的水晶棺材,将白雪公主安放在里面,并日夜守护着她。
一天,一位英俊的王子路过森林,看到了沉睡中的白雪公主。他被她的美丽所吸引,吻醒了她。毒苹果的咒语被解除了,白雪公主醒了过来。
王子和白雪公主相爱了,他们举行了一场盛大的婚礼,并邀请了所有的朋友,包括七个小矮人。新王后也被邀请了,但她非常嫉妒,最终受到了应有的惩罚。
从此以后,白雪公主和王子过上了幸福快乐的生活。
2. 知识图谱模式设计
在将文本转换为图数据之前,需要定义节点(Node)和关系(Relationship)的模式(Schema)。基于故事内容,我们可以识别出以下核心要素:
- Person (人物): 如白雪公主、国王、猎人、小矮人、王子等。
- Location (地点): 如王国、森林、小木屋、城堡等。
- Duration (持续时间/事件): 如婚礼、沉睡、结婚等。
- Object (物品): 如魔镜、毒苹果、水晶棺材等。
关系类型示例:
LIVES_IN: 居住于某地KILLS/SAVES: 伤害或拯救LOVES: 情感关系USES: 使用物品WORKS_FOR: 服务于某人
3. 利用 LLM 进行实体抽取
使用大语言模型(如通义千问、本地部署的 Llama 等)可以将非结构化文本转化为 JSON 格式的图数据描述。关键在于设计合适的 Prompt。
3.1 提示词设计
系统提示词(System Prompt)应明确指定输出格式为 JSON,包含节点列表和关系列表。
system_prompt = """
你是一个知识图谱构建专家。请阅读提供的故事文本,提取其中的实体和关系。
输出格式必须为 JSON,包含 'nodes' 和 'relationships' 两个字段。
节点格式:{"id": "名称", "label": "类别"}
关系格式:{"start": "起始节点 ID", "end": "结束节点 ID", "type": "关系类型"}
不要输出任何解释性文字,仅输出 JSON。
"""
3.2 调用 LLM API
在实际开发中,通常使用 Python 的 requests 库或 LangChain 框架调用 LLM 接口。以下是一个简化的调用示例:
import requests
import json
():
payload = {
: ,
: [
{: , : system_prompt},
{: , : text}
]
}
response = requests.post(api_url, json=payload)
response.json()


