File size: 6,052 Bytes
1011232 695363c f3dbd83 17e63c4 64c5ee5 17e63c4 695363c 2e7c89d 1011232 695363c 176d12a 1011232 17e63c4 1011232 dec020e 1011232 17e63c4 1011232 695363c 1011232 17e63c4 1011232 17e63c4 1011232 17e63c4 1011232 695363c 5291db6 17e63c4 695363c 1011232 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 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 |
import subprocess
import pkg_resources
import sys
import time
def update_gradio():
"""Atualiza o Gradio para a versão mais recente."""
try:
subprocess.check_call([sys.executable, '-m', 'pip', 'install', '--upgrade', 'gradio'])
print("Gradio atualizado com sucesso!")
print("Reiniciando aplicação...")
time.sleep(2)
python = sys.executable
subprocess.Popen([python] + sys.argv)
sys.exit(0)
except Exception as e:
print(f"Erro ao atualizar Gradio: {e}")
# Verifica e atualiza o Gradio se necessário
try:
current_version = pkg_resources.get_distribution('gradio').version
latest_version = subprocess.check_output([sys.executable, '-m', 'pip', 'index', 'versions', 'gradio']).decode().split('\n')[0].split(' ')[-1]
if current_version != latest_version:
print(f"Atualizando Gradio: {current_version} -> {latest_version}")
update_gradio()
else:
print(f"Gradio já está na versão mais recente: {current_version}")
except:
print("Instalando Gradio...")
update_gradio()
# Importações necessárias
import gradio as gr
import rdflib
import requests
import matplotlib.pyplot as plt
import networkx as nx
from io import BytesIO
import base64
def load_names_from_url(jsonld_url):
"""Carrega e extrai os nomes do arquivo JSON-LD a partir de uma URL."""
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 alfabeticamente
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)
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, font_color="black")
nx.draw_networkx_edge_labels(G, pos, edge_labels=nx.get_edge_attributes(G, 'label'), font_size=9, font_color="red")
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() as demo:
gr.Markdown("""
# Visualização de Grafos de Localidades
Selecione um local para visualizar seu grafo de relacionamentos.
""")
with gr.Column():
selected_location = gr.Dropdown(
choices=names,
label="Selecione o Local",
info="Escolha um local para ver suas relações"
)
run_button = gr.Button("Visualizar Grafo", variant="primary")
graph_output = gr.HTML(
value='<div style="text-align: center; padding: 20px;">Selecione um local e clique em "Visualizar Grafo"</div>'
)
def on_run_button_click(selected_location):
return run_query_and_visualize(selected_location, jsonld_url)
run_button.click(
fn=on_run_button_click,
inputs=[selected_location],
outputs=graph_output
)
if __name__ == "__main__":
demo.launch() |