export_prolog.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. from sqlalchemy import create_engine
  2. from sqlalchemy.ext.declarative import declarative_base
  3. from sqlalchemy.orm import sessionmaker
  4. from config.site import POSTGRESQL_USER,POSTGRESQL_PASSWORD,POSTGRESQL_DATABASE
  5. from db.models import *
  6. POSTGRESQL_HOST = '127.0.0.1'
  7. DATABASE_URL = f"postgresql+psycopg2://{POSTGRESQL_USER}:{POSTGRESQL_PASSWORD}@{POSTGRESQL_HOST}/{POSTGRESQL_DATABASE}"
  8. engine = create_engine(DATABASE_URL)
  9. SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
  10. Base = declarative_base()
  11. def get_db():
  12. db = SessionLocal()
  13. try:
  14. yield db
  15. finally:
  16. db.close()
  17. db = SessionLocal()
  18. rules = []
  19. def get_disease_filename(id):
  20. filename = f'./prolog/dis_{id}.pl'
  21. return filename
  22. def save_disease_info(f, id):
  23. disease_data = {}
  24. datas = db.query(DbKgEdge).filter(DbKgEdge.src_id == id).order_by(DbKgEdge.category).all()
  25. for data in datas:
  26. src_type = str.lower(data.src_node.category)
  27. dest_type = str.lower(data.dest_node.category)
  28. src_lead_str = src_type[:3]
  29. dest_lead_str = dest_type[:3]
  30. obj_id = f"{dest_lead_str}_{data.dest_node.id}"
  31. if dest_type in disease_data.keys():
  32. disease_data[dest_type].append(obj_id)
  33. else:
  34. disease_data[dest_type] = [obj_id]
  35. # rules.append(f"{dest_type}({dest_lead_str}_{data.dest_node.id}).\n")
  36. # rules.append(f"{data.category}({src_lead_str}_{data.src_node.id},{dest_lead_str}_{data.dest_node.id}).\n")
  37. datas = db.query(DbKgEdge).filter(DbKgEdge.dest_id == id).all()
  38. for data in datas:
  39. src_type = str.lower(data.src_node.category)
  40. dest_type = str.lower(data.dest_node.category)
  41. src_lead_str = src_type[:3]
  42. dest_lead_str = dest_type[:3]
  43. obj_id = f"{src_lead_str}_{data.src_node.id}"
  44. if src_type in disease_data.keys():
  45. disease_data[src_type].append(obj_id)
  46. else:
  47. disease_data[src_type] = [obj_id]
  48. # rules.append(f"{src_type}({src_lead_str}_{data.src_node.id}).\n")
  49. # rules.append(f"{data.category}({dest_lead_str}_{data.dest_node.id},{src_lead_str}_{data.src_node.id}).\n")
  50. for key in disease_data.keys():
  51. rules.append(f"{key}(dis_{id},[" + ",".join(disease_data[key])+"]).\n")
  52. def fetch_disease(session):
  53. total = session.query(DbKgNode).filter(DbKgNode.category == 'Disease', DbKgNode.status == 0).count()
  54. disease_data = session.query(DbKgNode).filter(DbKgNode.category == 'Disease', DbKgNode.status == 0).all()
  55. main_file = open("main.pl", "w", encoding='utf-8')
  56. index = 1
  57. for data in disease_data:
  58. #filename = get_disease_filename(data.id)
  59. #main_file.write(f":- include('{filename}').\n")
  60. print(f"{index}:{data.name}")
  61. #f = open(filename, "w", encoding='utf-8')
  62. #f.write(f"disease(dis_{data.id}).\n")
  63. save_disease_info(None, data.id)
  64. index = index + 1
  65. #f.close()
  66. rules.sort()
  67. for rule in rules:
  68. main_file.write(rule)
  69. main_file.close()
  70. fetch_disease(db)