""" IL-1β(Interleukin-1 beta) 증가시키는 음식/건강기능식품 연구 목적: PubMed에서 IL-1β를 증가시키는(염증 유발) 식품 관련 논문 검색 작성일: 2026-02-04 """ import sys import os # UTF-8 인코딩 강제 (Windows 한글 깨짐 방지) if sys.platform == 'win32': import io sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8') from Bio import Entrez from dotenv import load_dotenv load_dotenv() # NCBI Entrez 설정 Entrez.email = os.getenv('PUBMED_EMAIL', 'test@example.com') api_key = os.getenv('PUBMED_API_KEY') if api_key: Entrez.api_key = api_key def search_pubmed(query, max_results=10): """PubMed 논문 검색""" try: print("=" * 80) print(f"검색어: {query}") print("=" * 80) handle = Entrez.esearch( db="pubmed", term=query, retmax=max_results, sort="relevance" ) record = Entrez.read(handle) handle.close() pmids = record["IdList"] total_count = int(record["Count"]) print(f"[OK] 총 {total_count}건 검색됨, 상위 {len(pmids)}건 조회\n") return pmids except Exception as e: print(f"[ERROR] 검색 실패: {e}") return [] def fetch_paper_details(pmids): """PMID로 논문 상세 정보 가져오기""" try: handle = Entrez.efetch( db="pubmed", id=pmids, rettype="medline", retmode="xml" ) papers = Entrez.read(handle) handle.close() results = [] for idx, paper in enumerate(papers['PubmedArticle'], 1): article = paper['MedlineCitation']['Article'] pmid = str(paper['MedlineCitation']['PMID']) title = article.get('ArticleTitle', '') # 초록 추출 abstract_parts = article.get('Abstract', {}).get('AbstractText', []) full_abstract = "" if abstract_parts: if isinstance(abstract_parts, list): for part in abstract_parts: if hasattr(part, 'attributes') and 'Label' in part.attributes: label = part.attributes['Label'] full_abstract += f"\n\n**{label}**\n{str(part)}" else: full_abstract += f"\n{str(part)}" else: full_abstract = str(abstract_parts) # 메타데이터 journal = article.get('Journal', {}).get('Title', '') pub_date = article.get('Journal', {}).get('JournalIssue', {}).get('PubDate', {}) year = pub_date.get('Year', '') result = { 'pmid': pmid, 'title': title, 'abstract': full_abstract.strip(), 'journal': journal, 'year': year } results.append(result) # 출력 print(f"[{idx}] PMID: {pmid}") print(f"제목: {title}") print(f"저널: {journal} ({year})") print(f"링크: https://pubmed.ncbi.nlm.nih.gov/{pmid}/") print("-" * 80) print(f"초록:\n{full_abstract}") print("=" * 80) print() return results except Exception as e: print(f"[ERROR] 논문 정보 가져오기 실패: {e}") return [] def analyze_findings(papers): """연구 결과 분석 및 요약""" print("\n" + "=" * 80) print("IL-1β 증가시키는 식품 분석 결과") print("=" * 80) # 키워드 기반 분류 categories = { '고지방 식품': ['high-fat', 'fatty', 'saturated fat', 'trans fat', 'lipid'], '고당 식품': ['sugar', 'glucose', 'fructose', 'high-carbohydrate', 'sweetened'], '가공식품': ['processed', 'ultra-processed', 'refined', 'junk food'], '적색육': ['red meat', 'beef', 'pork', 'processed meat'], '알코올': ['alcohol', 'ethanol', 'drinking'], '염증 유발 오일': ['omega-6', 'vegetable oil', 'corn oil', 'soybean oil'], '기타': [] } findings = {cat: [] for cat in categories.keys()} for paper in papers: abstract_lower = paper['abstract'].lower() title_lower = paper['title'].lower() combined_text = title_lower + ' ' + abstract_lower # IL-1β 증가 관련 키워드 확인 if any(keyword in combined_text for keyword in ['increase', 'elevated', 'upregulated', 'higher']): if 'il-1' in combined_text or 'interleukin-1' in combined_text: # 카테고리 분류 categorized = False for category, keywords in categories.items(): if category == '기타': continue if any(keyword in combined_text for keyword in keywords): findings[category].append({ 'pmid': paper['pmid'], 'title': paper['title'], 'year': paper['year'] }) categorized = True break if not categorized: findings['기타'].append({ 'pmid': paper['pmid'], 'title': paper['title'], 'year': paper['year'] }) # 결과 출력 for category, papers_list in findings.items(): if papers_list: print(f"\n### {category} ({len(papers_list)}건)") for paper in papers_list: print(f" - [{paper['year']}] {paper['title']}") print(f" PMID: {paper['pmid']}") print("\n" + "=" * 80) def print_summary(): """연구 요약 및 GraphRAG 구조 제안""" print("\n" + "=" * 80) print("GraphRAG 지식 그래프 구조 제안") print("=" * 80) summary = ''' ## IL-1β 증가시키는 식품 GraphRAG 모델 ### 노드 타입 1. Food (음식) - name: "고지방 식품", "설탕", "가공육" 등 - category: "pro_inflammatory" 2. Biomarker (바이오마커) - name: "IL-1β" - type: "inflammatory_cytokine" 3. Disease (질병) - name: "만성 염증", "대사증후군", "심혈관질환" 4. Evidence (PubMed 논문) - pmid: "12345678" - reliability: 0.85 ### 관계 타입 1. INCREASES (음식 → IL-1β) - magnitude: "high", "moderate", "low" - mechanism: "AGE_formation", "oxidative_stress", "gut_microbiome" 2. ASSOCIATED_WITH (IL-1β → 질병) - strength: 0.8 3. SUPPORTED_BY (관계 → Evidence) - pmid: "12345678" ### Cypher 쿼리 예시 # 1. IL-1β를 증가시키는 모든 식품 조회 MATCH (food:Food)-[inc:INCREASES]->(il1b:Biomarker {name: 'IL-1β'}) OPTIONAL MATCH (inc)-[:SUPPORTED_BY]->(e:Evidence) RETURN food.name AS 식품, inc.magnitude AS 증가정도, inc.mechanism AS 메커니즘, e.pmid AS 근거논문 ORDER BY inc.magnitude DESC # 2. 고지방 식품 → IL-1β → 질병 경로 MATCH path = (food:Food {category: 'high_fat'}) -[:INCREASES]->(il1b:Biomarker {name: 'IL-1β'}) -[:ASSOCIATED_WITH]->(disease:Disease) RETURN food.name AS 식품, disease.name AS 질병, [node IN nodes(path) | node.name] AS 경로 # 3. 특정 환자에게 피해야 할 식품 추천 MATCH (patient:PatientProfile {conditions: ['chronic_inflammation']}) MATCH (food:Food)-[:INCREASES]->(il1b:Biomarker {name: 'IL-1β'}) -[:ASSOCIATED_WITH]->(disease:Disease) WHERE disease.name IN patient.conditions RETURN DISTINCT food.name AS 피해야할식품, disease.name AS 이유 ORDER BY food.name ### 약국 활용 시나리오 **시나리오 1: 만성 염증 환자 상담** ``` 환자: "관절염이 있는데 식습관 개선 방법이 있나요?" 약사 (시스템): "IL-1β 염증 지표를 증가시키는 다음 식품들을 피하세요: 1. 가공육 (베이컨, 소시지) - PMID:30371340 2. 설탕 함유 음료 - PMID:27959716 3. 트랜스지방 (마가린) - PMID:34559859 대신 오메가-3 (EPA/DHA) 보충제를 권장합니다." ``` **시나리오 2: 건강기능식품 업셀링** ``` 고객: "염증 줄이는 제품 있나요?" 약사 (시스템): "IL-1β 감소 효과가 있는 제품: 1. 오메가-3 1000mg (하루 2회) - IL-1β 30% 감소 (PMID:12345678) 2. 커큐민 500mg - NF-κB 억제로 IL-1β 감소 피해야 할 식품: - 고지방 패스트푸드 - 탄산음료 - 가공 스낵" ``` ''' print(summary) def main(): """메인 실행""" print("\n" + "=" * 80) print("IL-1β 증가시키는 음식/건강기능식품 연구") print("=" * 80) # 검색어 목록 queries = [ # 1. 고지방 식품 "high-fat diet AND interleukin-1 beta AND inflammation", # 2. 고당 식품 "sugar AND IL-1β AND inflammatory response", # 3. 가공식품 "processed food AND interleukin-1 AND pro-inflammatory", # 4. 적색육 "red meat AND IL-1β AND inflammation", # 5. 알코올 "alcohol AND interleukin-1 beta AND inflammation" ] all_papers = [] for query in queries: # PubMed 검색 pmids = search_pubmed(query, max_results=5) if not pmids: print(f"[WARNING] '{query}' 검색 결과 없음\n") continue # 논문 상세 정보 papers = fetch_paper_details(pmids) all_papers.extend(papers) # 결과 분석 if all_papers: analyze_findings(all_papers) print_summary() print("\n" + "=" * 80) print(f"총 {len(all_papers)}개 논문 분석 완료") print("=" * 80) else: print("\n[ERROR] 검색된 논문이 없습니다.") if __name__ == '__main__': main()