一、LangChain 操作 Neo4j
1、课程目标
- 理解 Neo4j 图数据库的节点、关系、属性模型
- 掌握 LangChain 1.1.0 中连接 Neo4j 的基本方式
- 使用
Neo4jGraph执行 Cypher 增删改查 - 使用大语言模型将自然语言转换为 Cypher 查询
- 使用
GraphCypherQAChain实现 Neo4j 图数据库问答 - 了解 Neo4j 向量检索
Neo4jVector的基本使用场景 - 能够完成“图数据库 + 大模型问答”的基础项目案例
2、课程背景
2.1 为什么大模型要结合 Neo4j
-
大语言模型擅长理解自然语言,但它本身并不直接保存业务系统中的实时结构化数据
-
Neo4j 图数据库擅长表达实体之间的关系,例如:
马云 -> 创立 -> 阿里巴巴
阿里巴巴 -> 所属行业 -> 电子商务
阿里巴巴 -> 创立时间 -> 1999 年
- 将 LangChain 与 Neo4j 结合后,可以实现:
用户自然语言问题
↓
大模型理解问题
↓
生成 Cypher 查询语句
↓
查询 Neo4j 图数据库
↓
根据查询结果生成自然语言回答
2.2 典型应用场景
| 场景 | 说明 |
|---|---|
| 企业知识图谱问答 | 查询公司、人员、产品、项目之间的关系 |
| 金融风控分析 | 查询账户、交易、设备、风险事件之间的关联 |
| 医疗知识问答 | 查询疾病、症状、药品、治疗方案之间的关系 |
| 推荐系统 | 根据用户、商品、行为关系进行推荐 |
| 智能客服 | 基于业务知识图谱回答用户问题 |
| RAG 知识库 | 将文本向量和图结构同时存入 Neo4j |
3、版本说明与环境准备
3.1 版本说明
- 本课使用的 LangChain 版本为:
langchain == 1.1.0
- Neo4j 相关集成在 LangChain 1.1.0 中推荐使用独立包:
langchain-neo4j
- 常用导入方式:
from langchain_neo4j import Neo4jGraph, GraphCypherQAChain, Neo4jVector
3.2 安装依赖
pip install langchain==1.1.0 -i https://repo.huaweicloud.com/repository/pypi/simple/
pip install langchain-neo4j -i https://repo.huaweicloud.com/repository/pypi/simple/
pip install neo4j -i https://repo.huaweicloud.com/repository/pypi/simple/
pip install langchain-openai -i https://repo.huaweicloud.com/repository/pypi/simple/
pip install python-dotenv -i https://repo.huaweicloud.com/repository/pypi/simple/
- 如果后续要做文本切分和向量存储,可以继续安装:
pip install langchain-text-splitters -i https://repo.huaweicloud.com/repository/pypi/simple/
3.3 Neo4j 启动要求
- 请确保 Neo4j 数据库已经启动,并确认以下信息:
| 配置项 | 示例 |
|---|---|
| Bolt 地址 | bolt://127.0.0.1:7687 |
| 用户名 | neo4j |
| 密码 | rootroot |
| 数据库名 | neo4j |
- 可以先在 Neo4j Browser 中测试连接是否正常
4、配置环境变量
- 在项目根目录创建
.env文件或者在环境变量中配置:
DASHSCOPE_API_KEY=你的阿里云百炼或 DashScope API Key
NEO4J_URL=bolt://127.0.0.1:7687
NEO4J_USERNAME=neo4j
NEO4J_PASSWORD=rootroot
NEO4J_DATABASE=neo4j
-
说明:
-
DASHSCOPE_API_KEY用于调用通义千问模型 -
NEO4J_URL是 Neo4j 的 Bolt 连接地址 -
NEO4J_USERNAME和NEO4J_PASSWORD是数据库账号密码 -
NEO4J_DATABASE是数据库名称
-
5、小结
- 学习的时候可以创建一个单独的数据库,比如 test
- 环境版本非常重要,发生冲突解决起来就很麻烦
- 现在不是逐行代码都需要个人实现,合理利用 AI 提高效率
6、连接 Neo4j 数据库
- 操作的库选择 neo4j,Neo4j 安装后自带的库
6.1 Neo4jGraph 介绍
-
Neo4jGraph是langchain-neo4j提供的图数据库连接类,主要作用是:-
连接 Neo4j 数据库
-
执行 Cypher 查询语句
-
获取图数据库结构信息
-
为
GraphCypherQAChain提供图数据库对象
-
6.2 封装连接工具类
- 文件:
Neo4jUtil.py
import os
from dotenv import load_dotenv
from langchain_neo4j import Neo4jGraph
load_dotenv()
def connect_to_neo4j():
return Neo4jGraph(
url=os.getenv("NEO4J_URL", "bolt://127.0.0.1:7687"),
username=os.getenv("NEO4J_USERNAME", "neo4j"),
password=os.getenv("NEO4J_PASSWORD", "rootroot"),
database=os.getenv("NEO4J_DATABASE", "neo4j"),
)
6.3 测试数据库连接
from Neo4jUtil import connect_to_neo4j
graph = connect_to_neo4j()
result = graph.query("RETURN 'Neo4j 连接成功' AS message")
print(result)
- 运行结果示例:
[{'message': 'Neo4j 连接成功'}]
7、使用 LangChain 执行 Cypher 增删改查
7.1 清空数据库
- 开发练习时,如果需要删除所有节点和关系,可以执行:
from Neo4jUtil import connect_to_neo4j
graph = connect_to_neo4j()
graph.query("MATCH (n) DETACH DELETE n")
print("数据库已清空")
- 对应 Cypher:
MATCH (n)
DETACH DELETE n;
-
说明:
-
MATCH (n)匹配所有节点 -
DETACH DELETE n删除节点,同时删除相关关系 -
节点属性和关系属性会随节点、关系一起删除
-
7.2 新增节点
from Neo4jUtil import connect_to_neo4j
graph = connect_to_neo4j()
cypher = """
CREATE (a:Person {name: $name1, age: $age1}),
(b:Person {name: $name2, age: $age2}),
(c:Person {name: $name3, age: $age3})
"""
params = {
"name1": "Alice", "age1": 25,
"name2": "Bob", "age2": 30,
"name3": "Charlie", "age3": 35,
}
graph.query(cypher, params)
print("节点创建成功")
-
知识点:
-
CREATE用于创建新节点 -
:Person是节点标签 -
{name: $name1, age: $age1}是节点属性 -
$name1是参数占位符,可以防止字符串拼接导致的 Cypher 注入风险
-
7.3 查询节点
from Neo4jUtil import connect_to_neo4j
graph = connect_to_neo4j()
cypher = """
MATCH (n:Person)
RETURN n.name AS name, n.age AS age
"""
result = graph.query(cypher)
print(result)
- 返回结果示例:
[
{'name': 'Alice', 'age': 25},
{'name': 'Bob', 'age': 30},
{'name': 'Charlie', 'age': 35}
]
7.4 修改节点属性
from Neo4jUtil import connect_to_neo4j
graph = connect_to_neo4j()
cypher = """
MATCH (n:Person {name: $name})
SET n.age = $age
RETURN n.name AS name, n.age AS age
"""
result = graph.query(cypher, {"name": "Alice", "age": 30})
print(result)
- 对应 Cypher:
MATCH (n:Person {name: 'Alice'})
SET n.age = 30
RETURN n;
7.5 删除节点
- 如果节点没有关系,可以直接删除:
from Neo4jUtil import connect_to_neo4j
graph = connect_to_neo4j()
cypher = """
MATCH (n:Person {name: $name})
DELETE n
"""
graph.query(cypher, {"name": "Alice"})
print("节点删除成功")
- 如果节点存在关系,需要使用:
cypher = """
MATCH (n:Person {name: $name})
DETACH DELETE n
"""
- 区别:
| 命令 | 说明 |
|---|---|
DELETE n |
只能删除没有关系的节点 |
DETACH DELETE n |
删除节点,并删除与它相关的关系 |
7.6 批量新增节点
from Neo4jUtil import connect_to_neo4j
graph = connect_to_neo4j()
cypher = """
UNWIND $people AS person
CREATE (:Person {name: person.name, age: person.age, city: person.city})
"""
params = {
"people": [
{"name": "Alice", "age": 25, "city": "北京"},
{"name": "Bob", "age": 30, "city": "上海"},
{"name": "Charlie", "age": 35, "city": "深圳"},
]
}
graph.query(cypher, params)
print("批量创建成功")
UNWIND的作用是把列表展开成多行数据,适合批量写入
7.7 创建关系
from Neo4jUtil import connect_to_neo4j
graph = connect_to_neo4j()
cypher = """
MATCH (a:Person {name: $name1}), (b:Person {name: $name2})
CREATE (a)-[:KNOWS {since: $since}]->(b)
"""
params = {
"name1": "Alice",
"name2": "Bob",
"since": 2020,
}
graph.query(cypher, params)
print("关系创建成功")
- 关系结构:
(Alice)-[:KNOWS {since: 2020}]->(Bob)
7.8 查询关系
from Neo4jUtil import connect_to_neo4j
graph = connect_to_neo4j()
cypher = """
MATCH (a:Person)-[r:KNOWS]->(b:Person)
RETURN a.name AS start, type(r) AS relation, r.since AS since, b.name AS end
"""
result = graph.query(cypher)
print(result)
8、准备图谱问答示例数据
8.1 数据模型设计
- 本案例使用两类节点:
| 节点标签 | 属性 |
|---|---|
Person |
name, age, occupation, city |
Company |
name, industry, founded, city |
- 使用三类关系:
| 关系类型 | 含义 | 属性 |
|---|---|---|
FOUNDED |
创立 | role |
WORKS_AT |
任职于 | role |
FRIENDS_WITH |
朋友关系 | since |
8.2 初始化数据
from Neo4jUtil import connect_to_neo4j
graph = connect_to_neo4j()
statements = [
"MATCH (n) DETACH DELETE n",
"CREATE (:Person {name: '马云', age: 58, occupation: '企业家', city: '杭州'})",
"CREATE (:Person {name: '马化腾', age: 51, occupation: 'CEO', city: '深圳'})",
"CREATE (:Person {name: '李彦宏', age: 54, occupation: 'CEO', city: '北京'})",
"CREATE (:Person {name: '刘强东', age: 49, occupation: '企业家', city: '北京'})",
"CREATE (:Company {name: '阿里巴巴', industry: '电子商务', founded: 1999, city: '杭州'})",
"CREATE (:Company {name: '腾讯', industry: '互联网', founded: 1998, city: '深圳'})",
"CREATE (:Company {name: '百度', industry: '搜索引擎', founded: 2000, city: '北京'})",
"CREATE (:Company {name: '京东', industry: '电子商务', founded: 1998, city: '北京'})",
"MATCH (p:Person {name: '马云'}), (c:Company {name: '阿里巴巴'}) CREATE (p)-[:FOUNDED {role: '创始人'}]->(c)",
"MATCH (p:Person {name: '马化腾'}), (c:Company {name: '腾讯'}) CREATE (p)-[:FOUNDED {role: '创始人兼CEO'}]->(c)",
"MATCH (p:Person {name: '李彦宏'}), (c:Company {name: '百度'}) CREATE (p)-[:FOUNDED {role: '创始人兼CEO'}]->(c)",
"MATCH (p:Person {name: '刘强东'}), (c:Company {name: '京东'}) CREATE (p)-[:FOUNDED {role: '创始人'}]->(c)",
"MATCH (p:Person {name: '马云'}), (c:Company {name: '阿里巴巴'}) CREATE (p)-[:WORKS_AT {role: '前董事局主席'}]->(c)",
"MATCH (p:Person {name: '马化腾'}), (c:Company {name: '腾讯'}) CREATE (p)-[:WORKS_AT {role: '董事会主席兼CEO'}]->(c)",
"MATCH (p:Person {name: '李彦宏'}), (c:Company {name: '百度'}) CREATE (p)-[:WORKS_AT {role: '董事长兼CEO'}]->(c)",
"MATCH (p:Person {name: '刘强东'}), (c:Company {name: '京东'}) CREATE (p)-[:WORKS_AT {role: '董事局主席'}]->(c)",
"MATCH (p1:Person {name: '马云'}), (p2:Person {name: '马化腾'}) CREATE (p1)-[:FRIENDS_WITH {since: 2010}]->(p2)",
"MATCH (p1:Person {name: '李彦宏'}), (p2:Person {name: '刘强东'}) CREATE (p1)-[:FRIENDS_WITH {since: 2015}]->(p2)",
]
for statement in statements:
graph.query(statement)
print("图谱示例数据初始化成功")
8.3 验证数据
- 在 neo4j-desktop 中看
MATCH (n)
RETURN labels(n) AS labels, n.name AS name
LIMIT 20;

