import re from flask import Blueprint, request, json from pyecharts import options as opts from pyecharts.charts import Graph as pg from app.model.base import dbconn, graph bp = Blueprint('search', __name__, url_prefix='/search') keyword = [] keyword_clinical = {} sql_str = 'SELECT clinical, keyword FROM keyword_clinical' rows = dbconn.query( sql=sql_str ) for val_keyword in rows: keyword.append(val_keyword['keyword']) keyword_clinical[val_keyword['keyword']] = val_keyword['clinical'] @bp.route('/illness_search', methods=['POST', 'GET']) def illness_search(): if request.method == 'POST': req = request.get_json() vocab_pattern = '|'.join(keyword) vocab_data = re.findall(vocab_pattern, req['search']) # search_data = search_keyword(vocab_data) search_data = [] for val1 in vocab_data: search_data.append(keyword_clinical[val1]) # strData = jieba.cut(data['search_str'], cut_all=False) # graph_sql = "match (n:`疾病(三)`) " # # for search_str in search_data: # if search_str == '': # continue # graph_sql += " with n match (n:`疾病(三)`)-[*1]->(a) where a.name='" + search_str + "' " # # graph_sql += " return n" # # graph_data = graph.run(graph_sql).data() illness_data = {} for search_str in search_data: if search_str == '': continue graph_sql = "match (n:`疾病(三)`)-[*1]->(a:`病症`) where a.name='" + search_str + "' return n" graph_data = graph.run(graph_sql).data() for val2 in graph_data: if val2['n']['name'] in illness_data.keys(): illness_data[val2['n']['name']]['num'] += 1 else: illness_data[val2['n']['name']] = {'num': 1, 'name': val2['n']['name']} if len(illness_data) == 0: return '' result = [] list_illness_data = list(illness_data) for key1 in list_illness_data: graph_sql2 = "match (a:`疾病(三)`)-[]->(m:`治疗方案`)-[]->(n:`药品`) where a.name='" + key1 + "' return m,n" graph_data2 = graph.run(graph_sql2).data() graph_sql3 = "match (a:`疾病(三)`)-[]->(m:`治疗方案`) where a.name='" + key1 + "' return m,n" graph_data3 = graph.run(graph_sql3).data() medicinal = {} for val2 in graph_data2: if val2['m']['name'] in medicinal.keys(): medicinal[val2['m']['name']].append(val2['n']['name']) else: medicinal[val2['m']['name']] = [val2['n']['name']] illness_data[key1]['treatment'] = medicinal result.append(illness_data[key1]) # print(result) return json.dumps(result) def testaaa(): illnessDict = {} # 疾病 symptomsDict = {} # 病症 shipsData = {} # 三元组 graph_sql = "match (n:`疾病(三)`)-[*1]->(a:`病症`) where a.name='" + search_str + "' return n" graph_data = graph.run(graph_sql).data() while graph_data.forward(): for relation in graph_data.current['p']: print(list(relation.types())) illness_node = relation.start_node symptoms_node = relation.end_node relation_type = list(relation.types())[0] illness_node_label = str(illness_node.labels).strip(":") symptoms_node_label = str(symptoms_node.labels).strip(":") # 存储三元组关系 if illness_node['id'] in shipsData.keys(): target_dict = shipsData.get(illness_node['id']) target_dict.setdefault(symptoms_node['id'], relation_type) else: target_dict = {symptoms_node['id']: relation_type} shipsData[illness_node['id']] = target_dict # 存储节点 if ("`疾病(三)`" == illness_node_label) and (illness_node['id'] not in illnessDict.keys()): illnessDict[illness_node['id']] = illness_node['name'] if ("病症" == symptoms_node_label) and (symptoms_node['id'] not in symptomsDict.keys()): symptomsDict[symptoms_node['id']] = symptoms_node['name'] json_list = [] for illness_key, value in shipsData.items(): for symptoms_key, rel_type in value.items(): result_dict = { 'illness': illnessDict[illness_key], 'rel_type': rel_type, 'symptoms': symptomsDict[symptoms_key] } json_list.append(result_dict) print(len(json_list)) for i in range(len(json_list)): print("{}-[{}]->{}".format(json_list[i]['illness'], json_list[i]['rel_type'], json_list[i]['symptoms'])) return json_list data_dict = set() nodes = [] links = [] for i in range(len(json_list)): if json_list[i]['illness'] not in data_dict: data_dict.add(json_list[i]['illness']) nodes.append({'name': json_list[i]['illness'], "symbolSize": 10, 'draggable': 'true'}) if json_list[i]['symptoms'] not in data_dict: data_dict.add(json_list[i]['symptoms']) nodes.append({'name': json_list[i]['symptoms'], "symbolSize": 10, 'draggable': 'true'}) links.append({'source': json_list[i]['illness'], 'target': json_list[i]['symptoms']}) pg_graph = pg(init_opts=opts.InitOpts(width='1000px', height='800px')) pg_graph.add("", nodes, links, repulsion=8000, edge_symbol=['', 'arrow']) pg_graph.set_global_opts(title_opts=opts.TitleOpts(title="病症对应的疾病")) # print('/'.join(strData)+"") # sql='SELECT d.id, d.drug_name,a.res FROM drug as d left join api as a on d.drug_name = a.param where d.id > 943' # drug = mysqlconn.query( # sql='SELECT d.id, d.disease_name FROM disease as d where d.id > 0' # ) # print(drug) # return render_template('index.html') return pg_graph.render_notebook() # return json.dumps(list(strData))