使用 LLM 将白雪公主故事转换为 Neo4j 图数据
演示了如何利用大语言模型(LLM)自动从文本中提取实体与关系,并将其存储至 Neo4j 图数据库中。通过白雪公主的故事作为案例,展示了从非结构化文本到结构化图数据的转换流程,包括提示词设计、Python 脚本实现及 Cypher 查询验证,帮助读者理解知识图谱构建的基本方法。

演示了如何利用大语言模型(LLM)自动从文本中提取实体与关系,并将其存储至 Neo4j 图数据库中。通过白雪公主的故事作为案例,展示了从非结构化文本到结构化图数据的转换流程,包括提示词设计、Python 脚本实现及 Cypher 查询验证,帮助读者理解知识图谱构建的基本方法。

本文演示了如何利用大语言模型(LLM)自动从文本中提取实体与关系,并将其存储至 Neo4j 图数据库中。通过白雪公主的故事作为案例,展示了从非结构化文本到结构化图数据的转换流程,包括提示词设计、Python 脚本实现及 Cypher 查询验证。
首先,我们需要一段结构化的文本作为输入源。以下是用于本次演示的《白雪公主》故事片段:
很久很久以前,在一个遥远的王国里,有一位美丽的王后生下了一个皮肤像雪一样白皙、嘴唇像血一样鲜红的女儿。王后给她取名为'白雪公主'。不幸的是,王后不久就去世了。
国王娶了一位新王后,这位新王后非常美丽,但她的心却十分恶毒。她有一面魔镜,每天都会问:'魔镜魔镜告诉我,谁是这个世界上最美的女人?'魔镜总是回答说:'是你,我的王后。'
然而有一天,魔镜的回答变了:'王后啊,你是这城堡里最美的女人,但在森林里,白雪公主比你还要美。'新王后听后非常生气,她命令一位猎人把白雪公主带到森林里杀死,并带回她的肺和肝作为证据。
猎人把白雪公主带到了森林深处,但他不忍心杀害这么善良的女孩,于是放走了她,并带回了一只小鹿的肺和肝欺骗了王后。
白雪公主在森林里迷路了,她遇到了七个小矮人。他们住在一座小木屋里。白雪公主告诉了他们自己的遭遇,小矮人们决定保护她。他们教她如何打扫屋子、做饭,白雪公主也很快乐地和他们一起生活。
新王后得知白雪公主还活着,便三次试图用毒苹果、毒梳子和紧身衣来害死她。但每一次都被小矮人们救了下来。最后,王后自己变成了一个老妇人,带着一个毒苹果再次来到了森林里。这一次,白雪公主吃下了毒苹果,陷入了沉睡。
小矮人们非常伤心,但他们无法唤醒白雪公主。他们做了一个透明的水晶棺材,将白雪公主安放在里面,并日夜守护着她。
一天,一位英俊的王子路过森林,看到了沉睡中的白雪公主。他被她的美丽所吸引,吻醒了她。毒苹果的咒语被解除了,白雪公主醒了过来。
王子和白雪公主相爱了,他们举行了一场盛大的婚礼,并邀请了所有的朋友,包括七个小矮人。新王后也被邀请了,但她非常嫉妒,最终受到了应有的惩罚。
从此以后,白雪公主和王子过上了幸福快乐的生活。
在将文本转换为图数据之前,需要定义节点(Node)和关系(Relationship)的模式(Schema)。基于故事内容,我们可以识别出以下核心要素:
关系类型示例:
LIVES_IN: 居住于某地KILLS / SAVES: 伤害或拯救LOVES: 情感关系USES: 使用物品WORKS_FOR: 服务于某人使用大语言模型(如通义千问、本地部署的 Llama 等)可以将非结构化文本转化为 JSON 格式的图数据描述。关键在于设计合适的 Prompt。
系统提示词(System Prompt)应明确指定输出格式为 JSON,包含节点列表和关系列表。
system_prompt = """
你是一个知识图谱构建专家。请阅读提供的故事文本,提取其中的实体和关系。
输出格式必须为 JSON,包含 'nodes' 和 'relationships' 两个字段。
节点格式:{"id": "名称", "label": "类别"}
关系格式:{"start": "起始节点 ID", "end": "结束节点 ID", "type": "关系类型"}
不要输出任何解释性文字,仅输出 JSON。
"""
在实际开发中,通常使用 Python 的 requests 库或 LangChain 框架调用 LLM 接口。以下是一个简化的调用示例:
import requests
import json
def extract_graph_from_text(text, api_url):
payload = {
"model": "qwen-max",
"messages": [
{"role": "system", "content": system_prompt},
{"role": "user", "content": text}
]
}
response = requests.post(api_url, json=payload)
return response.json()
获取到 LLM 返回的结构化数据后,需要使用 Neo4j 官方驱动将其写入数据库。
确保已安装 Neo4j 驱动:
pip install neo4j
from neo4j import GraphDatabase
driver = GraphDatabase.driver("bolt://localhost:7687", auth=("neo4j", "password"))
def create_graph(tx, nodes, relationships):
# 创建节点
for node in nodes:
label = node["label"]
name = node["id"]
query = f"MERGE (n:{label} {{name: $name}}) RETURN n"
tx.run(query, name=name)
# 创建关系
for rel in relationships:
start_name = rel["start"]
end_name = rel["end"]
type_name = rel["type"]
query = f"MATCH (a), (b) WHERE a.name = $start AND b.name = $end CREATE (a)-[:{type_name}]->(b)"
tx.run(query, start=start_name, end=end_name)
with driver.session() as session:
result = extract_graph_from_text(story_text, "https://api.example.com")
data = json.loads(result["choices"][0]["message"]["content"])
session.write_transaction(create_graph, data["nodes"], data["relationships"])
数据导入完成后,可以通过 Cypher 语句进行查询和分析。
MATCH (n) RETURN n LIMIT 10
MATCH (n:Person) RETURN n
MATCH p=()-[]->() RETURN p
MATCH (w:Person {name: "新王后"})-[r:ATTACKS|HURTS]->(v:Person)
RETURN w, r, v
通过在线与离线 LLM 大模型将文章转换为图,以一个耳熟能详的方式对图数据有一个初步体验。这种方法不仅适用于童话故事,也可以应用于新闻分析、法律文档处理等场景。
此方案展示了如何将自然语言处理技术与图数据库结合,构建轻量级的知识图谱应用。开发者可根据实际需求扩展实体类型,增加属性信息,并接入前端可视化工具(如 Neo4j Bloom)进行交互展示。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online