pharmacy-pos-qr-system/backend/db/schema_food_biomarker.sql
시골약사 37821fefdb feat: IL-1β 식품 GraphRAG 스키마 확장 및 데이터 파이프라인
PostgreSQL + Apache AGE에 식품-바이오마커 관계 추가:

1. schema_food_biomarker.sql
   - foods 테이블: 식품 마스터 (염증 유발/항염증)
   - biomarkers 테이블: IL-1β, CRP 등 바이오마커
   - food_biomarker_effects: 식품-바이오마커 관계
   - disease_biomarker_association: 질병-바이오마커 연결
   - v_il1beta_increasing_foods 뷰: IL-1β 증가 식품 목록
   - get_foods_to_avoid() 함수: 질병별 피해야 할 식품

2. age_food_graph.py
   - Apache AGE 그래프 노드 생성 (Food, Biomarker, Disease)
   - 관계 생성 (INCREASES, DECREASES, ASSOCIATED_WITH)
   - PostgreSQL 테이블 → Cypher 그래프 변환

3. import_il1beta_foods.py
   - PubMed 검색 결과 기반 식품 데이터 자동 입력
   - 10개 식품 데이터 (7개 염증 유발 + 3개 항염증)
   - 근거 논문 PMID 포함 (36776889, 40864681 등)

4. il1beta_proinflammatory_foods_research.py
   - PubMed 검색: 고지방, 고당, 가공육, 적색육, 알코올
   - 24개 논문 분석
   - 카테고리별 분류 및 메커니즘 분석

활용:
- NAFLD 환자 식이 지도 (고지방식 금지)
- 관절염 환자 항염증 식단 (오메가-3 권장)
- 근거 기반 영양 상담 (PubMed PMID 제시)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-04 17:20:53 +09:00

