非结构化文档->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:

提示词涵盖以下方面:

  1. 概述:定义任务和目标。
  2. 节点标注:规定节点类型的一致性和基本性。
  3. 关系标注:规定关系类型的一般性和永恒性。
  4. 共指消解:实体消歧,确保实体一致性。
  5. 严格合规:要求严格遵守规则。

将纯文本文档中的信息转化为 Memgraph 图数据库中的 节点 (nodes)边 (edges),主要涉及以下几个步骤:

  1. 解析 (Parsing) / 提取 (Extraction): 从原始文档中识别并提取关键实体(将成为节点)和它们之间的关系(将成为边)。
  2. 建模 (Modeling): 定义图数据的模式(节点标签、属性,关系类型、属性)。
  3. 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
2
3
4
person_id,name,role
1,Alice,Manager
2,Bob,Developer
3,Charlie,Tester

你可以使用 LOAD CSV 配合 MERGECREATE 来创建节点:

1
2
3
4
5
6
LOAD CSV FROM 'people.csv' WITH HEADER AS row
// 确保 Memgraph 可以访问这个文件路径
// 推荐使用 MERGE,它可以确保不会重复创建已存在的节点
MERGE (p:Person {personId: row.person_id})
ON CREATE SET p.name = row.name,
p.role = row.role;
  • 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
2
3
source_id,target_id,type,since_year
1,2,WORKS_ON,2023
1,3,WORKS_ON,2024

导入关系的关键在于 先找到源节点和目标节点,然后再创建它们之间的关系:

1
2
3
4
5
6
7
8
LOAD CSV FROM 'relationships.csv' WITH HEADER AS row
// 1. 查找源节点 (Source Node)
MATCH (source:Person {personId: row.source_id})
// 2. 查找目标节点 (Target Node)
MATCH (target:Person {personId: row.target_id})
// 3. 创建关系
CREATE (source)-[r:WORKS_ON {since: toInteger(row.since_year)}]->(target);
// 注意:如果关系类型是动态的(存储在 CSV 某一列),你需要使用 APOC 或其他外部工具辅助,Cypher 标准不直接支持动态关系类型创建。
  • 重要提示: 关系类型 (:WORKS_ON) 在 CREATE 语句中是硬编码的。如果你的关系类型存储在 CSV 的 row.type 中,标准的 Cypher CREATE 语句无法直接使用变量作为关系类型。你需要确保你的关系类型是预先定义的。

✨ 总结

纯文档到图数据库的转换流程是:

  1. 人工/脚本提取: 从文档中识别 实体关系
  2. 结构化: 将提取的数据整理成 CSV/JSON 等格式。
  3. Cypher 导入: 使用 LOAD CSV 或其他导入工具,结合 MERGE/MATCH/CREATE 语句,将结构化数据导入 Memgraph。

如果你的文档非常复杂且是非结构化的(例如,自然语言文本),你可能需要使用 NLP (自然语言处理) 工具(如命名实体识别、关系抽取)来自动化 步骤一 的数据提取过程,然后再执行 步骤二 的 Cypher 导入。

你想让我提供一个关于更复杂的图模型(例如包含不同类型的节点和关系)的 Cypher 导入示例吗?