Browse Source

代码提交

SGTY 2 tháng trước cách đây
mục cha
commit
96f83277d7
34 tập tin đã thay đổi với 1987477 bổ sung6436 xóa
  1. 0 19
      community/community_report.md
  2. 4 2
      community/community_report.py
  3. 57 32
      community/graph_helper.py
  4. 1987359 1010
      community/web/cached_data/entities_med.json
  5. 0 1422
      community/web/cached_data/relationship_med.json
  6. 0 32
      community/web/cached_data/report/community_19.md
  7. 0 31
      community/web/cached_data/report/community_20.md
  8. 0 32
      community/web/cached_data/report/community_21.md
  9. 0 32
      community/web/cached_data/report/community_22.md
  10. 0 32
      community/web/cached_data/report/community_23.md
  11. 0 31
      community/web/cached_data/report/community_24.md
  12. 0 31
      community/web/cached_data/report/community_25.md
  13. 0 31
      community/web/cached_data/report/community_26.md
  14. 0 31
      community/web/cached_data/report/community_27.md
  15. 0 23
      community/web/cached_data/report/community_28.md
  16. 0 23
      community/web/cached_data/report/community_29.md
  17. 0 23
      community/web/cached_data/report/community_30.md
  18. 0 23
      community/web/cached_data/report/community_31.md
  19. 0 23
      community/web/cached_data/report/community_32.md
  20. 0 23
      community/web/cached_data/report/community_33.md
  21. 0 23
      community/web/cached_data/report/community_34.md
  22. 0 23
      community/web/cached_data/report/community_35.md
  23. 0 23
      community/web/cached_data/report/community_36.md
  24. 0 23
      community/web/cached_data/report/community_37.md
  25. 0 23
      community/web/cached_data/report/community_38.md
  26. 0 23
      community/web/cached_data/report/community_39.md
  27. 0 23
      community/web/cached_data/report/community_40.md
  28. 3 1
      main.py
  29. 6 0
      router/text_search.py
  30. 37 1
      service/kg_node_service.py
  31. 0 1934
      tests/community/web/cached_data/entities_med.json
  32. 0 1422
      tests/community/web/cached_data/relationship_med.json
  33. 5 5
      utils/file_reader.py
  34. 6 6
      utils/vector_distance.py

+ 0 - 19
community/community_report.md

@@ -1,19 +0,0 @@
-# 疾病图谱关系社区分析报告
-
-**生成时间**: 2025-03-24 20:59:02
-
-**检测算法**: Leiden Algorithm
-
-**算法参数**:
-
-- 分辨率参数: 0.070
-
-**社区数量**: 90
-
-**模块度(Q)**: 208.2400
-
-
-## 社区结构分析
-
-
-## 可视化分析

+ 4 - 2
community/community_report.py

@@ -143,7 +143,9 @@ def generate_report(G, partition):
         member_count = 0
         for member in members:
             if member_count < 8:
-                member_names += member['name'] + '_'
+                #member['name']如果有会导致文件名报错的字符,需要去除
+                member_name = member['name'].replace('\\', '').replace('/', '').replace(':', '').replace('*', '').replace('?', '').replace('"', '').replace('<', '').replace('>', '').replace('|', '')
+                member_names += member_name + '_'
                 member_count += 1
             com_report.append(f"- {member['name']} ({member['type']})")
             if REPORT_INCLUDE_DETAILS == False:
@@ -172,7 +174,7 @@ def generate_report(G, partition):
         if density < DENSITY:
             com_report.append("**社区内部连接相对稀疏**\n")
         else:
-            with open(f"{REPORT_PATH}\社区_{member_names}{comm_id}.md", "w", encoding="utf-8") as f:
+            with open(f"{REPORT_PATH}\{member_names}{comm_id}.md", "w", encoding="utf-8") as f:
                 f.write("\n".join(com_report))
         print(f"社区 {comm_id+1} 报告文件大小:{len(''.join(com_report).encode('utf-8'))} 字节")  # 添加文件生成验证
     

+ 57 - 32
community/graph_helper.py

@@ -18,6 +18,9 @@ import leidenalg
 import igraph as ig
 import sys,os
 
+from db.session import get_db
+from service.kg_node_service import KGNodeService
+
 # 当前工作路径
 current_path = os.getcwd()
 sys.path.append(current_path)
@@ -26,7 +29,7 @@ sys.path.append(current_path)
 RESOLUTION = 0.07
 
 # 图谱数据缓存路径(由dump_graph_data.py生成)