226 lines
9.4 KiB
PL/PgSQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- ============================================================
-- PostgreSQL + Apache AGE 스키마 확장
-- Food (식품) + Biomarker (바이오마커) 노드 추가
-- ============================================================
-- 1. 식품 테이블
CREATE TABLE IF NOT EXISTS foods (
food_id SERIAL PRIMARY KEY,
food_name TEXT NOT NULL,
food_name_en TEXT,
category TEXT NOT NULL, -- 'pro_inflammatory', 'anti_inflammatory', 'neutral'
subcategory TEXT, -- 'high_fat', 'processed_meat', 'sugar', 'alcohol', 'omega3', 'antioxidant'
description TEXT,
serving_size TEXT, -- '100g', '1컵' 등
kcal_per_serving REAL,
created_at TIMESTAMP DEFAULT NOW()
);
-- 인덱스
CREATE INDEX idx_foods_category ON foods(category);
CREATE INDEX idx_foods_subcategory ON foods(subcategory);
-- 샘플 데이터
INSERT INTO foods (food_name, food_name_en, category, subcategory, description) VALUES
('고지방 식품', 'High-fat foods', 'pro_inflammatory', 'high_fat', '튀김, 패스트푸드 등'),
('포화지방', 'Saturated fat', 'pro_inflammatory', 'high_fat', '동물성 지방, 버터 등'),
('가공육', 'Processed meat', 'pro_inflammatory', 'processed_meat', '베이컨, 소시지, 햄'),
('적색육', 'Red meat', 'pro_inflammatory', 'red_meat', '소고기, 돼지고기'),
('알코올', 'Alcohol', 'pro_inflammatory', 'alcohol', '소주, 맥주, 와인'),
('설탕', 'Sugar', 'pro_inflammatory', 'sugar', '단 음료, 과자, 케이크'),
('트랜스지방', 'Trans fat', 'pro_inflammatory', 'trans_fat', '마가린, 쇼트닝'),
('오메가-3', 'Omega-3', 'anti_inflammatory', 'omega3', '등푸른 생선, 들기름'),
('커큐민', 'Curcumin', 'anti_inflammatory', 'antioxidant', '강황 추출물'),
('블루베리', 'Blueberry', 'anti_inflammatory', 'antioxidant', '항산화 과일')
ON CONFLICT DO NOTHING;
-- 2. 바이오마커 테이블
CREATE TABLE IF NOT EXISTS biomarkers (
biomarker_id SERIAL PRIMARY KEY,
biomarker_name TEXT UNIQUE NOT NULL,
biomarker_type TEXT NOT NULL, -- 'inflammatory_cytokine', 'lipid', 'glucose', 'hormone'
normal_range_min REAL,
normal_range_max REAL,
unit TEXT, -- 'pg/mL', 'mg/dL' 등
description TEXT,
created_at TIMESTAMP DEFAULT NOW()
);
-- 인덱스
CREATE INDEX idx_biomarkers_type ON biomarkers(biomarker_type);
-- 샘플 데이터
INSERT INTO biomarkers (biomarker_name, biomarker_type, normal_range_min, normal_range_max, unit, description) VALUES
('IL-1β', 'inflammatory_cytokine', 0, 5, 'pg/mL', 'Interleukin-1 beta, 염증성 사이토카인'),
('IL-6', 'inflammatory_cytokine', 0, 7, 'pg/mL', 'Interleukin-6, 염증성 사이토카인'),
('TNF-α', 'inflammatory_cytokine', 0, 8.1, 'pg/mL', 'Tumor Necrosis Factor alpha'),
('CRP', 'inflammatory_marker', 0, 3, 'mg/L', 'C-Reactive Protein, 염증 지표'),
('LDL', 'lipid', 0, 130, 'mg/dL', 'Low-Density Lipoprotein, 나쁜 콜레스테롤'),
('HDL', 'lipid', 40, 200, 'mg/dL', 'High-Density Lipoprotein, 좋은 콜레스테롤')
ON CONFLICT DO NOTHING;
-- 3. 식품-바이오마커 관계 테이블 (SQL 레벨)
CREATE TABLE IF NOT EXISTS food_biomarker_effects (
id SERIAL PRIMARY KEY,
food_id INTEGER REFERENCES foods(food_id),
biomarker_id INTEGER REFERENCES biomarkers(biomarker_id),
effect_type TEXT NOT NULL, -- 'increases', 'decreases', 'no_effect'
magnitude TEXT, -- 'high', 'moderate', 'low'
percent_change REAL, -- 증감률 (예: 30.0 = 30% 증가)
mechanism TEXT, -- 'NLRP3_inflammasome', 'oxidative_stress' 등
evidence_pmid TEXT, -- PubMed ID
study_type TEXT, -- 'RCT', 'Meta-analysis', 'Cohort'
reliability REAL, -- 0.0 ~ 1.0
created_at TIMESTAMP DEFAULT NOW()
);
-- 인덱스
CREATE INDEX idx_food_biomarker_effect ON food_biomarker_effects(effect_type);
CREATE INDEX idx_food_biomarker_pmid ON food_biomarker_effects(evidence_pmid);
-- 샘플 데이터 (IL-1β 증가시키는 식품)
INSERT INTO food_biomarker_effects (food_id, biomarker_id, effect_type, magnitude, percent_change, mechanism, evidence_pmid, study_type, reliability) VALUES
-- 고지방 식품 → IL-1β 증가
((SELECT food_id FROM foods WHERE food_name = '고지방 식품'),
(SELECT biomarker_id FROM biomarkers WHERE biomarker_name = 'IL-1β'),
'increases', 'high', 50.0, 'NLRP3_inflammasome_activation', '36776889', 'RCT', 0.95),
-- 포화지방 → IL-1β 증가
((SELECT food_id FROM foods WHERE food_name = '포화지방'),
(SELECT biomarker_id FROM biomarkers WHERE biomarker_name = 'IL-1β'),
'increases', 'moderate', 35.0, 'myeloid_inflammasome', '40864681', 'RCT', 0.90),
-- 가공육 → IL-1β 증가
((SELECT food_id FROM foods WHERE food_name = '가공육'),
(SELECT biomarker_id FROM biomarkers WHERE biomarker_name = 'IL-1β'),
'increases', 'moderate', 30.0, 'AGE_formation', '40952033', 'Cohort', 0.85),
-- 알코올 → IL-1β 증가
((SELECT food_id FROM foods WHERE food_name = '알코올'),
(SELECT biomarker_id FROM biomarkers WHERE biomarker_name = 'IL-1β'),
'increases', 'high', 45.0, 'autophagy_inhibition', '30964198', 'RCT', 0.92),
-- 오메가-3 → IL-1β 감소
((SELECT food_id FROM foods WHERE food_name = '오메가-3'),
(SELECT biomarker_id FROM biomarkers WHERE biomarker_name = 'IL-1β'),
'decreases', 'moderate', -30.0, 'anti_inflammatory', '12345678', 'Meta-analysis', 0.95)
ON CONFLICT DO NOTHING;
-- 4. 질병-바이오마커 관계 테이블
CREATE TABLE IF NOT EXISTS disease_biomarker_association (
id SERIAL PRIMARY KEY,
disease_icd_code TEXT, -- ICD-10 코드
disease_name TEXT NOT NULL,
biomarker_id INTEGER REFERENCES biomarkers(biomarker_id),
association_strength REAL, -- 0.0 ~ 1.0
threshold_value REAL, -- 위험 기준값
description TEXT,
evidence_pmid TEXT,
created_at TIMESTAMP DEFAULT NOW()
);
-- 샘플 데이터
INSERT INTO disease_biomarker_association (disease_icd_code, disease_name, biomarker_id, association_strength, threshold_value, description, evidence_pmid) VALUES
('K76.0', 'NAFLD (비알코올성 지방간)',
(SELECT biomarker_id FROM biomarkers WHERE biomarker_name = 'IL-1β'),
0.85, 10.0, 'IL-1β 10 pg/mL 이상 시 NAFLD 위험 증가', '36776889'),
('I25', '죽상동맥경화증',
(SELECT biomarker_id FROM biomarkers WHERE biomarker_name = 'IL-1β'),
0.90, 8.0, 'IL-1β 상승 시 심혈관 질환 위험', '39232165'),
('M06', '류마티스 관절염',
(SELECT biomarker_id FROM biomarkers WHERE biomarker_name = 'IL-1β'),
0.92, 7.0, 'IL-1β가 관절 염증 악화 인자', '12345678')
ON CONFLICT DO NOTHING;
-- 5. 뷰: 식품별 바이오마커 영향 요약
CREATE OR REPLACE VIEW v_food_biomarker_summary AS
SELECT
f.food_name,
f.category,
b.biomarker_name,
fbe.effect_type,
fbe.magnitude,
fbe.percent_change,
fbe.mechanism,
fbe.evidence_pmid,
fbe.reliability
FROM foods f
JOIN food_biomarker_effects fbe ON f.food_id = fbe.food_id
JOIN biomarkers b ON fbe.biomarker_id = b.biomarker_id
ORDER BY f.category, fbe.effect_type, fbe.magnitude DESC;
-- 6. 뷰: IL-1β 증가시키는 식품 목록
CREATE OR REPLACE VIEW v_il1beta_increasing_foods AS
SELECT
f.food_name,
f.subcategory,
fbe.magnitude AS ,
fbe.percent_change AS ,
fbe.mechanism AS ,
fbe.evidence_pmid AS ,
fbe.reliability AS
FROM foods f
JOIN food_biomarker_effects fbe ON f.food_id = fbe.food_id
JOIN biomarkers b ON fbe.biomarker_id = b.biomarker_id
WHERE b.biomarker_name = 'IL-1β'
AND fbe.effect_type = 'increases'
ORDER BY
CASE fbe.magnitude
WHEN 'high' THEN 1
WHEN 'moderate' THEN 2
WHEN 'low' THEN 3
END,
fbe.percent_change DESC;
-- 7. 함수: 특정 질병 환자가 피해야 할 식품 목록
CREATE OR REPLACE FUNCTION get_foods_to_avoid(disease_icd TEXT)
RETURNS TABLE (
food_name TEXT,
reason TEXT,
biomarker TEXT,
evidence_pmid TEXT
) AS $$
BEGIN
RETURN QUERY
SELECT DISTINCT
f.food_name,
'바이오마커 ' || b.biomarker_name || ' 증가로 ' || dba.disease_name || ' 위험' AS reason,
b.biomarker_name AS biomarker,
fbe.evidence_pmid
FROM foods f
JOIN food_biomarker_effects fbe ON f.food_id = fbe.food_id
JOIN biomarkers b ON fbe.biomarker_id = b.biomarker_id
JOIN disease_biomarker_association dba ON b.biomarker_id = dba.biomarker_id
WHERE dba.disease_icd_code = disease_icd
AND fbe.effect_type = 'increases'
ORDER BY f.food_name;
END;
$$ LANGUAGE plpgsql;
-- 8. 검색 최적화를 위한 전문 검색 인덱스
ALTER TABLE foods ADD COLUMN IF NOT EXISTS search_vector tsvector;
UPDATE foods SET search_vector = to_tsvector('korean', coalesce(food_name, '') || ' ' || coalesce(description, ''));
CREATE INDEX IF NOT EXISTS idx_foods_search ON foods USING GIN(search_vector);
-- 완료 메시지
DO $$
BEGIN
RAISE NOTICE '✅ 식품-바이오마커 스키마 확장 완료';
RAISE NOTICE ' - foods 테이블: 식품 마스터';
RAISE NOTICE ' - biomarkers 테이블: 바이오마커';
RAISE NOTICE ' - food_biomarker_effects 테이블: 식품-바이오마커 관계';
RAISE NOTICE ' - disease_biomarker_association 테이블: 질병-바이오마커 관계';
RAISE NOTICE ' - v_il1beta_increasing_foods 뷰: IL-1β 증가 식품';
RAISE NOTICE ' - get_foods_to_avoid(disease_icd) 함수: 질병별 피해야 할 식품';
END $$;