本项目的 Graph RAG 负责从 Neo4j 中获取节点、关系和路径证据,适合回答:
当前实现属于 Text-to-Cypher 型 Graph RAG。它不使用 Neo4j 向量索引,也没有接入官方 VectorRetriever、VectorCypherRetriever 或 HybridCypherRetriever。
当前知识库绑定中配置了 defaultCypher,因此工作台实际使用的是显式 Cypher:
MATCH p=(m:Mission {name:'东海海上目标救援任务'})
-[:HAS_STAGE]->(s:Stage)
RETURN p
虽然前端传入了:
{
"allowTextToCypher": true
}
但后端的优先级是:
显式 cypher/defaultCypher
>
自动 Text-to-Cypher
因此只要 defaultCypher 存在,就不会调用大模型生成 Cypher。
flowchart TD
Q["用户问题"] --> K["KnowledgeBaseRagRetriever"]
K --> G["GraphRagRetriever"]
G --> E{"是否存在显式 Cypher"}
E -->|是| X["使用 cypher/defaultCypher"]
E -->|否| A{"是否允许自动生成"}
A -->|否| W["返回 warning"]
A -->|是| T["Text-to-Cypher"]
T --> S["Schema + 示例 + 业务规则"]
S --> B["RAG AI Bridge"]
B --> L["LLM 生成 Cypher"]
X --> C["CypherGuardService"]
L --> C
C --> N["Neo4j 执行"]
N --> R["nodes + edges"]
R --> EVIDENCE["GRAPH_RESULT 证据"]
EVIDENCE --> ANSWER["多源证据融合回答"]
图检索使用统一的 RagQuery:
{
"query": "东海海上目标救援任务包括哪些阶段?",
"sourceIds": ["1"],
"topK": 5,
"filters": {
"allowTextToCypher": true,
"maxDepth": 3
}
}
主要字段:
| 字段 | 含义 |
|---|---|
query |
用户自然语言问题 |
sourceIds |
Neo4j 图数据源 ID |
topK |
结果规模控制 |
allowTextToCypher |
是否允许自动生成 Cypher |
maxDepth |
自动生成查询时允许的最大路径深度 |
显式 Cypher 可以来自:
{
"cypher": "MATCH ..."
}
或者知识库数据源绑定:
{
"defaultCypher": "MATCH ..."
}
执行过程:
读取显式 Cypher
→ 跳过大模型
→ Java 安全校验
→ Neo4j 执行
→ 生成图证据
适合固定报表、固定演示、调试和确定性业务流程。缺点是无论用户如何变化问题,都可能执行同一条查询。
删除 defaultCypher 后,如果满足以下任一条件:
allowTextToCypher = true
retrievalMode = AUTO_GENERATE
系统会调用 Neo4jGraphRagCypherGenerationService。
Java 读取 Neo4j Labels,并组合:
当前关系 Schema 主要是手工配置:
(:Mission {name: STRING})
-[:HAS_STAGE]->
(:Stage {name: STRING, sequence: INTEGER})
问题:东海海上目标救援任务包括哪些阶段?
Cypher:
MATCH p=(m:Mission {name:'东海海上目标救援任务'})
-[:HAS_STAGE]->(s:Stage)
RETURN p
问题:如果东海发生人员落水事故,应按照什么流程开展救援?
Cypher:
MATCH p=(m:Mission)-[:HAS_STAGE]->(s:Stage)
WHERE m.name CONTAINS '东海'
RETURN p
ORDER BY s.sequence
Java 向 RAG AI Bridge 发送:
POST http://127.0.0.1:18733/text2cypher
Bridge 要求模型只返回一条只读 Cypher,不输出解释、Markdown 或中间过程。
Python 负责:
<think> 内容;CypherGuardService 再次检查:
CREATE、MERGE、DELETE、SET、DROP 等;最终还应使用 Neo4j 只读账号形成数据库级安全边界。
校验通过后,Java 根据 graphSourceId:
nodes 和 edges。示例结果:
{
"nodes": [
{"labels": ["Mission"], "properties": {"name": "东海海上目标救援任务"}},
{"labels": ["Stage"], "properties": {"name": "任务接收", "sequence": 0}}
],
"edges": [
{"source": "mission-id", "target": "stage-id", "type": "HAS_STAGE"}
]
}
查询结果封装为:
{
"sourceType": "GRAPH",
"evidenceType": "GRAPH_RESULT",
"content": "图查询返回7个节点、6条关系",
"score": 1.0,
"payload": {
"nodes": [],
"edges": [],
"paths": []
},
"metadata": {
"cypher": "MATCH ...",
"explicitCypher": "MATCH ...",
"nodeCount": 7,
"edgeCount": 6,
"durationMs": 74
}
}
判断查询来源:
explicitCypher:使用了固定 Cypher;generatedCypher:使用了自动 Text-to-Cypher。score=1.0 不是向量相似度,只表示这是数据库实际执行得到的结构化证据。
当前图节点和关系没有向量化,也没有:
VectorRetriever;VectorCypherRetriever;HybridRetriever;HybridCypherRetriever;SimpleKGPipeline。因此当前 Graph RAG 的准确定位是:
显式 Cypher 优先、支持自动 Text-to-Cypher、经过双层只读校验、将 Neo4j 节点和关系作为多源 RAG 证据。
EXPLAIN 预检生成的 Cypher;KnowledgeBaseRagRetriever:多源知识库调度;GraphRagRetriever:图检索主入口;ExplicitCypherGenerationService:显式 Cypher;Neo4jGraphRagCypherGenerationService:自动生成 Cypher;RagAiBridgeClient:调用 /text2cypher;CypherGuardService:Java 只读安全校验;GraphSourceServiceImpl:执行图查询;Neo4jExecutorService:Neo4j Driver 和结果转换。