Spaces:
Running
Running
| # graph_builder.py | |
| import networkx as nx | |
| import json | |
| import pickle | |
| from typing import Dict, List, Any | |
| class LegalProcessGraph: | |
| def __init__(self): | |
| self.graph = nx.DiGraph() | |
| self.processes = {} | |
| def load_process_data(self, json_file_path: str): | |
| """Load process data from JSON file and build graph""" | |
| with open(json_file_path, 'r', encoding='utf-8') as file: | |
| process_data = json.load(file) | |
| process_name = process_data['process_name'] | |
| self.processes[process_name] = process_data | |
| # Add nodes to graph | |
| for node in process_data['nodes']: | |
| self.graph.add_node( | |
| node['id'], | |
| **{ | |
| 'title': node['title'], | |
| 'description': node['description'], | |
| 'type': node['type'], | |
| 'process': process_name, | |
| 'properties': node.get('properties', {}) | |
| } | |
| ) | |
| # Add edges to graph | |
| for edge in process_data['edges']: | |
| self.graph.add_edge( | |
| edge['source'], | |
| edge['target'], | |
| relationship=edge['relationship'], | |
| condition=edge.get('condition') | |
| ) | |
| # Add resource nodes | |
| for resource in process_data.get('resources', []): | |
| self.graph.add_node( | |
| resource['id'], | |
| **{ | |
| 'title': resource['title'], | |
| 'type': resource['type'], | |
| 'process': process_name, | |
| 'properties': { | |
| 'url': resource.get('url'), | |
| 'phone': resource.get('phone'), | |
| 'email': resource.get('email'), | |
| 'description': resource['description'] | |
| } | |
| } | |
| ) | |
| def find_process_start(self, process_name: str) -> str: | |
| """Find the starting node for a given process""" | |
| for node_id, data in self.graph.nodes(data=True): | |
| if data.get('process') == process_name and data.get('type') == 'process_start': | |
| return node_id | |
| return None | |
| def get_next_steps(self, node_id: str) -> List[Dict]: | |
| """Get next steps from current node""" | |
| next_steps = [] | |
| for successor in self.graph.successors(node_id): | |
| node_data = self.graph.nodes[successor] | |
| edge_data = self.graph.edges[node_id, successor] | |
| next_steps.append({ | |
| 'node_id': successor, | |
| 'title': node_data['title'], | |
| 'description': node_data['description'], | |
| 'relationship': edge_data['relationship'], | |
| 'condition': edge_data.get('condition'), | |
| 'properties': node_data.get('properties', {}) | |
| }) | |
| return next_steps | |
| def get_required_resources(self, node_id: str) -> List[Dict]: | |
| """Get resources related to a specific node""" | |
| node_data = self.graph.nodes[node_id] | |
| process_name = node_data['process'] | |
| # Find all resource nodes for this process | |
| resources = [] | |
| for resource_id, data in self.graph.nodes(data=True): | |
| if data.get('process') == process_name and data.get('type') in ['government_portal', 'helpline', 'form']: | |
| resources.append({ | |
| 'id': resource_id, | |
| 'title': data['title'], | |
| 'type': data['type'], | |
| 'properties': data.get('properties', {}) | |
| }) | |
| return resources | |
| def save_graph(self, file_path: str): | |
| """Save graph to pickle file""" | |
| with open(file_path, 'wb') as f: | |
| pickle.dump({ | |
| 'graph': self.graph, | |
| 'processes': self.processes | |
| }, f) | |
| def load_graph(self, file_path: str): | |
| """Load graph from pickle file""" | |
| with open(file_path, 'rb') as f: | |
| data = pickle.load(f) | |
| self.graph = data['graph'] | |
| self.processes = data['processes'] | |
| # Usage example | |
| if __name__ == "__main__": | |
| # Build the graph | |
| legal_graph = LegalProcessGraph() | |
| legal_graph.load_process_data('legal_aid_process.json') | |
| legal_graph.save_graph('legal_processes.pkl') | |
| print(f"Graph built with {legal_graph.graph.number_of_nodes()} nodes and {legal_graph.graph.number_of_edges()} edges") | |