relationship_data.csv
症狀,檢查,疾病,藥品,宜喫,忌喫
"上下樓梯疼,不能久站,感覺有點腫","膝關節核磁","右膝髕上囊及關節腔少量積液","扶他林","西紅柿,香蕉","辣椒,大蒜"
"眼睛脹痛,乾澀,畏光,眼脹,眼痛,看東西有時候清楚有時候不清楚","視力,眼底","乾眼","施圖倫","胡蘿蔔,核桃仁,菠菜","海鮮,芥末"
關係:症狀-檢查
def generate_examine() -> list:
"""
關係:疾病-檢查
"""
rels_check = []
df = pd.read_csv('relationship_data.csv')
for idx, row in df.iterrows():
for symptom in row['檢查'].split(','):
for exam in row['症狀'].split(','):
rels_check.append([exam, symptom])
rels_check = deduplicate(rels_check)
return rels_check
def relationship_rels_check():
"""
# 創建關係
match(p:Symptom),(q:Examine) where p.name='上下樓梯疼' and q.name='膝關節核磁' create (p)-[rel:need_check{name:'症狀檢查'}]->(q)
# 刪除關係
MATCH(p: Symptom)-[r: need_check]-(q:Examine)
WHERE p.name = '上下樓梯疼' and q.name = '膝關節核磁'
DELETE r
"""
cql = "MATCH(p:Symptom)-[r:need_check]-(q:Examine) DELETE r"
neo4j.execute_write(cql)
print("刪除成功 => need_check")
# 症狀 需要 做哪些檢查
rels_check = generate_examine()
print(rels_check)
cql_list = generate_cql('Symptom', 'Examine', rels_check, 'need_check', '症狀檢查')
for cql in cql_list:
neo4j.execute_write(cql)
print(cql)
關係:疾病-症狀
def generate_symptom() -> list:
"""
關係:疾病-症狀 (疾病有哪些症狀)
"""
rels_check = []
df = pd.read_csv('relationship_data.csv')
for idx, row in df.iterrows():
for symptom in row['症狀'].split(','):
for exam in row['疾病'].split(','):
rels_check.append([exam, symptom])
rels_check = deduplicate(rels_check)
return rels_check
代碼重構
包括疾病用藥,食物能喫,食物不能喫的關係。
詳細代碼如下
import logging
from utils.neo4j_provider import neo4j
import pandas as pd
logging.root.setLevel(logging.INFO)
# 關係去重函數
def deduplicate(relation_old) -> list:
relation_new = []
for each in relation_old:
if each not in relation_new:
relation_new.append(each)
return relation_new
def generate_cql(start_node, end_node, edges, rel_type, rel_name) -> str:
"""
生成 CQL
"""
cql = []
for edge in edges:
p = edge[0]
q = edge[1]
# 創建關係的 Cypher 語句
cql.append(
"MATCH(p:%s),(q:%s) WHERE p.name='%s' and q.name='%s' CREATE (p)-[rel:%s{name:'%s'}]->(q)" % (start_node, end_node, p, q, rel_type, rel_name))
print('創建關係 {}-{}->{}'.format(p, rel_type, q))
return cql
def generate_relation(l_name, r_name) -> list:
relation_list = []
df = pd.read_csv('relationship_data.csv')
for idx, row in df.iterrows():
for l_node in row[l_name].split(','):
for r_node in row[r_name].split(','):
relation_list.append([l_node, r_node])
return deduplicate(relation_list)
def create_relationship(l_node, r_node, relationship, l_data_name, r_data_name, relation_name):
"""
創建關係
:param l_node: 左節點 name
:param r_node: 右節點 name
:param relationship: 關係
:param l_data_name: 左數據列名
:param r_data_name: 右數據列名
:param relation_name: 關係 name
:return:
"""
neo4j.delete_relationship(l_node, r_node, relationship)
relation_list = generate_relation(l_data_name, r_data_name)
print(relation_list)
cql_list = generate_cql(l_node, r_node, relation_list, relationship, relation_name)
for cql in cql_list:
neo4j.execute_write(cql)
print(cql)
def relationship_relation_check():
l_node = "Symptom"
r_node = "Examine"
relationship = "need_check"
l_data_name = '症狀'
r_data_name = '檢查'
rel_name = '症狀檢查'
create_relationship(l_node, r_node, relationship, l_data_name, r_data_name, rel_name)
def relationship_has_symptom():
l_node = "Disease"
r_node = "Symptom"
relationship = "has_symptom"
l_data_name = '疾病'
r_data_name = '症狀'
rel_name = '症狀'
create_relationship(l_node, r_node, relationship, l_data_name, r_data_name, rel_name)
def relationship_used_drugs():
l_node = "Disease"
r_node = "Drug"
relationship = "used_drugs"
l_data_name = '疾病'
r_data_name = '藥品'
rel_name = '常用藥品'
create_relationship(l_node, r_node, relationship, l_data_name, r_data_name, rel_name)
def relationship_doeat_foods():
l_node = "Disease"
r_node = "Foods"
relationship = "doeat_foods"
l_data_name = '疾病'
r_data_name = '宜喫'
rel_name = '推薦食物'
create_relationship(l_node, r_node, relationship, l_data_name, r_data_name, rel_name)
def relationship_noteat_foods():
l_node = "Disease"
r_node = "Foods"
relationship = "noteat_foods"
l_data_name = '疾病'
r_data_name = '忌喫'
rel_name = '忌喫食物'
create_relationship(l_node, r_node, relationship, l_data_name, r_data_name, rel_name)
if __name__ == "__main__":
# 有症狀需要做哪些檢查
relationship_relation_check()
# 疾病有哪些症狀
relationship_has_symptom()
# 疾病常用藥物
relationship_used_drugs()
# 推薦飲食
relationship_doeat_foods()
# 不宜飲食
relationship_noteat_foods()