非结构化文档->memgraph提取(GraphDocument)
非结构化文档->memgraph提取(GraphDocument)
https://www.llamaindex.ai/blog/constructing-a-knowledge-graph-with-llamaindex-and-memgraph
这里用LlamaIndex可以自动做到这一点,但是缺点是需要openai的key,用不了mass的
还有一种方式使用from langchain_experimental.graph_transformers import LLMGraphTransformer,其用提示词将非结构化的Document转化为GraphDocument:
提示词涵盖以下方面:
- 概述:定义任务和目标。
- 节点标注:规定节点类型的一致性和基本性。
- 关系标注:规定关系类型的一般性和永恒性。
- 共指消解:实体消歧,确保实体一致性。
- 严格合规:要求严格遵守规则。
将纯文本文档中的信息转化为 Memgraph 图数据库中的 节点 (nodes) 和 边 (edges),主要涉及以下几个步骤:
- 解析 (Parsing) / 提取 (Extraction): 从原始文档中识别并提取关键实体(将成为节点)和它们之间的关系(将成为边)。
- 建模 (Modeling): 定义图数据的模式(节点标签、属性,关系类型、属性)。
- Cypher 语句生成 / 导入: 使用提取的数据生成 Cypher 语句,以便在 Memgraph 中创建节点和边。
下面我将重点介绍如何使用 Cypher 语句 来实现第三步,以及如何准备数据以生成这些语句。
📝 步骤一:数据准备与建模
在编写 Cypher 语句之前,你需要将文档中的信息整理成结构化的数据,并确定你的图模型。
1. 结构化数据格式
最常见、最容易生成 Cypher 语句的格式是 CSV (Comma Separated Values)。你需要至少两张表:一张用于节点,一张用于边。
| 类型 | 用途 | 示例列 (Nodes) | 示例列 (Edges) |
|---|---|---|---|
| Nodes | 描述实体(如人、地点、事件) | id, label, name, property1 |
|
| Edges | 描述实体间的关系 | source_id, target_id, relationship_type, property2 |
2. 图数据模型示例
假设你的文档是关于一个项目团队,你可以定义如下模型:
- 节点标签 (Node Labels):
:Person,:Project,:Task - 关系类型 (Relationship Types):
:WORKS_ON,:IS_MANAGER_OF,:ASSIGNED_TO
💻 步骤二:使用 Cypher 语句导入数据
一旦你的数据被结构化(例如保存在 CSV 文件中),你可以利用 Memgraph 的 LOAD CSV 语句来批量导入。
1. 导入节点 (Nodes)
假设你有一个名为 people.csv 的文件,内容如下:
1 | person_id,name,role |
你可以使用 LOAD CSV 配合 MERGE 或 CREATE 来创建节点:
1 | LOAD CSV FROM 'people.csv' WITH HEADER AS row |
WITH HEADER AS row: 表示 CSV 文件有标题行,并且可以用row.column_name访问数据。MERGE (p:Person {personId: row.person_id}): 尝试查找具有该personId的:Person节点。如果不存在,则创建它。ON CREATE SET ...: 仅在节点被创建时设置其他属性。
2. 导入边 (Edges)
假设你有一个名为 relationships.csv 的文件,内容如下:
1 | source_id,target_id,type,since_year |
导入关系的关键在于 先找到源节点和目标节点,然后再创建它们之间的关系:
1 | LOAD CSV FROM 'relationships.csv' WITH HEADER AS row |
- 重要提示: 关系类型 (
:WORKS_ON) 在CREATE语句中是硬编码的。如果你的关系类型存储在 CSV 的row.type中,标准的 CypherCREATE语句无法直接使用变量作为关系类型。你需要确保你的关系类型是预先定义的。
✨ 总结
纯文档到图数据库的转换流程是:
- 人工/脚本提取: 从文档中识别 实体 和 关系。
- 结构化: 将提取的数据整理成 CSV/JSON 等格式。
- Cypher 导入: 使用
LOAD CSV或其他导入工具,结合MERGE/MATCH/CREATE语句,将结构化数据导入 Memgraph。
如果你的文档非常复杂且是非结构化的(例如,自然语言文本),你可能需要使用 NLP (自然语言处理) 工具(如命名实体识别、关系抽取)来自动化 步骤一 的数据提取过程,然后再执行 步骤二 的 Cypher 导入。
你想让我提供一个关于更复杂的图模型(例如包含不同类型的节点和关系)的 Cypher 导入示例吗?


