一、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_USERNAMENEO4J_PASSWORD 是数据库账号密码

    • NEO4J_DATABASE 是数据库名称

5、小结

  • 学习的时候可以创建一个单独的数据库,比如 test
  • 环境版本非常重要,发生冲突解决起来就很麻烦
  • 现在不是逐行代码都需要个人实现,合理利用 AI 提高效率

6、连接 Neo4j 数据库

  • 操作的库选择 neo4j,Neo4j 安装后自带的库

6.1 Neo4jGraph 介绍

  • Neo4jGraphlangchain-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;

image-20260523103037520

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

image-20260523103050439

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 结合的核心链,主要功能是:

    1. 接收用户自然语言问题
    2. 根据图数据库结构生成 Cypher
    3. 执行 Cypher 查询 Neo4j
    4. 根据查询结果生成自然语言回答
  • 导入方式:

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 可以完成:
    1. 接收 Document 文档列表
    2. 调用 Embedding 模型生成向量
    3. 将文本和向量写入 Neo4j
    4. 创建或复用向量索引
    5. 支持后续相似度搜索

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 完整流程

  1. 启动 Neo4j
  2. 安装 Python 依赖
  3. 配置 .env
  4. 编写 Neo4jUtil.py
  5. 初始化图谱数据
  6. 测试 Qwen 模型调用
  7. 创建 GraphCypherQAChain
  8. 输入自然语言问题
  9. 查看生成的 Cypher
  10. 获取自然语言回答
  11. 客户端和服务器开发

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:删除属性

  • 请删除所有节点上的 agecompany 属性

  • 参考答案:

MATCH (n)
REMOVE n.age, n.company;

17、项目作业

  • 请完成一个小型图谱问答项目:

17.1 任务要求

  1. 自选一个主题,例如:电影、学校、公司、人物关系、课程知识点
  2. 设计至少 3 类节点标签
  3. 设计至少 4 类关系
  4. 写入不少于 20 个节点
  5. 写入不少于 20 条关系
  6. 使用 Neo4jGraph 完成基础查询
  7. 使用 GraphCypherQAChain 完成自然语言问答
  8. 至少测试 5 个自然语言问题

17.2 提交内容

  • 项目主题说明
  • 节点和关系设计表
  • 初始化数据代码
  • 问答代码
  • 5 个问题及运行结果截图
  • 遇到的问题和解决方案

18、本节小结

本节课主要学习了 LangChain 1.1.0 操作 Neo4j 的完整流程。

核心知识点:

  • Neo4jGraph 用于连接和查询 Neo4j
  • graph.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 检索增强生成
  • 知识图谱构建与实体关系抽取
  • 图数据库与向量数据库混合检索