cdss_service.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. from sqlalchemy.orm import Session
  2. from typing import Optional
  3. from model.kg_node import KGNode
  4. from db.session import get_db
  5. import logging
  6. from sqlalchemy.exc import IntegrityError
  7. from service.kg_node_service import KGNodeService
  8. from tests.service.test_kg_node_service import kg_node_service
  9. from utils import vectorizer
  10. from utils.vectorizer import Vectorizer
  11. from sqlalchemy import func
  12. from service.kg_prop_service import KGPropService
  13. from service.kg_edge_service import KGEdgeService
  14. from cachetools import TTLCache
  15. from cachetools.keys import hashkey
  16. logger = logging.getLogger(__name__)
  17. DISTANCE_THRESHOLD = 0.65
  18. class CdssService:
  19. _cache = TTLCache(maxsize=100000, ttl=60*60*24*30)
  20. def get_disease_detail(self, diease_name: str,category: str):
  21. nodeService = KGNodeService(next(get_db()))
  22. diseases = nodeService.search_title_index("", diease_name, category, 1, 0)
  23. if diseases is None:
  24. return None
  25. disease_id = diseases[0]["id"]
  26. edgeService = KGEdgeService(next(get_db()))
  27. #category='疾病相关实验室检查项目'
  28. laboratoryTests = edgeService.get_edges_by_nodes(src_id=disease_id, category='疾病相关实验室检查项目')
  29. #category='疾病相关辅助检查项目'
  30. examinations = edgeService.get_edges_by_nodes(src_id=disease_id, category='疾病相关辅助检查项目')
  31. # category='疾病相关鉴别诊断'
  32. differential_diagnosis = edgeService.get_edges_by_nodes(src_id=disease_id, category='疾病相关鉴别诊断')
  33. test_nodes = []
  34. exam_nodes = []
  35. ddx_nodes = []
  36. if laboratoryTests:
  37. test_nodes = [test['dest_node'] for test in laboratoryTests]
  38. self.add_props_to_nodes(test_nodes)
  39. if examinations:
  40. exam_nodes = [exam['dest_node'] for exam in examinations]
  41. self.add_props_to_nodes(exam_nodes)
  42. if differential_diagnosis:
  43. ddx_nodes = [ddx['dest_node'] for ddx in differential_diagnosis]
  44. self.add_props_to_nodes(ddx_nodes,['Differential Diagnosis'])
  45. return {
  46. 'disease':diseases[0],
  47. 'laboratory_tests': test_nodes,
  48. 'examinations': exam_nodes,
  49. 'differential_diagnosis': ddx_nodes
  50. }
  51. def add_props_to_nodes(self, dest_nodes,prop_names=None):
  52. kgPropService = KGPropService(next(get_db()))
  53. for node in dest_nodes:
  54. props = kgPropService.get_props_by_ref_id(node['id'],prop_names)
  55. if props:
  56. node['props'] = props