You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于源文件名过滤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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 01:43:28