-CACHED_DATA_PATH = f"{current_path}\\web\\cached_data"
+CACHED_DATA_PATH = os.path.join(current_path, 'community', 'web', 'cached_data')
 
 def load_entity_data():
     """
@@ -36,7 +39,7 @@ def load_entity_data():
         list: 实体数据列表,每个元素格式为[node_id, attributes_dict]
     """
     print("load entity data")
-    with open(f"{CACHED_DATA_PATH}\\entities_med.json", "r", encoding="utf-8") as f:
+    with open(os.path.join(CACHED_DATA_PATH,'entities_med.json'), "r", encoding="utf-8") as f:
         entities = json.load(f)
         return entities
 
@@ -51,18 +54,19 @@ def load_relation_data(g):
         1. 支持分块加载多个关系文件(relationship_med_0.json ~ relationship_med_29.json)
         2. 每个关系项格式为[source, target, {relation_attrs}]
     """
-    #for i in range(30):
-        #if os.path.exists(f"{CACHED_DATA_PATH}\\relationship_med_{i}.json"):
-            #print("load entity data", f"{CACHED_DATA_PATH}\\relationship_med_{i}.json")
-            #with open(f"{CACHED_DATA_PATH}\\relationship_med_{i}.json", "r", encoding="utf-8") as f:
-    if os.path.exists(f"{CACHED_DATA_PATH}\\relationship_med.json"):
-        print("load entity data", f"{CACHED_DATA_PATH}\\relationship_med_.json")
-        with open(f"{CACHED_DATA_PATH}\\relationship_med.json", "r", encoding="utf-8") as f:
-            relations = json.load(f)
-            for item in relations:                    
-                # 添加带权重的边,并存储关系属性
-                weight = int(item[2].pop('weight').replace('权重:', ''))
-                g.add_edge(item[0], item[1], weight=weight, **item[2])
+    for i in range(90):
+        if os.path.exists(os.path.join(CACHED_DATA_PATH, f"relationship_med_{i}.json")):
+            print("load entity data", os.path.join(CACHED_DATA_PATH, f"relationship_med_{i}.json"))
+            with open(os.path.join(CACHED_DATA_PATH, f"relationship_med_{i}.json"), "r", encoding="utf-8") as f:
+       
+                relations = json.load(f)
+                for item in relations:
+                    # 添加带权重的边,并存储关系属性
+                    weight = int(item[2].pop('weight', '8').replace('权重:', ''))
+                    #如果item[0]或者item[1]为空或null,则跳过
+                    if item[0] is None or item[1] is None:
+                        continue
+                    g.add_edge(item[0], item[1], weight=weight, **item[2])
 
 class GraphHelper:
     """
@@ -110,6 +114,23 @@ class GraphHelper:
         # 加载边数据(疾病-症状关系等)
         load_relation_data(self.graph)
 
