import pyrustkmer
engine = pyrustkmer.PyDatabase(
"/Users/forrest/Data/data/kmer/K57/R1_K57_001.rkdb",
pyrustkmer.LoadMode.MemoryMapped,
)
print("=== 混合模式查询 ===")
print("注意: 模式长度必须匹配数据库k-mer大小")
try:
pattern = "AAAAAAAAAAAAAAAAAAAAA{N7}AAAAAAAAAAAAAAAAAAAAAAAAAAAAA" print(f"查询模式: {pattern}")
results = engine.query_hybrid(pattern)
print(f"查询成功!找到 {len(results)} 个匹配结果")
count = 0
for kmer, count_val in results.items():
print(f"{kmer}: {count_val}")
count += 1
if count >= 5: if len(results) > 5:
print(f"... 还有 {len(results) - 5} 个结果")
break
except Exception as e:
error_msg = str(e)
if "Pattern length" in error_msg and "does not match" in error_msg:
print(f"⚠️ 模式长度验证失败")
print(f" 错误: {error_msg}")
print(f" 提示: 请确保混合模式总长度等于数据库k-mer大小")
else:
print(f"❌ 混合查询失败: {e}")
print("\n=== 其他查询功能 ===")
prefix_results = engine.query_prefix("AAAAAAAAAAAAAAAAAAAAA")
print(f"前缀查询结果数量: {len(prefix_results.matches)}")
info = engine.database_info()
print(f"数据库信息: kmer_size={info['kmer_size']}, load_mode={info['load_mode']}")
pattern_info = engine.parse_pattern(
"AAAAAAAAAAAAAAAAAAAAA{N7}AAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
)
print(f"模式解析: {pattern_info}")
print("\n=== 批量查询示例 ===")
db_info = engine.database_info()
kmer_size = int(db_info["kmer_size"])
print(f"数据库k-mer大小: {kmer_size}")
batch_patterns = [
"AAAAAAAAAAAAAAAAAAAAA{N7}AAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAAAAAA{N8}AAAAAAAAAAAAAAAAAAAAAAAAAAAAA", "AAAAAAAAAAAAAAAAAAAAAAA{N6}AAAAAAAAAAAAAAAAAAAAAAAAAAAAA", ]
try:
batch_results = engine.query_hybrid_batch(batch_patterns)
for i, (pattern, results) in enumerate(zip(batch_patterns, batch_results)):
print(f"模式 {i + 1} ({pattern}): {len(results)} 个结果")
except Exception as e:
error_msg = str(e)
if "Pattern length" in error_msg and "does not match" in error_msg:
print(f"⚠️ 模式长度验证失败")
print(f" 提示: 混合模式总长度必须等于数据库k-mer大小 ({kmer_size})")
print(f" 格式: 前缀长度 + N数量 + 后缀长度 = {kmer_size}")
print(f" 例如: 对于k-mer大小57,'ATCG{{N49}}ATCG' (4+49+4=57) 是有效的")
else:
print(f"❌ 批量查询失败: {e}")
print("\n🎉 统一接口演示完成!")