From 8996d95fa276bcb8c6384f3891122f659746dd70 Mon Sep 17 00:00:00 2001 From: hanyuqing <1106611654@qq.com> Date: Tue, 6 Jan 2026 13:09:03 +0800 Subject: [PATCH] all --- controller/GraphController.py | 56 ++++++++++++++++-- service/GraphService.py | 5 ++ util/neo4j_utils.py | 42 +++++++++++++ vue/src/api/graph.js | 20 +++++++ vue/src/system/GraphDemo.vue | 135 ++++++++++++++++++++++++++++++------------ vue/src/system/KGData.vue | 2 +- 6 files changed, 215 insertions(+), 45 deletions(-) diff --git a/controller/GraphController.py b/controller/GraphController.py index c16eb48..da6196a 100644 --- a/controller/GraphController.py +++ b/controller/GraphController.py @@ -11,7 +11,7 @@ from robyn import Robyn, jsonify, Response from typing import Optional, List, Any, Dict from service.GraphService import build_g6_subgraph_by_props, get_drug_names_from_neo4j, get_group_key, \ - get_check_names_from_neo4j + get_check_names_from_neo4j, get_disease_names_from_neo4j from util.neo4j_utils import Neo4jUtil from util.neo4j_utils import neo4j_client from util.redis_utils import set as redis_set, get as redis_get # 使用你已有的模块级 Redis 工 @@ -19,7 +19,7 @@ from util.redis_utils import set as redis_set, get as redis_get # 使用你已 # 缓存键 DRUG_TREE_KEY = "cache:drug_tree" CHECK_TREE_KEY = "cache:check_tree" - +DISEASE_TREE_KEY = "cache:disease_tree" # 👈 新增 # ======================== # 🔥 启动时预加载数据(在 app 启动前执行) # ======================== @@ -41,7 +41,7 @@ def preload_data(): for key in all_keys: if key in groups: children = [{"label": name, "type": "Drug"} for name in sorted(groups[key])] - tree_data.append({"label": key, "type": "Drug", "children": children}) + tree_data.append({"label": key, "children": children}) redis_set(DRUG_TREE_KEY, json.dumps(tree_data, ensure_ascii=False), ex=None) @@ -56,10 +56,23 @@ def preload_data(): for key in all_keys: if key in groups: children = [{"label": name, "type": "Check"} for name in sorted(groups[key])] - tree_data.append({"label": key, "type": "Check", "children": children}) + tree_data.append({"label": key, "children": children}) redis_set(CHECK_TREE_KEY, json.dumps(tree_data, ensure_ascii=False), ex=None) + names = get_disease_names_from_neo4j() + groups = {} + for name in names: + key = get_group_key(name) + groups.setdefault(key, []).append(name) + + tree_data = [] + for key in all_keys: + if key in groups: + children = [{"label": name, "type": "Disease"} for name in sorted(groups[key])] + tree_data.append({"label": key, "children": children}) + + redis_set(DISEASE_TREE_KEY, json.dumps(tree_data, ensure_ascii=False), ex=None) print("✅ 预加载完成!数据已写入 Redis 缓存。") except Exception as e: print(f"❌ 预加载失败: {e}", file=sys.stderr) @@ -229,8 +242,39 @@ def get_check_tree(): # description=json.dumps({"error": str(e)}, ensure_ascii=False), # headers={"Content-Type": "application/json; charset=utf-8"} # ) - - +@app.get("/api/disease-tree") +def get_disease_tree(): + return Response( + status_code=200, + description=redis_get(DISEASE_TREE_KEY), + headers={"Content-Type": "application/json; charset=utf-8"} + ) +@app.get("/api/disease-depart-tree") +def get_department_disease_tree(): + try: + tree_data = neo4j_client.get_department_disease_tree() + return Response( + status_code=200, + description=jsonify(tree_data), + headers={"Content-Type": "text/plain; charset=utf-8"} + ) + except Exception as e: + error_trace = traceback.format_exc() + print("Error in /api/tree:", error_trace) + return jsonify({"error": str(e)}), 500 +@app.get("/api/drug-subject-tree") +def get_drug_subject_tree(): + try: + tree_data = neo4j_client.get_subject_drug_tree() + return Response( + status_code=200, + description=jsonify(tree_data), + headers={"Content-Type": "text/plain; charset=utf-8"} + ) + except Exception as e: + error_trace = traceback.format_exc() + print("Error in /api/tree:", error_trace) + return jsonify({"error": str(e)}), 500 @app.get("/health") def health(): print(redis_get(DRUG_TREE_KEY)) diff --git a/service/GraphService.py b/service/GraphService.py index 541dbfb..9b695cb 100644 --- a/service/GraphService.py +++ b/service/GraphService.py @@ -149,6 +149,11 @@ def get_check_names_from_neo4j(): names.append(name) print(f"[DEBUG] Loaded {len(names)} check names from Neo4j") # 打印实际数量 return names + +def get_disease_names_from_neo4j(): + cypher = "MATCH (d:Disease) RETURN d.name AS name" + results = neo4j_client.execute_read(cypher) + return [record["name"] for record in results if record.get("name")] def get_group_key(name: str) -> str: if not name or not isinstance(name, str): return "其他" diff --git a/util/neo4j_utils.py b/util/neo4j_utils.py index 69608b0..75b46fe 100644 --- a/util/neo4j_utils.py +++ b/util/neo4j_utils.py @@ -650,6 +650,48 @@ class Neo4jUtil: conditions.append(f"{var}.`{k}` = ${param_key}") params[param_key] = v return " AND ".join(conditions), params + + def get_department_disease_tree(self): + """ + 查询所有科室及其关联的疾病,返回 el-tree 格式数据 + """ + cypher = """ + MATCH (d:Department)--(dis:Disease) + RETURN d.name AS dept_name, collect(dis.name) AS diseases + ORDER BY d.name + """ + results = self.execute_read(cypher) + + tree = [] + for record in results: + dept_node = { + "label": record["dept_name"], + "type": "Department", + "children": [{"label": name,"type": "Disease"} for name in record["diseases"]] + } + tree.append(dept_node) + return tree + + def get_subject_drug_tree(self): + """ + 查询所有药物分类(Subject)及其关联的药物(Drug),返回 el-tree 格式数据 + """ + cypher = """ + MATCH (s:Subject)--(d:Drug) + RETURN s.name AS subject_name, collect(d.name) AS drugs + ORDER BY s.name + """ + results = self.execute_read(cypher) + + tree = [] + for record in results: + subject_node = { + "label": record["subject_name"], + "type": "Subject", + "children": [{"label": name, "type": "Drug"} for name in record["drugs"]] + } + tree.append(subject_node) + return tree # ==================== 全局单例实例(自动初始化)==================== neo4j_client = Neo4jUtil( uri=NEO4J_URI, diff --git a/vue/src/api/graph.js b/vue/src/api/graph.js index 915a8ed..75fe973 100644 --- a/vue/src/api/graph.js +++ b/vue/src/api/graph.js @@ -47,3 +47,23 @@ export function getCheckTree() { method: 'get' }); } +export function getDiseaseDepartTree() { + return request({ + url: '/api/disease-depart-tree', + method: 'get' + }); +} + +export function getDiseaseTree() { + return request({ + url: '/api/disease-tree', + method: 'get' + }); +} + +export function getDrugSubjectTree() { + return request({ + url: '/api/drug-subject-tree', + method: 'get' + }); +} diff --git a/vue/src/system/GraphDemo.vue b/vue/src/system/GraphDemo.vue index f6743d1..48a6264 100644 --- a/vue/src/system/GraphDemo.vue +++ b/vue/src/system/GraphDemo.vue @@ -51,6 +51,37 @@ :class="{'radio-check': typeRadio === 'Check'}" >检查 + + +
+ + ICD10 + 科室 + 首字母 + + +
+
+ + 药物分类 + 首字母 + +
@@ -85,7 +116,15 @@