+    def node_search2(self, node_id=None, node_type=None, filters=None, limit=1, min_degree=None):
+        """节点检索功能"""
+
+        kg_node_service = KGNodeService(next(get_db()))
+        es_result = kg_node_service.search_title_index("graph_entity_index", node_id, limit)
+        results = []
+        for item in es_result:
+            n = self.graph.nodes.get(item["title"])
+            score = item["score"]
+            if n:
+                results.append({
+                    'id': item["title"],
+                    'score': score,
+                    **n
+                })
+        return results
+
     def node_search(self, node_id=None, node_type=None, filters=None):
         """节点检索
         
@@ -161,25 +182,29 @@ class GraphHelper:
         relations = []
         
         while queue:
-            current = queue.pop(0)
-            current_hop = visited[current]
-            
-            if current_hop >= hops:
-                continue
-            
-            # 遍历相邻节点
-            for neighbor in self.graph.neighbors(current):
-                if neighbor not in visited:
-                    visited[neighbor] = current_hop + 1
-                    queue.append(neighbor)
+            try:
+                current = queue.pop(0)
+                current_hop = visited[current]
                 
-                # 记录边关系
-                edge_data = self.graph.get_edge_data(current, neighbor)
-                relations.append({
-                    'src_name': current,
-                    'dest_name': neighbor,
-                    **edge_data
-                })
+                if current_hop >= hops:
+                    continue
+                
+                # 遍历相邻节点
+                for neighbor in self.graph.neighbors(current):
+                    if neighbor not in visited:
+                        visited[neighbor] = current_hop + 1
+                        queue.append(neighbor)
+                    
+                    # 记录边关系
+                    edge_data = self.graph.get_edge_data(current, neighbor)
+                    relations.append({
+                        'src_name': current,
+                        'dest_name': neighbor,
+                        **edge_data
+                    })
+            except Exception as e:
+                print(f"Error processing node {current}: {str(e)}")
+                continue
         
         # 提取邻居实体(排除中心节点)
         entities = [

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 1987359 - 1010
community/web/cached_data/entities_med.json


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 1422
community/web/cached_data/relationship_med.json


+ 0 - 32
community/web/cached_data/report/community_19.md

@@ -1,32 +0,0 @@
-### 第20号社区报告 
-**类型分布**:
-- 患者类型: 1 个 (33%)
-- 医疗机构部门: 1 个 (33%)
-- 医疗设施: 1 个 (33%)
-
-**成员节点**:
-- 发热病人 (患者类型)
-- 发热门诊 (医疗机构部门)
-- 隔离病房 (医疗设施)
-
-**成员节点关系**:
-
-- 发热病人 (患者类型)
-	- 相关节点
-		- 发热门诊 (医疗机构部门)
-		- 隔离病房 (医疗设施)
-	- 相关关系
-		- 发热病人-(进入)->发热门诊
-		- 发热病人-(进入)->隔离病房
-- 发热门诊 (医疗机构部门)
-	- 相关节点
-		- 发热病人 (患者类型)
-	- 相关关系
-		- 发热门诊-(进入)->发热病人
-- 隔离病房 (医疗设施)
-	- 相关节点
-		- 发热病人 (患者类型)
-	- 相关关系
-		- 隔离病房-(进入)->发热病人
-
-**内部连接密度**: 0.67

+ 0 - 31
community/web/cached_data/report/community_20.md

@@ -1,31 +0,0 @@
-### 第21号社区报告 
-**类型分布**:
-- 治疗方法: 2 个 (67%)
-- 病理状态: 1 个 (33%)
-
-**成员节点**:
-- 外科引流 (治疗方法)
-- 手术治疗 (治疗方法)
-- 浅表性局限性脓肿或深部组织、器官感染 (病理状态)
-
-**成员节点关系**:
-
-- 外科引流 (治疗方法)
-	- 相关节点
-		- 浅表性局限性脓肿或深部组织、器官感染 (病理状态)
-	- 相关关系
-		- 外科引流-(治疗无效时采取)->浅表性局限性脓肿或深部组织、器官感染
-- 手术治疗 (治疗方法)
-	- 相关节点
-		- 浅表性局限性脓肿或深部组织、器官感染 (病理状态)
-	- 相关关系
-		- 手术治疗-(治疗无效时考虑)->浅表性局限性脓肿或深部组织、器官感染
-- 浅表性局限性脓肿或深部组织、器官感染 (病理状态)
-	- 相关节点
-		- 外科引流 (治疗方法)
-		- 手术治疗 (治疗方法)
-	- 相关关系
-		- 浅表性局限性脓肿或深部组织、器官感染-(治疗无效时采取)->外科引流
-		- 浅表性局限性脓肿或深部组织、器官感染-(治疗无效时考虑)->手术治疗
-
-**内部连接密度**: 0.67

+ 0 - 32
community/web/cached_data/report/community_21.md

@@ -1,32 +0,0 @@
-### 第22号社区报告 
-**类型分布**:
-- 患者类型: 1 个 (33%)
-- 治疗方法: 1 个 (33%)
-- 药物类别: 1 个 (33%)
-
-**成员节点**:
-- 休克病人 (患者类型)
-- 液体复苏 (治疗方法)
-- 血管活性药物 (药物类别)
-
-**成员节点关系**:
-
-- 休克病人 (患者类型)
-	- 相关节点
-		- 液体复苏 (治疗方法)
-		- 血管活性药物 (药物类别)
-	- 相关关系
-		- 休克病人-(需要)->液体复苏
-		- 休克病人-(必要时使用)->血管活性药物
-- 液体复苏 (治疗方法)
-	- 相关节点
-		- 休克病人 (患者类型)
-	- 相关关系
-		- 液体复苏-(需要)->休克病人
-- 血管活性药物 (药物类别)
-	- 相关节点
-		- 休克病人 (患者类型)
-	- 相关关系
-		- 血管活性药物-(必要时使用)->休克病人
-
-**内部连接密度**: 0.67

+ 0 - 32
community/web/cached_data/report/community_22.md

@@ -1,32 +0,0 @@
-### 第23号社区报告 
-**类型分布**:
-- 患者类型: 1 个 (33%)
-- 医疗手段: 1 个 (33%)
-- 治疗方法: 1 个 (33%)
-
-**成员节点**:
-- 气道阻塞病人 (患者类型)
-- 人工气道 (医疗手段)
-- 机械通气治疗 (治疗方法)
-
-**成员节点关系**:
-
-- 气道阻塞病人 (患者类型)
-	- 相关节点
-		- 人工气道 (医疗手段)
-		- 机械通气治疗 (治疗方法)
-	- 相关关系
-		- 气道阻塞病人-(需要)->人工气道
-		- 气道阻塞病人-(呼吸衰竭时给予)->机械通气治疗
-- 人工气道 (医疗手段)
-	- 相关节点
-		- 气道阻塞病人 (患者类型)
-	- 相关关系
-		- 人工气道-(需要)->气道阻塞病人
-- 机械通气治疗 (治疗方法)
-	- 相关节点
-		- 气道阻塞病人 (患者类型)
-	- 相关关系
-		- 机械通气治疗-(呼吸衰竭时给予)->气道阻塞病人
-
-**内部连接密度**: 0.67

+ 0 - 32
community/web/cached_data/report/community_23.md

@@ -1,32 +0,0 @@
-### 第24号社区报告 
-**类型分布**:
-- 医疗信息: 1 个 (33%)
-- 医疗手段: 1 个 (33%)
-- 医学过程: 1 个 (33%)
-
-**成员节点**:
-- 病史 (医疗信息)
-- 辅助检查 (医疗手段)
-- 明确诊断 (医学过程)
-
-**成员节点关系**:
-
-- 病史 (医疗信息)
-	- 相关节点
-		- 明确诊断 (医学过程)
-	- 相关关系
-		- 病史-(用于)->明确诊断
-- 辅助检查 (医疗手段)
-	- 相关节点
-		- 明确诊断 (医学过程)
-	- 相关关系
-		- 辅助检查-(帮助)->明确诊断
-- 明确诊断 (医学过程)
-	- 相关节点
-		- 病史 (医疗信息)
-		- 辅助检查 (医疗手段)
-	- 相关关系
-		- 明确诊断-(用于)->病史
-		- 明确诊断-(帮助)->辅助检查
-
-**内部连接密度**: 0.67

+ 0 - 31
community/web/cached_data/report/community_24.md

@@ -1,31 +0,0 @@
-### 第25号社区报告 
-**类型分布**:
-- 疾病: 2 个 (67%)
-- 症状/体征: 1 个 (33%)
-
-**成员节点**:
-- 中枢性神经系统感染 (疾病)
-- 甲状腺功能减退 (疾病)
-- 绝对缓脉 (症状/体征)
-
-**成员节点关系**:
-
-- 中枢性神经系统感染 (疾病)
-	- 相关节点
-		- 绝对缓脉 (症状/体征)
-	- 相关关系
-		- 中枢性神经系统感染-(出现)->绝对缓脉
-- 甲状腺功能减退 (疾病)
-	- 相关节点
-		- 绝对缓脉 (症状/体征)
-	- 相关关系
-		- 甲状腺功能减退-(出现)->绝对缓脉
-- 绝对缓脉 (症状/体征)
-	- 相关节点
-		- 中枢性神经系统感染 (疾病)
-		- 甲状腺功能减退 (疾病)
-	- 相关关系
-		- 绝对缓脉-(出现)->中枢性神经系统感染
-		- 绝对缓脉-(出现)->甲状腺功能减退
-
-**内部连接密度**: 0.67

+ 0 - 31
community/web/cached_data/report/community_25.md

@@ -1,31 +0,0 @@
-### 第26号社区报告 
-**类型分布**:
-- 疾病: 2 个 (67%)
-- 医学概念: 1 个 (33%)
-
-**成员节点**:
-- 中耳炎 (疾病)
-- 鼻窦炎 (疾病)
-- 感染性病灶 (医学概念)
-
-**成员节点关系**:
-
-- 中耳炎 (疾病)
-	- 相关节点
-		- 感染性病灶 (医学概念)
-	- 相关关系
-		- 中耳炎-(是)->感染性病灶
-- 鼻窦炎 (疾病)
-	- 相关节点
-		- 感染性病灶 (医学概念)
-	- 相关关系
-		- 鼻窦炎-(是)->感染性病灶
-- 感染性病灶 (医学概念)
-	- 相关节点
-		- 中耳炎 (疾病)
-		- 鼻窦炎 (疾病)
-	- 相关关系
-		- 感染性病灶-(是)->中耳炎
-		- 感染性病灶-(是)->鼻窦炎
-
-**内部连接密度**: 0.67

+ 0 - 31
community/web/cached_data/report/community_26.md

@@ -1,31 +0,0 @@
-### 第27号社区报告 
-**类型分布**:
-- 疾病: 2 个 (67%)
-- 症状: 1 个 (33%)
-
-**成员节点**:
-- 颈关节疾病 (疾病)
-- 帕金森病 (疾病)
-- 颈部僵硬 (症状)
-
-**成员节点关系**:
-
-- 颈关节疾病 (疾病)
-	- 相关节点
-		- 颈部僵硬 (症状)
-	- 相关关系
-		- 颈关节疾病-(导致)->颈部僵硬
-- 帕金森病 (疾病)
-	- 相关节点
-		- 颈部僵硬 (症状)
-	- 相关关系
-		- 帕金森病-(导致)->颈部僵硬
-- 颈部僵硬 (症状)
-	- 相关节点
-		- 颈关节疾病 (疾病)
-		- 帕金森病 (疾病)
-	- 相关关系
-		- 颈部僵硬-(导致)->颈关节疾病
-		- 颈部僵硬-(导致)->帕金森病
-
-**内部连接密度**: 0.67

+ 0 - 31
community/web/cached_data/report/community_27.md

@@ -1,31 +0,0 @@
-### 第28号社区报告 
-**类型分布**:
-- 检查指标: 2 个 (67%)
-- 生理机能: 1 个 (33%)
-
-**成员节点**:
-- 免疫球蛋白 (检查指标)
-- T细胞亚群 (检查指标)
-- 免疫功能 (生理机能)
-
-**成员节点关系**:
-
-- 免疫球蛋白 (检查指标)
-	- 相关节点
-		- 免疫功能 (生理机能)
-	- 相关关系
-		- 免疫球蛋白-(有助于评价)->免疫功能
-- T细胞亚群 (检查指标)
-	- 相关节点
-		- 免疫功能 (生理机能)
-	- 相关关系
-		- T细胞亚群-(有助于评价)->免疫功能
-- 免疫功能 (生理机能)
-	- 相关节点
-		- 免疫球蛋白 (检查指标)
-		- T细胞亚群 (检查指标)
-	- 相关关系
-		- 免疫功能-(有助于评价)->免疫球蛋白
-		- 免疫功能-(有助于评价)->T细胞亚群
-
-**内部连接密度**: 0.67

+ 0 - 23
community/web/cached_data/report/community_28.md

@@ -1,23 +0,0 @@
-### 第29号社区报告 
-**类型分布**:
-- 职业类别: 1 个 (50%)
-- 未分类: 1 个 (50%)
-
-**成员节点**:
-- 医护人员 (职业类别)
-- 《中华人民共和国传染病防治法》 (未分类)
-
-**成员节点关系**:
-
-- 医护人员 (职业类别)
-	- 相关节点
-		- 《中华人民共和国传染病防治法》 (未分类)
-	- 相关关系
-		- 医护人员-(遵循)->《中华人民共和国传染病防治法》
-- 《中华人民共和国传染病防治法》 (未分类)
-	- 相关节点
-		- 医护人员 (职业类别)
-	- 相关关系
-		- 《中华人民共和国传染病防治法》-(遵循)->医护人员
-
-**内部连接密度**: 1.00

+ 0 - 23
community/web/cached_data/report/community_29.md

@@ -1,23 +0,0 @@
-### 第30号社区报告 
-**类型分布**:
-- 疾病: 1 个 (50%)
-- 检查方法: 1 个 (50%)
-
-**成员节点**:
-- 脓毒症 (疾病)
-- 炎症标志物检查 (检查方法)
-
-**成员节点关系**:
-
-- 脓毒症 (疾病)
-	- 相关节点
-		- 炎症标志物检查 (检查方法)
-	- 相关关系
-		- 脓毒症-(用于诊断)->炎症标志物检查
-- 炎症标志物检查 (检查方法)
-	- 相关节点
-		- 脓毒症 (疾病)
-	- 相关关系
-		- 炎症标志物检查-(用于诊断)->脓毒症
-
-**内部连接密度**: 1.00

+ 0 - 23
community/web/cached_data/report/community_30.md

@@ -1,23 +0,0 @@
-### 第31号社区报告 
-**类型分布**:
-- 药物: 1 个 (50%)
-- 药物类别: 1 个 (50%)
-
-**成员节点**:
-- 赖氨匹林 (药物)
-- 解热药物 (药物类别)
-
-**成员节点关系**:
-
-- 赖氨匹林 (药物)
-	- 相关节点
-		- 解热药物 (药物类别)
-	- 相关关系
-		- 赖氨匹林-(属于)->解热药物
-- 解热药物 (药物类别)
-	- 相关节点
-		- 赖氨匹林 (药物)
-	- 相关关系
-		- 解热药物-(属于)->赖氨匹林
-
-**内部连接密度**: 1.00

+ 0 - 23
community/web/cached_data/report/community_31.md

@@ -1,23 +0,0 @@
-### 第32号社区报告 
-**类型分布**:
-- 人群分类: 1 个 (50%)
-- 生理过程: 1 个 (50%)
-
-**成员节点**:
-- 老年病人 (人群分类)
-- 退热过程 (生理过程)
-
-**成员节点关系**:
-
-- 老年病人 (人群分类)
-	- 相关节点
-		- 退热过程 (生理过程)
-	- 相关关系
-		- 老年病人-(需要特别注意)->退热过程
-- 退热过程 (生理过程)
-	- 相关节点
-		- 老年病人 (人群分类)
-	- 相关关系
-		- 退热过程-(需要特别注意)->老年病人
-
-**内部连接密度**: 1.00

+ 0 - 23
community/web/cached_data/report/community_32.md

@@ -1,23 +0,0 @@
-### 第33号社区报告 
-**类型分布**:
-- 患者类型: 1 个 (50%)
-- 药物类别: 1 个 (50%)
-
-**成员节点**:
-- 高热惊厥或谵妄者 (患者类型)
-- 镇静药物 (药物类别)
-
-**成员节点关系**:
-
-- 高热惊厥或谵妄者 (患者类型)
-	- 相关节点
-		- 镇静药物 (药物类别)
-	- 相关关系
-		- 高热惊厥或谵妄者-(可酌情使用)->镇静药物
-- 镇静药物 (药物类别)
-	- 相关节点
-		- 高热惊厥或谵妄者 (患者类型)
-	- 相关关系
-		- 镇静药物-(可酌情使用)->高热惊厥或谵妄者
-
-**内部连接密度**: 1.00

+ 0 - 23
community/web/cached_data/report/community_33.md

@@ -1,23 +0,0 @@
-### 第34号社区报告 
-**类型分布**:
-- 症状: 1 个 (50%)
-- 疾病类别: 1 个 (50%)
-
-**成员节点**:
-- 颈项强直 (症状)
-- 中枢神经系统感染 (疾病类别)
-
-**成员节点关系**:
-
-- 颈项强直 (症状)
-	- 相关节点
-		- 中枢神经系统感染 (疾病类别)
-	- 相关关系
-		- 颈项强直-(常见于)->中枢神经系统感染
-- 中枢神经系统感染 (疾病类别)
-	- 相关节点
-		- 颈项强直 (症状)
-	- 相关关系
-		- 中枢神经系统感染-(常见于)->颈项强直
-
-**内部连接密度**: 1.00

+ 0 - 23
community/web/cached_data/report/community_34.md

@@ -1,23 +0,0 @@
-### 第35号社区报告 
-**类型分布**:
-- 医疗检查: 1 个 (50%)
-- 医学检查结果: 1 个 (50%)
-
-**成员节点**:
-- 全身体格检查 (医疗检查)
-- 阳性体征 (医学检查结果)
-
-**成员节点关系**:
-
-- 全身体格检查 (医疗检查)
-	- 相关节点
-		- 阳性体征 (医学检查结果)
-	- 相关关系
-		- 全身体格检查-(能发现)->阳性体征
-- 阳性体征 (医学检查结果)
-	- 相关节点
-		- 全身体格检查 (医疗检查)
-	- 相关关系
-		- 阳性体征-(能发现)->全身体格检查
-
-**内部连接密度**: 1.00

+ 0 - 23
community/web/cached_data/report/community_35.md

@@ -1,23 +0,0 @@
-### 第36号社区报告 
-**类型分布**:
-- 检查方法: 1 个 (50%)
-- 病理状态: 1 个 (50%)
-
-**成员节点**:
-- 生化检查 (检查方法)
-- 器官功能障碍 (病理状态)
-
-**成员节点关系**:
-
-- 生化检查 (检查方法)
-	- 相关节点
-		- 器官功能障碍 (病理状态)
-	- 相关关系
-		- 生化检查-(用于评估)->器官功能障碍
-- 器官功能障碍 (病理状态)
-	- 相关节点
-		- 生化检查 (检查方法)
-	- 相关关系
-		- 器官功能障碍-(用于评估)->生化检查
-
-**内部连接密度**: 1.00

+ 0 - 23
community/web/cached_data/report/community_36.md

@@ -1,23 +0,0 @@
-### 第37号社区报告 
-**类型分布**:
-- 检查方法: 1 个 (50%)
-- 疾病: 1 个 (50%)
-
-**成员节点**:
-- 血常规 (检查方法)
-- 细菌感染 (疾病)
-
-**成员节点关系**:
-
-- 血常规 (检查方法)
-	- 相关节点
-		- 细菌感染 (疾病)
-	- 相关关系
-		- 血常规-(用于判断)->细菌感染
-- 细菌感染 (疾病)
-	- 相关节点
-		- 血常规 (检查方法)
-	- 相关关系
-		- 细菌感染-(用于判断)->血常规
-
-**内部连接密度**: 1.00

+ 0 - 23
community/web/cached_data/report/community_37.md

@@ -1,23 +0,0 @@
-### 第38号社区报告 
-**类型分布**:
-- 检查方法: 1 个 (50%)
-- 疾病: 1 个 (50%)
-
-**成员节点**:
-- 尿常规 (检查方法)
-- 泌尿系统感染 (疾病)
-
-**成员节点关系**:
-
-- 尿常规 (检查方法)
-	- 相关节点
-		- 泌尿系统感染 (疾病)
-	- 相关关系
-		- 尿常规-(用于诊断)->泌尿系统感染
-- 泌尿系统感染 (疾病)
-	- 相关节点
-		- 尿常规 (检查方法)
-	- 相关关系
-		- 泌尿系统感染-(用于诊断)->尿常规
-
-**内部连接密度**: 1.00

+ 0 - 23
community/web/cached_data/report/community_38.md

@@ -1,23 +0,0 @@
-### 第39号社区报告 
-**类型分布**:
-- 检查方法: 1 个 (50%)
-- 诊断方法: 1 个 (50%)
-
-**成员节点**:
-- 血清抗体检查 (检查方法)
-- 病原学诊断 (诊断方法)
-
-**成员节点关系**:
-
-- 血清抗体检查 (检查方法)
-	- 相关节点
-		- 病原学诊断 (诊断方法)
-	- 相关关系
-		- 血清抗体检查-(帮助明确)->病原学诊断
-- 病原学诊断 (诊断方法)
-	- 相关节点
-		- 血清抗体检查 (检查方法)
-	- 相关关系
-		- 病原学诊断-(帮助明确)->血清抗体检查
-
-**内部连接密度**: 1.00

+ 0 - 23
community/web/cached_data/report/community_39.md

@@ -1,23 +0,0 @@
-### 第40号社区报告 
-**类型分布**:
-- 人群分类: 1 个 (50%)
-- 检查方法: 1 个 (50%)
-
-**成员节点**:
-- 慢性病病人 (人群分类)
-- 血、尿培养 (检查方法)
-
-**成员节点关系**:
-
-- 慢性病病人 (人群分类)
-	- 相关节点
-		- 血、尿培养 (检查方法)
-	- 相关关系
-		- 慢性病病人-(进行)->血、尿培养
-- 血、尿培养 (检查方法)
-	- 相关节点
-		- 慢性病病人 (人群分类)
-	- 相关关系
-		- 血、尿培养-(进行)->慢性病病人
-
-**内部连接密度**: 1.00

+ 0 - 23
community/web/cached_data/report/community_40.md

@@ -1,23 +0,0 @@
-### 第41号社区报告 
-**类型分布**:
-- 人群分类: 1 个 (50%)
-- 医学检查: 1 个 (50%)
-
-**成员节点**:
-- 急性发热病人 (人群分类)
-- 脑脊液检查 (医学检查)
-
-**成员节点关系**:
-
-- 急性发热病人 (人群分类)
-	- 相关节点
-		- 脑脊液检查 (医学检查)
-	- 相关关系
-		- 急性发热病人-(进行)->脑脊液检查
-- 脑脊液检查 (医学检查)
-	- 相关节点
-		- 急性发热病人 (人群分类)
-	- 相关关系
-		- 脑脊液检查-(进行)->急性发热病人
-
-**内部连接密度**: 1.00

+ 3 - 1
main.py

@@ -20,15 +20,17 @@ import uvicorn
 from router.knowledge_dify import dify_kb_router
 from router.knowledge_saas import saas_kb_router
 from router.text_search import text_search_router
+from router.graph_router import graph_router
 
 # 创建FastAPI应用
 app = FastAPI(title="医疗百科问答系统")
 app.include_router(dify_kb_router)
 app.include_router(saas_kb_router)
 app.include_router(text_search_router)
+app.include_router(graph_router)
 
 if __name__ == "__main__":
     logger.info('Starting uvicorn server...2222')
     #uvicorn main:app --host 0.0.0.0 --port 8000 --reload
-    uvicorn.run("main:app", host="0.0.0.0", port=8001, reload=True)
+    uvicorn.run("main:app", host="0.0.0.0", port=8001, reload=False)
 

+ 6 - 0
router/text_search.py

@@ -53,6 +53,12 @@ class TextCompareMultiRequest(BaseModel):
 @router.post("/search", response_model=StandardResponse)
 async def search_text(request: TextSearchRequest):
     try:
+        #判断request.text是否为json格式,如果是,使用JsonToText的convert方法转换为text
+        if request.text.startswith('{') and request.text.endswith('}'):
+            from utils.json_to_text import JsonToTextConverter
+            converter = JsonToTextConverter()
+            request.text = converter.convert(request.text)
+
         # 使用TextSplitter拆分文本
         sentences = TextSplitter.split_text(request.text)
         if not sentences:

+ 37 - 1
service/kg_node_service.py

@@ -4,6 +4,8 @@ from model.kg_node import KGNode
 from db.session import get_db
 import logging
 from sqlalchemy.exc import IntegrityError
+
+from utils import vectorizer
 from utils.vectorizer import Vectorizer
 from sqlalchemy import func
 from service.kg_prop_service import KGPropService
@@ -11,10 +13,44 @@ from service.kg_edge_service import KGEdgeService
 
 logger = logging.getLogger(__name__)
 DISTANCE_THRESHOLD = 0.65
+DISTANCE_THRESHOLD2 = 0.3
 class KGNodeService:
     def __init__(self, db: Session):
         self.db = db
 
+    _cache = {}
+
+    def search_title_index(self, index: str, title: str, top_k: int = 3):
+        cache_key = f"{index}:{title}:{top_k}"
+        if cache_key in self._cache:
+            return self._cache[cache_key]
+
+        query_embedding = Vectorizer.get_embedding(title)
+        db = next(get_db())
+        # 执行向量搜索
+        results = (
+            db.query(
+                KGNode.id,
+                KGNode.name,
+                KGNode.category,
+                KGNode.embedding.l2_distance(query_embedding).label('distance')
+            )
+            .filter(KGNode.embedding.l2_distance(query_embedding) <= DISTANCE_THRESHOLD2)
+            .order_by('distance').limit(top_k).all()
+        )
+        results = [
+            {
+                "id": node.id,
+               "title": node.name,
+               "text": node.category,
+               "score": 2.0-node.distance
+            }
+                for node in results
+            ]
+
+        self._cache[cache_key] = results
+        return results
+
     def paginated_search(self, search_params: dict) -> dict:
         load_props = search_params.get('load_props', False)
         prop_service = KGPropService(self.db)
@@ -152,5 +188,5 @@ class KGNodeService:
                 offset += batch_size
             except Exception as e:
                 self.db.rollback()
-                logger.error(f"批量处理ER节点失败: {str(e)}")
+                print(f"批量处理ER节点失败: {str(e)}")
                 raise ValueError("Batch process failed")

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 1934
tests/community/web/cached_data/entities_med.json


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 1422
tests/community/web/cached_data/relationship_med.json


+ 5 - 5
utils/file_reader.py

@@ -6,15 +6,15 @@ class FileReader:
     def find_and_print_split_files(directory):
         for root, dirs, files in os.walk(directory):
             for file in files:
-                if '_split_' in file and file.endswith('.txt'):
-                #if file.endswith('.md'):
+                #if '_split_' in file and file.endswith('.txt'):
+                if file.endswith('.md'):
                     file_path = os.path.join(root, file)
                     relative_path = '\\report\\' + os.path.relpath(file_path, directory)
                     with open(file_path, 'r', encoding='utf-8') as f:
                         lines = f.readlines()
                     meta_header = lines[0]
                     content = ''.join(lines[1:])
-                    TrunksService().create_trunk({'file_path': relative_path, 'content': content,'type':'trunk','meta_header':meta_header})
+                    TrunksService().create_trunk({'file_path': relative_path, 'content': content,'type':'community_report'})
     @staticmethod
     def process_txt_files(directory):
         for root, dirs, files in os.walk(directory):
@@ -27,5 +27,5 @@ class FileReader:
                     TrunksService().create_trunk({'file_path': file_path, 'content': content, 'type': 'mr', 'title': title})
 
 if __name__ == '__main__':
-    directory = '/Users/ycw/work/脑梗死病历模版'
-    FileReader.process_txt_files(directory)
+    directory = 'E:\\project\\knowledge\\utils\\report'
+    FileReader.find_and_print_split_files(directory)

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 6 - 6
utils/vector_distance.py