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() |