graph.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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 create_edge(self, graph_id: int, src_id: int, dest_id: int, category: str, name: str, props: dict):
  35. 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()
  36. if edge:
  37. for key, value in props.items():
  38. prop = self.db.query(DbKgEdgeProp).filter(DbKgEdgeProp.ref_id == edge.id, DbKgEdgeProp.prop_name == key).first()
  39. if prop:
  40. continue
  41. self.create_edge_prop(category=1, ref_id=edge.id, prop_name=key, prop_value=value, prop_title=key)
  42. return edge
  43. edge = DbKgEdge(graph_id=graph_id, src_id=src_id, dest_id=dest_id, category=category, name=name)
  44. self.db.add(edge)
  45. self.db.commit()
  46. self.db.refresh(edge)
  47. for key, value in props.items():
  48. self.create_edge_prop(category=1, ref_id=edge.id, prop_name=key, prop_value=value, prop_title=key)
  49. self.db.commit()
  50. return edge
  51. def create_node_prop(self, category:str, ref_id: int, prop_name: str, prop_value: str, prop_title:str, commit=False):
  52. prop = DbKgProp(category=category, ref_id=ref_id, prop_name=prop_name, prop_value=prop_value, prop_title=prop_title)
  53. self.db.add(prop)
  54. if commit:
  55. self.db.commit()
  56. self.db.refresh(prop)
  57. return prop
  58. def create_edge_prop(self, category:str, ref_id: int, prop_name: str, prop_value: str, prop_title:str, commit=False):
  59. prop = DbKgEdgeProp(category=category, ref_id=ref_id, prop_name=prop_name, prop_value=prop_value, prop_title=prop_title)
  60. self.db.add(prop)
  61. if commit:
  62. self.db.commit()
  63. self.db.refresh(prop)
  64. return prop
  65. def search_like_node_by_name(self, name: str, category: str, graph_id: int):
  66. if name == "":
  67. name = "%"
  68. if category == "" or category == "any":
  69. nodes = self.db.query(DbKgNode).filter(DbKgNode.name.like(f"%{name}%"), DbKgNode.graph_id == graph_id).limit(100).all()
  70. return nodes
  71. nodes = self.db.query(DbKgNode)\
  72. .filter(DbKgNode.name.like(f"%{name}%"), DbKgNode.category == category, DbKgNode.graph_id == graph_id).limit(100).all()
  73. return nodes
  74. def get_nodes_by_page(self, graph_id: int, page: int, page_size: int):
  75. nodes = self.db.query(DbKgNode).filter(DbKgNode.graph_id == graph_id).limit(page_size).offset((page - 1) * page_size).all()
  76. return nodes
  77. def get_nodes_count(self, graph_id: int):
  78. count = self.db.query(DbKgNode).filter(DbKgNode.graph_id == graph_id).count()
  79. return count
  80. def get_neighbors(self, graph_id: int, node_id: int, direction: str):
  81. nodes = []
  82. if direction == "in":
  83. edges = self.db.query(DbKgEdge).filter(DbKgEdge.graph_id == graph_id, DbKgEdge.dest_id == node_id).limit(100).all()
  84. for edge in edges:
  85. nodes.append(edge.src_node)
  86. elif direction == "out":
  87. edges = self.db.query(DbKgEdge).filter(DbKgEdge.graph_id == graph_id, DbKgEdge.src_id == node_id).limit(100).all()
  88. for edge in edges:
  89. nodes.append(edge.dest_node)
  90. return nodes
  91. def get_node_by_id(self, graph_id: int, node_id: int):
  92. node = self.db.query(DbKgNode).filter(DbKgNode.graph_id == graph_id, DbKgNode.id == node_id).first()
  93. return node
  94. def get_graph_summary(self, graph_id: int):
  95. nodes_count = self.db.query(DbKgNode).filter(DbKgNode.graph_id == graph_id).count()
  96. edges_count = self.db.query(DbKgEdge).filter(DbKgEdge.graph_id == graph_id).count()
  97. nodes_categorys = self.db.query(DbKgNode.category).filter(DbKgNode.graph_id == graph_id).distinct().all()
  98. edges_categorys = self.db.query(DbKgEdge.category).filter(DbKgEdge.graph_id == graph_id).distinct().all()
  99. nodes_categorys = [category[0] for category in nodes_categorys]
  100. edges_categorys = [category[0] for category in edges_categorys]
  101. return {"nodes_count": nodes_count,
  102. "edges_count": edges_count,
  103. "nodes_categories": nodes_categorys,
  104. "edges_categories": edges_categorys}
  105. def get_nodes_categories(self, graph_id: int):
  106. nodes_categorys = self.db.query(DbKgNode.category).filter(DbKgNode.graph_id == graph_id).distinct().all()
  107. nodes_categorys = [{'name':category[0]} for category in nodes_categorys]
  108. return nodes_categorys
  109. def get_edges_categories(self, graph_id: int):
  110. edges_categorys = self.db.query(DbKgEdge.category).filter(DbKgEdge.graph_id == graph_id).distinct().all()
  111. edges_categorys = [{'name':category[0]} for category in edges_categorys]
  112. return edges_categorys