从文章里抽实体人、公司、地点、产品、时间…抽实体之间的关系A 工作于 B、C 位于 D、E 认识 F…生成节点 关系Node Relationship批量写入 Neo4jCREATE / MERGE最终在 Neo4j 里形成一张知识图谱RAG 检索时就可以沿着关系查上下文。我们用一段超短新闻做演示张三在2023年加入了字节跳动担任算法工程师。 李四是张三的同事他们都在北京工作。以上的超短新闻要想配合入图数据库首先是需要抽象出以下信息。实体Nodes张三 (Person)李四 (Person)字节跳动 (Company)北京 (Location)关系Relationships张三 ——WORKS_AT—— 字节跳动张三 ——COLLEAGUE_OF—— 李四张三 ——WORKS_IN—— 北京李四 ——WORKS_IN—— 北京属性张三ageNone, job算法工程师, join_year2023实体关系属性信息都确认了之后就可以通过以下语句入库了。// 创建节点 MERGE (p1:Person {name:张三}) SET p1.job算法工程师, p1.join_year2023 MERGE (p2:Person {name:李四}) MERGE (c:Company {name:字节跳动}) MERGE (l:Location {name:北京}) // 创建关系 MERGE (p1)-[:WORKS_AT]-(c) MERGE (p1)-[:COLLEAGUE_OF]-(p2) MERGE (p1)-[:WORKS_IN]-(l) MERGE (p2)-[:WORKS_IN]-(l)为什么用 MERGE 不用 CREATECREATE重复执行会重复创建节点MERGE不存在则创建存在则更新 →Graph RAG 标准写法那么如何把文章里的信息是如何抽象出的实体和关系呢直接说过程文章不是人工转的是 LLM 自动转的下面是真实工程化流程首先给大模型的提示词你是知识图谱抽取专家。请从文本中抽取 1. 实体类型Person, Company, Location, Organization 2. 关系只能用WORKS_AT, COLLEAGUE_OF, WORKS_IN, FOUNDER_OF 输出格式严格JSON { nodes: [{label:Person, name:张三, attributes:{job:算法工程师}}], relations: [{from:张三, to:字节跳动, type:WORKS_AT}] } 文本 张三在2023年加入了字节跳动担任算法工程师。李四是张三的同事他们都在北京工作。以上提示词可以放在任何工具里测试包括龙虾豆包等。实体和关系总结出来了可以看到结果如下{ nodes: [ {label:Person,name:张三,attributes:{job:算法工程师,join_year:2023}}, {label:Person,name:李四,attributes:{}}, {label:Company,name:字节跳动,attributes:{}}, {label:Location,name:北京,attributes:{}} ], relations: [ {from:张三,to:字节跳动,type:WORKS_AT}, {from:张三,to:李四,type:COLLEAGUE_OF}, {from:张三,to:北京,type:WORKS_IN}, {from:李四,to:北京,type:WORKS_IN} ] }注如果模型是在线API那么基本上都能按照要求做出指定的输出如果是本地部署的模型参数量比较低的话输出可能会走样。最后通过python代码自动把 JSON 转成 Cypher 写入 Neo4jfrom neo4j import GraphDatabase # 连接 Neo4j uri bolt://localhost:7687 user neo4j password your-password driver GraphDatabase.driver(uri, auth(user, password)) # 从LLM拿到的知识图谱数据 data { ...上面的JSON... } # 写入节点 for node in data[nodes]: if node[attributes]: attrs , .join([f{k}: {v} for k, v in node[attributes].items()]) cypher fMERGE (n:{node[label]} {{name:{node[name]}, {attrs}}}) else: cypher fMERGE (n:{node[label]} {{name:{node[name]}}}) driver.session().run(cypher) # 写入关系 for rel in data[relations]: cypher f MATCH (a {{name:{rel[from]}}}), (b {{name:{rel[to]}}}) MERGE (a)-[:{rel[type]}]-(b) driver.session().run(cypher)✅运行完一篇文章就变成知识图谱了最终效果Neo4j 里看到的图你会看到张三、李四、字节跳动、北京它们之间用箭头连起来Graph RAG 检索时就能沿着关系推理最后再说一种更简单粗暴的方法跳过大模型生成JSON和python的JSON遍历直接让大模型生成语句。
一篇文章如何入库的
发布时间:2026/6/25 14:07:04
从文章里抽实体人、公司、地点、产品、时间…抽实体之间的关系A 工作于 B、C 位于 D、E 认识 F…生成节点 关系Node Relationship批量写入 Neo4jCREATE / MERGE最终在 Neo4j 里形成一张知识图谱RAG 检索时就可以沿着关系查上下文。我们用一段超短新闻做演示张三在2023年加入了字节跳动担任算法工程师。 李四是张三的同事他们都在北京工作。以上的超短新闻要想配合入图数据库首先是需要抽象出以下信息。实体Nodes张三 (Person)李四 (Person)字节跳动 (Company)北京 (Location)关系Relationships张三 ——WORKS_AT—— 字节跳动张三 ——COLLEAGUE_OF—— 李四张三 ——WORKS_IN—— 北京李四 ——WORKS_IN—— 北京属性张三ageNone, job算法工程师, join_year2023实体关系属性信息都确认了之后就可以通过以下语句入库了。// 创建节点 MERGE (p1:Person {name:张三}) SET p1.job算法工程师, p1.join_year2023 MERGE (p2:Person {name:李四}) MERGE (c:Company {name:字节跳动}) MERGE (l:Location {name:北京}) // 创建关系 MERGE (p1)-[:WORKS_AT]-(c) MERGE (p1)-[:COLLEAGUE_OF]-(p2) MERGE (p1)-[:WORKS_IN]-(l) MERGE (p2)-[:WORKS_IN]-(l)为什么用 MERGE 不用 CREATECREATE重复执行会重复创建节点MERGE不存在则创建存在则更新 →Graph RAG 标准写法那么如何把文章里的信息是如何抽象出的实体和关系呢直接说过程文章不是人工转的是 LLM 自动转的下面是真实工程化流程首先给大模型的提示词你是知识图谱抽取专家。请从文本中抽取 1. 实体类型Person, Company, Location, Organization 2. 关系只能用WORKS_AT, COLLEAGUE_OF, WORKS_IN, FOUNDER_OF 输出格式严格JSON { nodes: [{label:Person, name:张三, attributes:{job:算法工程师}}], relations: [{from:张三, to:字节跳动, type:WORKS_AT}] } 文本 张三在2023年加入了字节跳动担任算法工程师。李四是张三的同事他们都在北京工作。以上提示词可以放在任何工具里测试包括龙虾豆包等。实体和关系总结出来了可以看到结果如下{ nodes: [ {label:Person,name:张三,attributes:{job:算法工程师,join_year:2023}}, {label:Person,name:李四,attributes:{}}, {label:Company,name:字节跳动,attributes:{}}, {label:Location,name:北京,attributes:{}} ], relations: [ {from:张三,to:字节跳动,type:WORKS_AT}, {from:张三,to:李四,type:COLLEAGUE_OF}, {from:张三,to:北京,type:WORKS_IN}, {from:李四,to:北京,type:WORKS_IN} ] }注如果模型是在线API那么基本上都能按照要求做出指定的输出如果是本地部署的模型参数量比较低的话输出可能会走样。最后通过python代码自动把 JSON 转成 Cypher 写入 Neo4jfrom neo4j import GraphDatabase # 连接 Neo4j uri bolt://localhost:7687 user neo4j password your-password driver GraphDatabase.driver(uri, auth(user, password)) # 从LLM拿到的知识图谱数据 data { ...上面的JSON... } # 写入节点 for node in data[nodes]: if node[attributes]: attrs , .join([f{k}: {v} for k, v in node[attributes].items()]) cypher fMERGE (n:{node[label]} {{name:{node[name]}, {attrs}}}) else: cypher fMERGE (n:{node[label]} {{name:{node[name]}}}) driver.session().run(cypher) # 写入关系 for rel in data[relations]: cypher f MATCH (a {{name:{rel[from]}}}), (b {{name:{rel[to]}}}) MERGE (a)-[:{rel[type]}]-(b) driver.session().run(cypher)✅运行完一篇文章就变成知识图谱了最终效果Neo4j 里看到的图你会看到张三、李四、字节跳动、北京它们之间用箭头连起来Graph RAG 检索时就能沿着关系推理最后再说一种更简单粗暴的方法跳过大模型生成JSON和python的JSON遍历直接让大模型生成语句。