必须让dify实时访问neo4j的节点、关系及向量嵌入,需确认neo4j服务与bolt协议可用,修改conf/neo4j.conf启用并监听0.0.0.0:7687,dify中配置custom api验证http通道,再通过python函数节点调用neo4j driver接入bolt,结合多跳cypher查询与向量索引实现智能检索。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

要在Dify中实现基于复杂实体关联的智能检索,必须让Dify能实时访问Neo4j中存储的节点、关系及向量嵌入结果,否则所有图谱推理和多跳查询都只是纸上谈兵。
确认Neo4j服务状态与Bolt协议可用性
打开终端,执行 curl -I http://localhost:7474 检查HTTP服务是否响应;若返回 200 OK,再测试Bolt端口连通性:telnet localhost 7687。失败则说明Neo4j未启动或conf/neo4j.conf中dbms.connector.bolt.enabled=true未启用。
Neo4j默认关闭远程Bolt访问,【必须修改conf/neo4j.conf中dbms.connector.bolt.listen_address配置为0.0.0.0:7687】,否则Dify容器内无法建立连接。
重启Neo4j服务:systemctl restart neo4j(Linux)或双击Neo4j Desktop中的“Start”按钮(macOS/Windows)。
在Dify中配置Neo4j连接参数
进入Dify管理后台 → 【Settings】→ 【Data Sources】→ 【Add Data Source】→ 选择【Custom API】。
填写以下字段:
-
Name:输入
neo4j-knowledge-graph -
Base URL:填
http://host.docker.internal:7474(Docker部署时)或http://localhost:7474(本地直连) -
Authentication:选
Basic Auth,Username填neo4j,Password填你设置的实际密码
点击【Test Connection】,成功返回{"message":"Neo4j is ready"}即表示基础HTTP通道就绪——这一步仅验证REST API,不涉及Bolt。
编写Python函数节点接入Bolt协议
Dify的Custom API无法直接使用Bolt协议,必须通过Python函数节点调用Neo4j Python Driver。
在Dify工作流编辑器中,添加一个【Python Code】节点,粘贴以下代码:
from neo4j import GraphDatabase
import os
<h1>从Dify环境变量读取配置,避免硬编码</h1><p>uri = os.getenv("NEO4J_URI", "bolt://host.docker.internal:7687")
user = os.getenv("NEO4J_USER", "neo4j")
password = os.getenv("NEO4J_PASSWORD", "your_password")</p><p>driver = GraphDatabase.driver(uri, auth=(user, password))</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill1763" title="dify-code-interpreter"><img
src="https://img.php.cn/upload/skill/000/000/081/178851246754770.jpg" alt="dify-code-interpreter" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill1763" title="dify-code-interpreter" class="overflowclass">dify-code-interpreter</a>
<p class="overflowclass">解释任意编程语言代码的语法、逻辑、用途与实现细节,支持多语言并返回结构化说明。</p>
</div>
<a rel="nofollow" href="/xiazai/skill1763" title="dify-code-interpreter" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div><p>def run_cypher(query: str, params: dict = None):
with driver.session() as session:
result = session.run(query, params or {})
return [record.data() for record in result]
</p>
在该节点的【Environment Variables】区域,手动添加三条变量:
-
NEO4J_URI = bolt://host.docker.internal:7687(Docker部署)或bolt://localhost:7687(本地开发) NEO4J_USER = neo4jNEO4J_PASSWORD = your_actual_password
【NEO4J_URI必须用host.docker.internal而非localhost,否则Dify容器无法解析宿主机服务】
构建支持多跳关联的Cypher查询逻辑
第一步:提取用户提问中的核心实体
第二步:将实体名作为参数传入预编译Cypher模板,避免字符串拼接注入风险
第三步:执行带深度限制的关系遍历,例如查找“张三”两跳内的所有合作项目与负责人:
MATCH (n:Person {name: $entity})-[:WORKED_ON|MANAGED*1..2]-(related)
RETURN DISTINCT related.name AS name, labels(related) AS type, count(*) AS relevance
ORDER BY relevance DESC LIMIT 10
第四步:将结果结构化为JSON列表,供后续LLM提示词注入使用
第五步:在Dify工作流中,将此Python节点输出绑定至RAG Prompt的{{knowledge}}占位符
启用Neo4j向量索引加速语义匹配
方法一:在Neo4j Browser中执行建模命令,为Chunk节点的embedding属性创建余弦相似度索引:
CALL db.index.vector.createNodeIndex( 'chunk_embedding_index', 'Chunk', 'embedding', 384, 'cosine' )
方法二:在Python函数节点中封装向量检索函数,接收Dify生成的文本嵌入向量并执行近邻搜索:
def vector_search(embedding: list, top_k: int = 3):
query = """
CALL db.index.vector.queryNodes('chunk_embedding_index', $top_k, $embedding)
YIELD node, score
RETURN node.content AS content, score
ORDER BY score DESC
"""
return run_cypher(query, {"embedding": embedding, "top_k": top_k})
调用时确保传入的embedding是长度为384的float列表,与索引维度严格一致,否则Neo4j会报Invalid input错误。










