graph.py 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. import uuid
  2. import os
  3. import subprocess
  4. import logging
  5. logger = logging.getLogger(__name__)
  6. from datetime import datetime
  7. from agent.models.db.graph import DbKgGraphs,DbKgNode,DbKgEdge,DbKgProp,DbKgEdgeProp
  8. from sqlalchemy.orm import load_only
  9. class GraphBusiness:
  10. def __init__(self, db):
  11. self.db = db
  12. self.graphs = {}
  13. def create_graph(self, category:str, name: str, description: str, graph_settings:str):
  14. graph = DbKgGraphs(category=category,name=name, description=description, graph_settings=graph_settings)
  15. self.db.add(graph)
  16. self.db.commit()
  17. self.db.refresh(graph)
  18. return graph
  19. def get_graph(self, graph_id: int):
  20. graph = self.db.query(DbKgGraphs).filter(DbKgGraphs.id == graph_id).first()
  21. return graph
  22. def create_node(self, graph_id: int, name: str, category: str, props: dict):
  23. node = self.db.query(DbKgNode).filter(DbKgNode.graph_id == graph_id, DbKgNode.name == name, DbKgNode.category == category).first()
  24. if node:
  25. return node
  26. node = DbKgNode(graph_id=graph_id, name=name, category=category)
  27. self.db.add(node)
  28. self.db.commit()
  29. self.db.refresh(node)
  30. for key, value in props.items():
  31. self.create_node_prop(category=1, ref_id=node.id, prop_name=key, prop_value=value, prop_title=key)
  32. self.db.commit()
  33. return node
  34. def delete_node(self, graph_id: int, id: int):
  35. node = self.db.query(DbKgNode).filter(DbKgNode.graph_id == graph_id, DbKgNode.id == id).first()
  36. if not node:
  37. return False
  38. node.status = -1
  39. self.db.commit()
  40. return True
  41. def update_node(self, graph_id: int, id: int, name:str):
  42. node = self.db.query(DbKgNode).filter(DbKgNode.graph_id == graph_id, DbKgNode.id == id).first()
  43. if not node:
  44. return False
  45. node.name = name
  46. self.db.commit()
  47. self.db.refresh(node)
  48. return node
  49. def create_edge(self, graph_id: int, src_id: int, dest_id: int, category: str, name: str, props: dict):
  50. edge = self.db.query(DbKgEdge).filter(DbKgEdge.graph_id == graph_id, DbKgEdge.src_id == src_id, DbKgEdge.dest_id == dest_id, DbKgEdge.category == category, DbKgEdge.name == name).first()
  51. if edge:
  52. for key, value in props.items():
  53. prop = self.db.query(DbKgEdgeProp).filter(DbKgEdgeProp.ref_id == edge.id, DbKgEdgeProp.prop_name == key).first()
  54. if prop:
  55. continue
  56. self.create_edge_prop(category=1, ref_id=edge.id, prop_name=key, prop_value=value, prop_title=key)
  57. return edge
  58. edge = DbKgEdge(graph_id=graph_id, src_id=src_id, dest_id=dest_id, category=category, name=name)
  59. self.db.add(edge)
  60. self.db.commit()
  61. self.db.refresh(edge)
  62. for key, value in props.items():
  63. self.create_edge_prop(category=1, ref_id=edge.id, prop_name=key, prop_value=value, prop_title=key)
  64. self.db.commit()
  65. return edge
  66. def delete_edge(self, graph_id: int, src_id: int, dest_id: int, category: str, name: str):
  67. edge = self.db.query(DbKgEdge).filter(DbKgEdge.graph_id == graph_id, DbKgEdge.src_id == src_id, DbKgEdge.dest_id == dest_id, DbKgEdge.category == category, DbKgEdge.name == name).first()
  68. if edge:
  69. edge.status = -1
  70. self.db.commit()
  71. self.db.refresh(edge)
  72. return True
  73. return False
  74. def search_edges(self, graph_id: int, category: str):
  75. edges = self.db.query(DbKgEdge).filter(DbKgEdge.graph_id == graph_id, DbKgEdge.category.like(f"%{category}%")).distinct(DbKgEdge.category).all()
  76. return edges
  77. def update_edges(self, graph_id: int, old_category:str, new_category: str):
  78. edges = self.db.query(DbKgEdge).filter(DbKgEdge.graph_id == graph_id, DbKgEdge.category == old_category).all()
  79. if not edges:
  80. return False
  81. for edge in edges:
  82. edge.category = new_category
  83. edge.name = new_category
  84. self.db.commit()
  85. self.db.refresh(edge)
  86. return True
  87. def create_node_prop(self, category:str, ref_id: int, prop_name: str, prop_value: str, prop_title:str, commit=False):
  88. prop = DbKgProp(category=category, ref_id=ref_id, prop_name=prop_name, prop_value=prop_value, prop_title=prop_title)
  89. self.db.add(prop)
  90. if commit:
  91. self.db.commit()
  92. self.db.refresh(prop)
  93. return prop
  94. def update_node_prop(self, ref_id: int, prop_name: str, prop_value: str):
  95. prop = self.db.query(DbKgEdgeProp).filter(DbKgEdgeProp.ref_id == ref_id, DbKgEdgeProp.prop_name == prop_name).first()
  96. if not prop:
  97. return False
  98. prop.prop_value = prop_value
  99. self.db.commit()
  100. self.db.refresh(prop)
  101. return True
  102. def create_edge_prop(self, category:str, ref_id: int, prop_name: str, prop_value: str, prop_title:str, commit=False):
  103. prop = DbKgEdgeProp(category=category, ref_id=ref_id, prop_name=prop_name, prop_value=prop_value, prop_title=prop_title)
  104. self.db.add(prop)
  105. if commit:
  106. self.db.commit()
  107. self.db.refresh(prop)
  108. return prop
  109. def search_like_node_by_name(self, name: str, category: str, graph_id: int, limit: int = 100):
  110. if name == "":
  111. name = "%"
  112. if category == "" or category == "any":
  113. nodes = self.db.query(DbKgNode).filter(DbKgNode.name.like(f"%{name}%"), DbKgNode.graph_id == graph_id).limit(limit).all()
  114. return nodes
  115. nodes = self.db.query(DbKgNode)\
  116. .filter(DbKgNode.name.like(f"%{name}%"), DbKgNode.category == category, DbKgNode.graph_id == graph_id).limit(limit).all()
  117. return nodes
  118. def get_nodes_by_page(self, graph_id: int, page: int, page_size: int):
  119. nodes = self.db.query(DbKgNode).filter(DbKgNode.graph_id == graph_id).limit(page_size).offset((page - 1) * page_size).all()
  120. return nodes
  121. def get_nodes_count(self, graph_id: int):
  122. count = self.db.query(DbKgNode).filter(DbKgNode.graph_id == graph_id).count()
  123. return count
  124. def get_neighbors(self, graph_id: int, node_id: int, direction: str):
  125. nodes = []
  126. if direction == "in":
  127. edges = self.db.query(DbKgEdge).filter(DbKgEdge.graph_id == graph_id, DbKgEdge.dest_id == node_id).limit(100).all()
  128. for edge in edges:
  129. nodes.append(edge.src_node)
  130. elif direction == "out":
  131. edges = self.db.query(DbKgEdge).filter(DbKgEdge.graph_id == graph_id, DbKgEdge.src_id == node_id).limit(100).all()
  132. for edge in edges:
  133. nodes.append(edge.dest_node)
  134. return nodes
  135. def get_node_by_id(self, graph_id: int, node_id: int):
  136. node = self.db.query(DbKgNode).filter(DbKgNode.graph_id == graph_id, DbKgNode.id == node_id).first()
  137. return node
  138. def get_graph_summary(self, graph_id: int):
  139. nodes_count = self.db.query(DbKgNode).filter(DbKgNode.graph_id == graph_id).count()
  140. edges_count = self.db.query(DbKgEdge).filter(DbKgEdge.graph_id == graph_id).count()
  141. nodes_categorys = self.db.query(DbKgNode.category).filter(DbKgNode.graph_id == graph_id).distinct().all()
  142. edges_categorys = self.db.query(DbKgEdge.category).filter(DbKgEdge.graph_id == graph_id).distinct().all()
  143. nodes_categorys = [category[0] for category in nodes_categorys]
  144. edges_categorys = [category[0] for category in edges_categorys]
  145. return {"nodes_count": nodes_count,
  146. "edges_count": edges_count,
  147. "nodes_categories": nodes_categorys,
  148. "edges_categories": edges_categorys}
  149. def get_nodes_categories(self, graph_id: int):
  150. nodes_categorys = self.db.query(DbKgNode.category).filter(DbKgNode.graph_id == graph_id).distinct().all()
  151. nodes_categorys = [{'name':category[0]} for category in nodes_categorys]
  152. return nodes_categorys
  153. def get_edges_categories(self, graph_id: int):
  154. edges_categorys = self.db.query(DbKgEdge.category).filter(DbKgEdge.graph_id == graph_id).distinct().all()
  155. edges_categorys = [{'name':category[0]} for category in edges_categorys]
  156. return edges_categorys