import json from collections import defaultdict def remove_duplicates(records): # 使用字典分组:key 为 (type, name) grouped = defaultdict(list) for record in records: t = record.get("type") n = record.get("name") if t is not None and n is not None: grouped[(t, n)].append(record) else: # 如果 type 或 name 缺失,直接保留(不参与去重) continue result = [] for key, items in grouped.items(): if len(items) == 1: result.append(items[0]) else: # 多条重复,需要筛选 # 优先:保留 attributes 中 "名称" 存在的记录 valid_items = [item for item in items if item.get("attributes", {}).get("名称")] if not valid_items: # 如果都没有 "名称",则从所有中选字段最多的 candidates = items else: candidates = valid_items # 从 candidates 中选择 attributes 非空字段最多的 best_record = max(candidates, key=lambda x: count_non_empty_attributes(x)) result.append(best_record) # 添加未被分组的(type/name 缺失的)原始记录 for record in records: t = record.get("type") n = record.get("name") if t is None or n is None: result.append(record) return result def count_non_empty_attributes(record): attrs = record.get("attributes", {}) if not isinstance(attrs, dict): return 0 # 统计非空、非None、非空字符串的字段数量 return sum(1 for v in attrs.values() if v not in [None, "", ""]) def deduplicate_relationships(relationships): """ 对 relationships 列表进行去重,基于 type、from_entity 和 to_entity 三个字段。 参数: relationships (list of dict): 包含关系记录的列表,每条记录为字典, 至少包含 'type', 'from_entity', 'to_entity' 三个键。 返回: list of dict: 去重后的列表,保留首次出现的记录。 """ seen = set() unique_relationships = [] for rel in relationships: # 构造一个不可变的元组作为唯一标识 key = (rel['type'], rel['from_entity'], rel['to_entity']) if key not in seen: seen.add(key) unique_relationships.append(rel) return unique_relationships