refactor(memory): consolidate write pipeline and rename statement extraction step

- Rename StatementExtractionStep → StatementTemporalExtractionStep and
  extract_statement.jinja2 → extract_statement_temporal.jinja2 to reflect
  merged temporal extraction logic
- Move extraction_pipeline_orchestrator.py out of steps/ to engine root
- Move dedup_step.py into steps/ directory
- Introduce WriteMemoryRequest schema to replace positional args in write_memory()
- Extract _resolve_and_load_config, _preprocess_files, _write_neo4j, and
  _invalidate_interest_cache as private helpers in MemoryAgentService
- Remove shadow pipeline and simplify NEW_PIPELINE_ENABLED branch
- Merge 类型归属/成员隶属/任职服务 relation types into single 归属身份关系 in triplet prompt
- Add alias merge logic (别名属于) in deduplication and MERGE_ALIAS_BELONGS_TO Cypher query
- Add StorageType, Language, MessageItem enums/models to memory_agent_schema
- Reduce AgentMemory_Long_Term.DEFAULT_SCOPE from 6 to 1
- Delete standalone extract_temporal.jinja2 (logic merged into statement step)
This commit is contained in:
lanceyq
2026-04-28 16:36:30 +08:00
parent 7747ed7ac1
commit 1f0c88a5f0
17 changed files with 390 additions and 326 deletions

View File

@@ -1107,6 +1107,35 @@ RETURN (
) AS is_complete
"""
# 别名归并:将 predicate="别名属于" 的 EXTRACTED_RELATIONSHIP 边的 source.name
# 合并进 target.aliases去重并将 source.description 追加到 target.description分号分隔
MERGE_ALIAS_BELONGS_TO = """
MATCH (source:ExtractedEntity {end_user_id: $end_user_id})-[r:EXTRACTED_RELATIONSHIP]->(target:ExtractedEntity {end_user_id: $end_user_id})
WHERE r.predicate = '别名属于'
WITH source, target,
coalesce(target.aliases, []) AS existing_aliases,
source.name AS source_name,
coalesce(source.description, '') AS src_desc,
coalesce(target.description, '') AS tgt_desc
// 1. 合并 aliases将 source.name 追加到 target.aliases去重
WITH source, target, src_desc, tgt_desc,
CASE
WHEN source_name IS NOT NULL AND source_name <> '' AND NOT source_name IN existing_aliases
THEN existing_aliases + source_name
ELSE existing_aliases
END AS new_aliases
SET target.aliases = new_aliases,
target.description = CASE
WHEN src_desc <> '' AND NOT src_desc IN tgt_desc
THEN CASE WHEN tgt_desc = '' THEN src_desc ELSE tgt_desc + '' + src_desc END
ELSE tgt_desc
END
RETURN source.name AS merged_alias, target.name AS target_name, new_aliases AS updated_aliases
"""
CHECK_COMMUNITY_IS_COMPLETE_WITH_EMBEDDING = """
MATCH (c:Community {community_id: $community_id, end_user_id: $end_user_id})
RETURN (