MATCH (a)-[r]->(b)
RETURN a.name AS start, type(r) AS relation, b.name AS end
LIMIT 20;

9、LangChain 调用通义千问模型
9.1 为什么使用 ChatOpenAI
- 通义千问 DashScope 提供 OpenAI 兼容接口,所以可以通过
langchain_openai.ChatOpenAI调用。
9.2 测试大模型调用
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
load_dotenv()
llm = ChatOpenAI(
model="qwen3.6-35b-a3b",
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
response = llm.invoke("请用一句话介绍 Neo4j 图数据库")
print(response.content)
9.3 常见参数说明
| 参数 | 说明 |
|---|---|
model |
使用的模型名称,例如 qwen3.6-35b-a3b |
api_key |
API Key,建议从环境变量读取 |
base_url |
OpenAI 兼容接口地址 |
temperature |
控制随机性,越低越稳定 |
max_tokens |
限制最大输出长度 |
10、自然语言转 Cypher 的核心思想
10.1 工作流程
问题:马云创立了哪家公司?
↓
LLM 生成 Cypher:
MATCH (p:Person {name: '马云'})-[:FOUNDED]->(c:Company)
RETURN c.name
↓
Neo4j 执行查询
↓
返回结果:阿里巴巴
↓
LLM 总结答案:马云创立了阿里巴巴。
10.2 提示词的重要性
-
大模型生成 Cypher 时必须知道数据库结构,否则容易生成不存在的标签、属性或关系
-
例如,数据库中是:
Person.name
Company.name
FOUNDED
WORKS_AT
- 如果提示词不清楚,模型可能生成:
MATCH (p:User {name: '马云'})-[:CREATE]->(c:Enterprise)
RETURN c.name
- 这条语句就无法正确查询,因为标签和关系类型不存在
11、使用 GraphCypherQAChain 实现图数据库问答
11.1 GraphCypherQAChain 介绍
-
GraphCypherQAChain是 LangChain 与 Neo4j 结合的核心链,主要功能是:- 接收用户自然语言问题
- 根据图数据库结构生成 Cypher
- 执行 Cypher 查询 Neo4j
- 根据查询结果生成自然语言回答
-
导入方式:
from langchain_neo4j import GraphCypherQAChain
11.2 安全说明
-
GraphCypherQAChain可以让大模型生成并执行 Cypher,因此存在潜在风险 -
例如模型可能生成:
MATCH (n) DETACH DELETE n
-
所以生产环境中建议:
-
使用只读数据库账号
-
不要给问答链使用管理员账号
-
限制可访问的数据库
-
记录生成的 Cypher 日志
-
审核涉及删除、修改、创建的语句
-
-
在 LangChain 中,需要显式设置:
allow_dangerous_requests=True
- 这表示开发者知道该链会执行数据库查询,并愿意承担相应风险
11.3 自定义 Cypher 生成提示词
from langchain_core.prompts import PromptTemplate
CYPHER_GENERATION_TEMPLATE = """
任务:根据用户问题生成 Neo4j Cypher 查询语句。
数据库结构:
{schema}
要求:
1. 只能使用数据库结构中出现的节点标签、关系类型和属性。
2. 只生成 MATCH 查询语句。
3. 不要生成 DELETE、CREATE、MERGE、SET、REMOVE 等写入语句。
4. 查询结果字段要使用清晰的别名。
5. 不要解释,不要道歉,只输出 Cypher。
问题:
{question}
"""
cypher_prompt = PromptTemplate(
input_variables=["schema", "question"],
template=CYPHER_GENERATION_TEMPLATE,
)
11.4 完整问答代码
import os
from dotenv import load_dotenv
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from langchain_neo4j import GraphCypherQAChain
from Neo4jUtil import connect_to_neo4j
load_dotenv()
graph = connect_to_neo4j()
llm = ChatOpenAI(
model="qwen3.6-35b-a3b",
api_key=os.getenv("DASHSCOPE_API_KEY"),
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
temperature=0,
)
CYPHER_GENERATION_TEMPLATE = """
任务:根据用户问题生成 Neo4j Cypher 查询语句。
数据库结构:
{schema}
要求:
1. 只能使用数据库结构中出现的节点标签、关系类型和属性。
2. 只生成 MATCH 查询语句。
3. 不要生成 DELETE、CREATE、MERGE、SET、REMOVE 等写入语句。
4. 查询结果字段要使用清晰的别名。
5. 优先使用中文实体名称进行精确匹配。
6. 不要解释,不要道歉,只输出 Cypher。
问题:
{question}
"""
cypher_prompt = PromptTemplate(
input_variables=["schema", "question"],
template=CYPHER_GENERATION_TEMPLATE,
)
chain = GraphCypherQAChain.from_llm(
llm=llm,
graph=graph,
cypher_prompt=cypher_prompt,
verbose=True,
validate_cypher=True,
allow_dangerous_requests=True,
)
result = chain.invoke({"query": "马云创立了哪家公司?"})
print(result)
11.5 可能的输出结果
> Entering new GraphCypherQAChain chain...
Generated Cypher:
MATCH (p:Person {name: '马云'})-[:FOUNDED]->(c:Company) RETURN c.name AS 公司名称
Full Context:
[{'公司名称': '阿里巴巴'}]
> Finished chain.
{'query': '马云创立了哪家公司?', 'result': '马云创立了阿里巴巴。'}
11.6 更多测试问题
- 可以尝试输入:
马云的职业是什么?
腾讯是哪一年成立的?
哪些公司属于电子商务行业?
刘强东在哪家公司任职?
马化腾和谁是朋友?
总部在北京的公司有哪些?
1998 年成立了哪些公司?
12、常见错误与解决方案
12.1 导入路径错误
- 错误写法:
from langchain_community.graphs import GraphCypherQAChain
- LangChain 1.1.0 推荐写法:
from langchain_neo4j import GraphCypherQAChain, Neo4jGraph
12.2 变量名不一致
- 错误示例:
llm = ChatOpenAI(...)
chain = GraphCypherQAChain.from_llm(
llm=chatLLM,
graph=graph,
)
-
这里定义的是
llm,但使用的是chatLLM -
正确写法:
llm = ChatOpenAI(...)
chain = GraphCypherQAChain.from_llm(
llm=llm,
graph=graph,
)
12.3 未设置 allow_dangerous_requests
- 如果没有设置:
allow_dangerous_requests=True
- 可能会报错,因为 LangChain 要求开发者明确确认执行数据库查询的风险
12.4 连接 Neo4j 失败
- 常见原因:
| 问题 | 解决方式 |
|---|---|
| Neo4j 没启动 | 启动 Neo4j 服务 |
| 地址错误 | 检查 bolt://127.0.0.1:7687 |
| 密码错误 | 修改 .env 中的密码 |
| 数据库名错误 | 检查 Neo4j 中数据库名称 |
| 防火墙拦截 | 放行 7687 端口 |
12.5 模型生成了错误 Cypher
-
可能原因:
-
Prompt 中没有写清楚图数据库结构
-
节点标签或关系类型描述不完整
-
数据库中没有相关数据
-
用户问题过于模糊
-
-
解决方式:
-
使用
verbose=True查看生成的 Cypher -
明确节点、属性和关系类型
-
给模型提供示例问题和示例 Cypher
-
降低
temperature
-
13、Neo4jVector:把文本存入 Neo4j 做向量检索
13.1 图查询和向量检索的区别
| 类型 | 适合问题 | 示例 |
|---|---|---|
| 图查询 | 结构化关系明确的问题 | 马云创立了哪家公司? |
| 向量检索 | 语义相似、文本内容查询 | 找到和电子商务相关的介绍 |
- Neo4j 不仅可以存图结构,也可以作为向量数据库存储文本向量
13.2 Neo4jVector.from_documents 作用
Neo4jVector.from_documents可以完成:- 接收
Document文档列表 - 调用 Embedding 模型生成向量
- 将文本和向量写入 Neo4j
- 创建或复用向量索引
- 支持后续相似度搜索
- 接收
13.3 文档写入示例
import os
from dotenv import load_dotenv
from langchain_core.documents import Document
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_neo4j import Neo4jVector
load_dotenv()
embedding = HuggingFaceEmbeddings(
model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2",
cache_folder=r"F:\workspace\AI\LangChain-1.0\embedding_model"
)
documents = [
Document(
page_content="阿里巴巴是一家电子商务和云计算公司,由马云等人创立。",
metadata={"source": "company_intro", "name": "阿里巴巴"},
),
Document(
page_content="腾讯是一家互联网公司,业务包括社交、游戏、金融科技和云服务。",
metadata={"source": "company_intro", "name": "腾讯"},
),
Document(
page_content="百度是一家以搜索引擎和人工智能技术为核心的互联网公司。",
metadata={"source": "company_intro", "name": "百度"},
),
]
vector_store = Neo4jVector.from_documents(
documents=documents,
embedding=embedding,
url=os.getenv("NEO4J_URL", "bolt://127.0.0.1:7687"),
username=os.getenv("NEO4J_USERNAME", "neo4j"),
password=os.getenv("NEO4J_PASSWORD", "rootroot"),
database=os.getenv("NEO4J_DATABASE", "neo4j"),
index_name="company_vector_index",
node_label="CompanyDocument",
text_node_property="text",
embedding_node_property="embedding",
)
results = vector_store.similarity_search("哪家公司和人工智能搜索有关?", k=2)
for item in results:
print(item.page_content)
print(item.metadata)
13.4 向量检索结果说明
- 如果问题是:
哪家公司和人工智能搜索有关?
- 可能返回:
百度是一家以搜索引擎和人工智能技术为核心的互联网公司。
{'source': 'company_intro', 'name': '百度'}
阿里巴巴是一家电子商务和云计算公司,由马云等人创立。
{'source': 'company_intro', 'name': '阿里巴巴'}
- 这说明向量检索不是根据精确关键词匹配,而是根据语义相似度匹配
14、图查询与向量检索结合
14.1 两种方式的互补关系
| 能力 | 优点 | 局限 |
|---|---|---|
| Cypher 图查询 | 精确、可解释、适合关系推理 | 依赖结构化数据 |
| 向量检索 | 灵活、适合非结构化文本 | 不擅长精确关系计算 |
- 实际项目中常见组合方式:
用户问题
↓
判断问题类型
↓
结构化关系问题 → GraphCypherQAChain
文本语义问题 → Neo4jVector 相似度搜索
↓
大模型综合生成答案
14.2 示例
- 结构化关系问题:
马云创立了哪家公司?
- 适合使用:
GraphCypherQAChain
- 非结构化语义问题:
请介绍一下和人工智能搜索相关的公司。
- 适合使用:
Neo4jVector
15、课堂综合案例
- 实现过程课件参考:【G:\上课\人工智能\18-大模型第一阶段串讲内容\19.项目二:基于Neo4j实现RAG系统.md】
15.1 案例目标
-
完成一个医疗知识图谱问答系统:
-
Neo4j 保存人物和公司关系
-
LangChain 连接 Neo4j
-
通义千问理解用户自然语言问题
-
自动生成 Cypher 查询
-
返回自然语言答案
-
15.2 系统架构
用户
↓
自然语言问题
↓
LangChain
↓
ChatOpenAI 调用 Qwen 模型
↓
GraphCypherQAChain 生成 Cypher
↓
Neo4j 执行查询
↓
查询结果
↓
LLM 组织答案
↓
返回用户
15.3 完整流程
- 启动 Neo4j
- 安装 Python 依赖
- 配置
.env - 编写
Neo4jUtil.py - 初始化图谱数据
- 测试 Qwen 模型调用
- 创建
GraphCypherQAChain - 输入自然语言问题
- 查看生成的 Cypher
- 获取自然语言回答
- 客户端和服务器开发
16、课堂练习
16.1 练习 1:基础 Cypher 查询
-
请写出查询所有
Person节点姓名和年龄的 Cypher -
参考答案:
MATCH (p:Person)
RETURN p.name AS name, p.age AS age;
16.2 练习 2:使用 LangChain 查询 Neo4j
-
请用
graph.query()查询所有公司名称和行业 -
参考答案:
from Neo4jUtil import connect_to_neo4j
graph = connect_to_neo4j()
result = graph.query("""
MATCH (c:Company)
RETURN c.name AS name, c.industry AS industry
""")
print(result)
16.3 练习 3:自然语言问答
- 请使用
GraphCypherQAChain回答:
哪些公司成立于 1998 年?
- 可能生成的 Cypher:
MATCH (c:Company {founded: 1998})
RETURN c.name AS company;
16.4 练习 4:扩展数据
- 请增加一个公司节点:
小米,行业:智能硬件,成立时间:2010,城市:北京
- 并增加人物关系:
雷军 创立 小米
- 参考 Cypher:
CREATE (:Person {name: '雷军', age: 55, occupation: '企业家', city: '北京'});
CREATE (:Company {name: '小米', industry: '智能硬件', founded: 2010, city: '北京'});
MATCH (p:Person {name: '雷军'}), (c:Company {name: '小米'})
CREATE (p)-[:FOUNDED {role: '创始人'}]->(c);
16.5 练习 5:删除属性
-
请删除所有节点上的
age和company属性 -
参考答案:
MATCH (n)
REMOVE n.age, n.company;
17、项目作业
- 请完成一个小型图谱问答项目:
17.1 任务要求
- 自选一个主题,例如:电影、学校、公司、人物关系、课程知识点
- 设计至少 3 类节点标签
- 设计至少 4 类关系
- 写入不少于 20 个节点
- 写入不少于 20 条关系
- 使用
Neo4jGraph完成基础查询 - 使用
GraphCypherQAChain完成自然语言问答 - 至少测试 5 个自然语言问题
17.2 提交内容
- 项目主题说明
- 节点和关系设计表
- 初始化数据代码
- 问答代码
- 5 个问题及运行结果截图
- 遇到的问题和解决方案
18、本节小结
本节课主要学习了 LangChain 1.1.0 操作 Neo4j 的完整流程。
核心知识点:
Neo4jGraph用于连接和查询 Neo4jgraph.query()可以执行 Cypher 语句GraphCypherQAChain可以实现自然语言到 Cypher 的图数据库问答Neo4jVector可以将文本和向量存入 Neo4j- Prompt 中必须清楚描述节点、关系和属性
- 生产环境应使用只读账号,避免大模型生成危险写入语句
19、常用命令速查
19.1 清空所有节点和关系
MATCH (n)
DETACH DELETE n;
19.2 删除所有节点上的指定属性
MATCH (n)
REMOVE n.age, n.company;
19.3 查询所有节点
MATCH (n)
RETURN n;
19.4 查询所有关系
MATCH (a)-[r]->(b)
RETURN a, r, b;
19.5 查询图数据库结构
CALL db.schema.visualization();
19.6 查看索引
SHOW INDEXES;
19.7 查看约束
SHOW CONSTRAINTS;
20、推荐拓展学习
- Neo4j Cypher 查询语言
- Neo4j 图数据建模
- LangChain Runnable 编程模型
- LangGraph Agent 应用开发
- RAG 检索增强生成
- 知识图谱构建与实体关系抽取
- 图数据库与向量数据库混合检索
浙公网安备 33010602011771号