_search_graph_db函数的核心作用是:在图数据库中,根据输入的节点列表(文本),搜索与之相似的节点,并获取这些相似节点的所有入站关系(其他节点指向它)和出站关系(它指向其他节点),同时支持按条件过滤(如用户 ID、代理 ID 等)。
核心功能拆解:
- 向量相似度匹配:将输入的文本节点(如 “苹果手机”)转换为向量,在图数据库中找到向量相似的节点(通过余弦相似度计算,过滤出相似度≥阈值的节点)。
- 关系检索:对找到的相似节点,提取它们的所有 “出站关系”(如 “苹果手机→电子产品”)和 “入站关系”(如 “用户 123→购买了→苹果手机”)。
- 条件过滤:通过
filters参数(如user_id、agent_id)限制只查询特定范围的节点(例如只查用户 “user_001” 相关的节点)。
举例说明:
假设场景:一个电商知识图谱,图中节点标签为 “Product”(self.node_label = "Product"),节点有name(名称)、embedding(向量)、user_id(所属用户)等属性,关系包括 “属于”“在售卖”“购买了” 等。
输入参数:
node_list = ["苹果手机"](要搜索的节点文本)filters = {"user_id": "user_001"}(只查用户 “user_001” 相关的节点)limit = 100(最多返回 100 条关系)
函数执行过程:
-
构建过滤条件:
因为filters有user_id,所以node_props_str会变成"user_id: $user_id",用于限制只匹配user_id = "user_001"的节点。 -
节点向量转换:
调用self.embedding_model.embed("苹果手机"),将 “苹果手机” 转换为向量(例如[0.12, 0.34, ..., 0.56])。 -
执行 Cypher 查询:
匹配图中标签为 “Product”、user_id = "user_001"、且有embedding向量的节点n,计算n的向量与 “苹果手机” 向量的相似度,保留相似度≥阈值(如 0.7)的节点。然后查询这些相似节点的关系:
- 出站关系:比如
n(假设是 “苹果手机 Pro”)指向的节点,如n-[属于]->(m:Product {name: "电子产品"})。 - 入站关系:比如其他节点指向
n,如(m:Product {name: "用户123"})-[购买了]->n。
- 出站关系:比如
-
收集结果:
去重后按相似度降序排列,返回关系信息(源节点、关系类型、目标节点等)。 -
输出结果示例
[ # 相似节点“苹果手机Pro”的出站关系 { "source": "苹果手机Pro", "source_id": "n100", "relationship": "属于", "relation_id": "r200", "destination": "电子产品", "destination_id": "n101", "similarity": 0.92 # 与“苹果手机”的相似度 }, { "source": "苹果手机Pro", "source_id": "n100", "relationship": "在售卖", "relation_id": "r201", "destination": "京东商城", "destination_id": "n102", "similarity": 0.92 }, # 相似节点“苹果手机Pro”的入站关系 { "source": "用户123", "source_id": "n103", "relationship": "购买了", "relation_id": "r202", "destination": "苹果手机Pro", "destination_id": "n100", "similarity": 0.92 }, # 另一个相似节点“苹果手机SE”的关系 { "source": "苹果手机SE", "source_id": "n104", "relationship": "属于", "relation_id": "r203", "destination": "电子产品", "destination_id": "n101", "similarity": 0.85 } ]结果说明:
- 函数找到了与 “我爱吃西瓜”“我爱吃哈密瓜” 相似的节点(即 “西瓜”“哈密瓜”);
- 提取了用户 “user_100” 与这两种水果的 “喜欢” 关系;
- 还挖掘了水果本身的分类关系(西瓜属于夏季水果,哈密瓜属于甜瓜)。
-
这体现了函数的核心作用:从文本描述出发,在图数据库中找到相关实体及它们的关联关系,帮助理解 “谁和谁有什么联系”。

416

被折叠的 条评论
为什么被折叠?



