File size: 5,114 Bytes
695363c
 
f3dbd83
17e63c4
64c5ee5
17e63c4
 
695363c
3add0e4
 
 
 
 
 
 
 
2e7c89d
4ac6be2
1011232
 
 
 
 
 
 
4ac6be2
1011232
 
 
695363c
176d12a
1011232
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17e63c4
 
1011232
 
 
 
 
 
dec020e
1011232
 
 
 
4ac6be2
1011232
 
 
4ac6be2
 
1011232
 
 
 
 
 
 
 
 
 
 
 
 
17e63c4
1011232
 
 
 
 
695363c
1011232
4ac6be2
 
 
17e63c4
 
1011232
 
 
4ac6be2
1011232
4ac6be2
 
 
 
695363c
3add0e4
 
 
 
 
695363c
1011232
 
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import gradio as gr
import rdflib
import requests
import matplotlib.pyplot as plt
import networkx as nx
from io import BytesIO
import base64

# Verificação simples da versão do Gradio no início
try:
    import pkg_resources
    gradio_version = pkg_resources.get_distribution('gradio').version
    print(f"Gradio version: {gradio_version}")
except:
    print("Não foi possível verificar a versão do Gradio")

def load_names_from_url(jsonld_url):
    """Carrega e extrai os nomes do arquivo JSON-LD."""
    try:
        response = requests.get(jsonld_url)
        data = response.json()
        names = []
        for item in data:
            if 'name' in item:
                names.append(item['name'])
        return sorted(names)  # Retorna nomes ordenados
    except Exception as e:
        print(f"Erro ao carregar dados: {e}")
        return []

def build_graph_from_jsonld(jsonld_url, selected_name):
    """Constrói o grafo a partir dos dados JSON-LD."""
    try:
        response = requests.get(jsonld_url)
        data = response.json()
        
        selected_data = next((item for item in data if item['name'] == selected_name), None)
        
        if not selected_data:
            return "Local não encontrado."
        
        G = nx.DiGraph()
        
        # Adicionar nó do Place
        place_id = selected_data['@id']
        place_label = f"schema:Place\nName: {selected_data['name']}\nDescription: {selected_data['description'][:30]}..."
        G.add_node(place_id, label=place_label)
        
        # Adicionar nó de GeoCoordinates
        geo_data = selected_data['geo']
        geo_id = geo_data['@id']
        geo_label = f"geo:SpatialThing\nLat: {geo_data['lat']}\nLong: {geo_data['long']}\nFeatureCode: {geo_data['gn:featureCode']}\nFeatureCodeName: {geo_data['gn:featureCodeName']}\nName: {geo_data['gn:name']}"
        G.add_node(geo_id, label=geo_label)
        G.add_edge(place_id, geo_id, label="schema:geo")
        
        # Adicionar nós de CreativeWork
        for work in selected_data.get('subjectOf', []):
            work_id = work['@id']
            work_label = f"schema:CreativeWork\nHeadline: {work['headline']}\nGenre: {work['genre']}\nDatePublished: {work['datePublished']}\nText: {work['text'][:30]}...\nLanguage: {work['inLanguage']}"
            G.add_node(work_id, label=work_label)
            G.add_edge(place_id, work_id, label="schema:subjectOf")
        
        return G
    except Exception as e:
        return f"Erro ao construir grafo: {e}"

def run_query_and_visualize(selected_location, jsonld_url):
    """Executa a consulta e visualiza o resultado."""
    try:
        if not selected_location:
            return '<div style="text-align: center; padding: 20px;">Selecione um local para visualizar o grafo</div>'
            
        G = build_graph_from_jsonld(jsonld_url, selected_location)

        if isinstance(G, str):  # Caso de erro
            return f'<div style="color: red; text-align: center; padding: 20px;">{G}</div>'
        
        plt.figure(figsize=(15, 10))
        pos = nx.spring_layout(G, k=1, iterations=50)
        
        nx.draw_networkx_nodes(G, pos, node_size=3000, node_color="skyblue", alpha=0.9)
        nx.draw_networkx_edges(G, pos, width=2, alpha=0.5, edge_color='gray')
        nx.draw_networkx_labels(G, pos, labels=nx.get_node_attributes(G, 'label'), font_size=9)
        nx.draw_networkx_edge_labels(G, pos, edge_labels=nx.get_edge_attributes(G, 'label'), font_size=9)

        plt.title(f"Grafo para: {selected_location}", size=15)
        plt.axis('off')
        
        buf = BytesIO()
        plt.savefig(buf, format='png', dpi=300, bbox_inches='tight')
        buf.seek(0)
        img_str = base64.b64encode(buf.read()).decode()
        plt.close()

        return f'<img src="data:image/png;base64,{img_str}" style="width: 100%; max-width: 1200px;"/>'
    except Exception as e:
        return f'<div style="color: red; text-align: center; padding: 20px;">Erro ao gerar visualização: {e}</div>'

# URL do arquivo JSON-LD
jsonld_url = 'https://huggingface.co/spaces/histlearn/ShowGraph/raw/main/datafile.jsonld'

# Carrega os nomes iniciais
names = load_names_from_url(jsonld_url)

# Interface Gradio
with gr.Blocks(css="footer {display: none}") as demo:
    gr.Markdown("# Visualização de Grafos de Localidades")
    gr.Markdown("Selecione um local para visualizar seu grafo de relacionamentos e citações.")

    with gr.Column():
        selected_location = gr.Dropdown(
            choices=names,
            label="Selecione o Local",
            value=names[0] if names else None
        )
        view_button = gr.Button("Visualizar Grafo", variant="primary")
        result_html = gr.HTML(
            value='<div style="text-align: center; padding: 20px;">Selecione um local e clique em "Visualizar Grafo"</div>'
        )

        view_button.click(
            fn=run_query_and_visualize,
            inputs=[selected_location, gr.Textbox(value=jsonld_url, visible=False)],
            outputs=result_html
        )

if __name__ == "__main__":
    demo.launch()