From 63f42d3170728ca21537eae444f7d2d945558d9e Mon Sep 17 00:00:00 2001 From: hijzy Date: Fri, 13 Feb 2026 15:00:11 +0800 Subject: [PATCH 1/2] feat: add full_text_search for neo4j --- src/memos/graph_dbs/neo4j.py | 20 ++++++++++++++ src/memos/graph_dbs/neo4j_community.py | 22 +++++++++++++++- .../tree_text_memory/retrieve/searcher.py | 26 ++++++++++++------- 3 files changed, 57 insertions(+), 11 deletions(-) diff --git a/src/memos/graph_dbs/neo4j.py b/src/memos/graph_dbs/neo4j.py index 23ce2408b..746051187 100644 --- a/src/memos/graph_dbs/neo4j.py +++ b/src/memos/graph_dbs/neo4j.py @@ -928,6 +928,26 @@ def search_by_embedding( return records + def search_by_fulltext( + self, + query_words: list[str], + top_k: int = 10, + scope: str | None = None, + status: str | None = None, + threshold: float | None = None, + search_filter: dict | None = None, + user_name: str | None = None, + filter: dict | None = None, + knowledgebase_ids: list[str] | None = None, + tsquery_config: str | None = None, + **kwargs, + ) -> list[dict]: + """ + TODO: 实现 Neo4j 的关键词检索, 以兼容 TreeTextMemory 的 keyword/fulltext 召回路径. + 目前先返回空列表, 避免切换到 Neo4j 后因缺失方法导致运行时报错. + """ + return [] + def get_by_metadata( self, filters: list[dict[str, Any]], diff --git a/src/memos/graph_dbs/neo4j_community.py b/src/memos/graph_dbs/neo4j_community.py index e34313fa2..871814c22 100644 --- a/src/memos/graph_dbs/neo4j_community.py +++ b/src/memos/graph_dbs/neo4j_community.py @@ -382,6 +382,26 @@ def search_by_embedding( return filtered_results + def search_by_fulltext( + self, + query_words: list[str], + top_k: int = 10, + scope: str | None = None, + status: str | None = None, + threshold: float | None = None, + search_filter: dict | None = None, + user_name: str | None = None, + filter: dict | None = None, + knowledgebase_ids: list[str] | None = None, + tsquery_config: str | None = None, + **kwargs, + ) -> list[dict]: + """ + TODO: 实现 Neo4j Community 的关键词检索, 以兼容 TreeTextMemory 的 keyword/fulltext 召回路径. + 目前先返回空列表, 避免切换到 Neo4j 后因缺失方法导致运行时报错. + """ + return [] + def _normalize_date_string(self, date_str: str) -> str: """ Normalize date string to ISO 8601 format for Neo4j datetime() function. @@ -1102,7 +1122,7 @@ def _parse_nodes(self, nodes_data: list[dict[str, Any]]) -> list[dict[str, Any]] # Merge embeddings into parsed nodes for parsed_node in parsed_nodes: node_id = parsed_node["id"] - parsed_node["metadata"]["embedding"] = vec_items_map.get(node_id, None) + parsed_node["metadata"]["embedding"] = vec_items_map.get(node_id) return parsed_nodes diff --git a/src/memos/memories/textual/tree_text_memory/retrieve/searcher.py b/src/memos/memories/textual/tree_text_memory/retrieve/searcher.py index f00efccb6..c8e7acc25 100644 --- a/src/memos/memories/textual/tree_text_memory/retrieve/searcher.py +++ b/src/memos/memories/textual/tree_text_memory/retrieve/searcher.py @@ -511,16 +511,22 @@ def _retrieve_from_keyword( id_to_score: dict[str, float] = {} for scope in scopes: - hits = self.graph_store.search_by_fulltext( - query_words=tsquery_terms, - top_k=top_k * 2, - status="activated", - scope=scope, - search_filter=None, - filter=search_filter, - user_name=user_name, - tsquery_config="jiebaqry", - ) + try: + hits = self.graph_store.search_by_fulltext( + query_words=tsquery_terms, + top_k=top_k * 2, + status="activated", + scope=scope, + search_filter=None, + filter=search_filter, + user_name=user_name, + tsquery_config="jiebaqry", + ) + except Exception as e: + logger.warning( + f"[PATH-KEYWORD] search_by_fulltext failed, scope={scope}, user_name={user_name}" + ) + hits = [] for h in hits or []: hid = str(h.get("id") or "").strip().strip("'\"") if not hid: From 6b38e54ffdb384dee2f4ee4de556eeb6cb3b2160 Mon Sep 17 00:00:00 2001 From: hijzy Date: Fri, 13 Feb 2026 15:10:27 +0800 Subject: [PATCH 2/2] =?UTF-8?q?test:=20=E6=94=B9=E5=9B=9E=E5=8E=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/memos/graph_dbs/neo4j_community.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/memos/graph_dbs/neo4j_community.py b/src/memos/graph_dbs/neo4j_community.py index 871814c22..cae7d6ca5 100644 --- a/src/memos/graph_dbs/neo4j_community.py +++ b/src/memos/graph_dbs/neo4j_community.py @@ -1122,7 +1122,7 @@ def _parse_nodes(self, nodes_data: list[dict[str, Any]]) -> list[dict[str, Any]] # Merge embeddings into parsed nodes for parsed_node in parsed_nodes: node_id = parsed_node["id"] - parsed_node["metadata"]["embedding"] = vec_items_map.get(node_id) + parsed_node["metadata"]["embedding"] = vec_items_map.get(node_id, None) return parsed_nodes