Introduce the `别名失效` predicate to handle cases where an alias is
explicitly no longer applicable to an entity.
Changes:
- write_pipeline.py: extend _merge_alias_in_memory to process
`别名失效` edges — removes invalidated alias names from target
entity's aliases list in-memory before Neo4j write
- cypher_queries.py: add REMOVE_INVALID_ALIASES and DELETE_ALIAS_NODES
queries; update REDIRECT_ALIAS_EDGES to handle both `别名属于` and
`别名失效` predicates
- tasks.py: add step 1.5 in post_store_dedup_and_alias_merge_task to
execute REMOVE_INVALID_ALIASES and sync removals to PostgreSQL;
add step 3 to delete alias nodes after edge redirection; add
snapshot step 3.5 for post-merge entity state; pass snapshot_dir
to the task
- end_user_info_repository.py: add remove_aliases() method to remove
specified aliases from end_user_info.aliases (case-insensitive)
- write_snapshot_recorder.py: add save_alias_merge_result() static
method to write stage 8 snapshot after alias merge and deletion
- extract_triplet.jinja2: document `别名失效` predicate with usage
rules — only use when conversation explicitly negates an alias