File size: 2,728 Bytes
f5b1acc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
import json
import networkx as nx
import matplotlib.pyplot as plt
import os

# Define the path to your index.json file
index_file_path = "graphs/index.json"

# Define colors for domains
domain_colors = {
    "Legislation": "red",
    "Healthcare Systems": "blue",
    "Healthcare Policies": "green",
    "Default": "grey"
}

# Load index data
def load_index_data(file_path):
    with open(file_path, "r") as file:
        return json.load(file)

# Load and parse entities
def build_graph(data):
    G = nx.DiGraph()
    for entity_id, entity_info in data["entities"].items():
        label = entity_info.get("label", entity_id)
        domain = entity_info.get("inherits_from", "Default")
        color = domain_colors.get(domain, "grey")  # Set color, defaulting to "grey" if domain is missing
        G.add_node(entity_id, label=label, color=color)

        # Load additional relationships if specified in the entity data
        file_path = entity_info.get("file_path")
        if file_path and os.path.exists(file_path):
            with open(file_path, "r") as f:
                entity_data = json.load(f)
                for rel in entity_data.get("relationships", []):
                    G.add_edge(rel["source"], rel["target"], label=rel["attributes"]["relationship"])
                    
    # Add relationships from index.json
    for relationship in data["relationships"]:
        G.add_edge(relationship["source"], relationship["target"], label=relationship["attributes"].get("relationship", "related_to"))

    return G

# Enhanced visualization
def visualize_graph(G, title="Inferred Contextual Relationships"):
    pos = nx.spring_layout(G)
    plt.figure(figsize=(15, 10))

    # Draw nodes with colors
    node_colors = [G.nodes[node].get("color", "grey") for node in G.nodes]  # Default to "grey" if color is missing
    nx.draw_networkx_nodes(G, pos, node_size=3000, node_color=node_colors, alpha=0.8)

    # Draw labels
    nx.draw_networkx_labels(G, pos, font_size=10, font_weight="bold")

    # Draw edges with labels
    nx.draw_networkx_edges(G, pos, arrowstyle="->", arrowsize=20, edge_color="gray", connectionstyle="arc3,rad=0.1")
    edge_labels = {(u, v): d["label"] for u, v, d in G.edges(data=True)}
    nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels, font_color="red", font_size=8)

    # Save as PDF and display
    plt.title(title)
    plt.axis("off")
    plt.savefig("graph_visualization.pdf")  # Export as PDF
    plt.show()

# Main execution
if __name__ == "__main__":
    # Load data from index.json
    data = load_index_data(index_file_path)

    # Build the graph with entities and relationships
    G = build_graph(data)

    # Visualize the graph
    visualize_graph(G)