如何基于源文件名过滤Neo4j图数据库返回给LLM的结果?
问题
我正在为技术文档构建带混合检索的Graph RAG,需要针对特定版本的文档返回结果。目前基于Neo4j实现,但无法通过文件名过滤图查询与向量查询。我基于公开的Graph RAG示例代码修改为加载MS Word文件,代码能正常运行,但版本相关查询无法返回对应文件的正确信息。尝试在graph_retriever方法的图查询中添加WHERE子句过滤node.source(包含版本号'12.34'),但修改后无结果返回。另外,示例代码的add_graph_documents方法不支持存储文件名/URL信息,考虑添加version_number字段但不知如何实现。
解决方案
1. 给图节点添加源文件/版本属性
首先需要修改add_graph_documents方法,确保在创建实体节点时存储源文件名或版本信息:
- 处理Word文件时,提取文件名或版本号(比如从文件名中解析版本,如
v12.34_xxx.docx); - 修改节点创建的Cypher语句,添加
source或version_number属性:# 原创建节点的Cypher语句 # query = "MERGE (n:Entity {id: $entity}) ON CREATE SET n.name = $entity" # 修改后: query = "MERGE (n:Entity {id: $entity}) ON CREATE SET n.name = $entity, n.source = $source" # 调用时传入source参数(比如文件名或版本号) for entity in entities: tx.run(query, entity=entity, source=doc_source) # doc_source为文件名/版本号
2. 修正图查询的过滤逻辑
之前的查询无结果,大概率是因为节点未正确设置source属性,或者过滤范围太窄。调整查询逻辑:
- 先过滤起始节点的
source属性,确保只从目标版本的节点出发查询; - 可选:如果需要关联的邻居节点也来自同一版本,添加邻居节点的过滤条件:
CALL db.index.fulltext.queryNodes('entity', $query, {limit:2}) YIELD node,score WHERE node.source CONTAINS '12.34' CALL { WITH node MATCH (node)-[r:!MENTIONS]->(neighbor) WHERE neighbor.source CONTAINS '12.34' RETURN node.id + ' - ' + type(r) + ' -> ' + neighbor.id AS output UNION ALL WITH node MATCH (node)<-[r:!MENTIONS]-(neighbor) WHERE neighbor.source CONTAINS '12.34' RETURN neighbor.id + ' - ' + type(r) + ' -> ' + node.id AS output } RETURN output LIMIT 50
3. 向量查询的来源过滤
如果是混合检索,向量部分也要同步添加过滤:
- 若使用Neo4j向量索引,在向量查询时添加
WHERE node.source CONTAINS '12.34'条件; - 确保向量节点同样存储了
source属性(可在嵌入文档时同步写入)。
内容的提问来源于stack exchange,提问作者Viv
相关产品推荐
相关产品推荐

