Boa noite, gostaria de uma pequena ajuda para uma boa solução de como resolver o meu problema.
Estou fazendo um software que gera um grafo wiki para explicação a partir de frases.
Por exemplo, se recebo a frase. João é um bobo.
Tenho um grafo formado com uma proposição apenas, com dois vértices, João e bobo.
A ligação entre esses se dá através da ligação “é um”
Visualmente algo assim:
O que ocorre que estou fazendo isso com a lib jPGraphX até aí sem problemas lendo o manual da API consigo gerar
os grafos sem maiores problemas.
Conforme a teoria dos grafos separei os componentes, em classes distintas.
conforme segue:
Aresta: [code]
public class Aresta
{
/*
* mxGraph.insertEdge(parent, id, value, source, target, style) ?
* creates and
* inserts a new edge into the model, within a begin/end update call.
*
* */
private Object pai;
private String id;
private String nome;
private Vertice origem;
private Vertice destino;
private String estilo;
public Aresta() {}
public Aresta(Object pai, String id, String nome, Vertice origem,
Vertice destino, String estilo) {
super();
this.pai = pai;
this.id = id;
this.nome = nome;
this.origem = origem;
this.destino = destino;
this.estilo = estilo;
}
public Object getPai() {
return pai;
}
public void setPai(Object pai) {
this.pai = pai;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Object getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public Vertice getOrigem() {
return origem;
}
public void setOrigem(Vertice origem) {
this.origem = origem;
}
public Vertice getDestino() {
return destino;
}
public void setDestino(Vertice destino) {
this.destino = destino;
}
public String getEstilo() {
return estilo;
}
public void setEstilo(String estilo) {
this.estilo = estilo;
}
}
[/code]
Classe Vertice:[code]
public class Vertice
{
// mxGraph.insertVertex(parent, id, value, x, y, width, height, style) ? creates and inserts a new vertex
// into the model, within a begin/end update call.
private String id;
private String nome;
private Integer coordenadaX;
private Integer coordenadaY;
private Integer largura;
private Integer altura;
private String estilo;
Vertice(){}
Vertice(String id,String nome, Integer coordenadaX, Integer coordenadaY, Integer largura,Integer altura,String estilo){
try{
this.id = id;
this.nome = nome;
this.coordenadaX = coordenadaX;
this.coordenadaY = coordenadaY;
this.largura = largura;
this.altura = altura;
this.estilo = estilo;
}catch(Exception e){
System.out.println("Erro ao popular o vértice");
}
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public Integer getCoordenadaX() {
return coordenadaX;
}
public void setCoordenadaX(Integer coordenadaX) {
this.coordenadaX = coordenadaX;
}
public Integer getCoordenadaY() {
return coordenadaY;
}
public void setCoordenadaY(Integer coordenadaY) {
this.coordenadaY = coordenadaY;
}
public Integer getLargura() {
return largura;
}
public void setLargura(Integer largura) {
this.largura = largura;
}
public Integer getAltura() {
return altura;
}
public void setAltura(Integer altura) {
this.altura = altura;
}
public String getEstilo() {
return estilo;
}
public void setEstilo(String estilo) {
this.estilo = estilo;
}
}
[/code]
Classe Proposição:[code]
public class Proposicao
{
// A proposição é a composiçao de DOIS vertices ligados via uma aresta
private Vertice VerticePai = new Vertice();
private Vertice VerticeFilho = new Vertice();
private Aresta aresta = new Aresta();
public Vertice getVerticePai() {
return VerticePai;
}
public void setVerticePai(Vertice VerticePai) {
this.VerticePai = VerticePai;
}
public Vertice getVerticeFilho() {
return VerticeFilho;
}
public void setVerticeFilho(Vertice VerticeFilho) {
this.VerticeFilho = VerticeFilho;
}
public Aresta getAresta() {
return aresta;
}
public void setAresta(Aresta aresta) {
this.aresta = aresta;
}
}
[/code]
E tudo isso é reunido via JGraph na classe MapaConceitual:[code]
import java.util.List;
import javax.swing.JComponent;
import com.mxgraph.swing.mxGraphComponent;
import com.mxgraph.view.mxGraph;
public class MapaConceitual
{
public static mxGraphComponent geraMapa(final List listaProposicoes){
mxGraph graph = new mxGraph();
graph.setAllowDanglingEdges(false);
graph.setAutoOrigin(true);
Object parent = graph.getDefaultParent();
graph.getModel().beginUpdate();
try
{
int referencial = 1 ;
for (Proposicao proposicao : listaProposicoes) {
// Vertice Pai
Object v1 = graph.insertVertex(
parent,
proposicao.getVerticePai().getId(),
proposicao.getVerticePai().getNome(),
proposicao.getVerticePai().getCoordenadaX()+referencial*50,
proposicao.getVerticePai().getCoordenadaY()+referencial*25,
proposicao.getVerticePai().getLargura(),
proposicao.getVerticePai().getAltura());
// Vertice Filho
Object v2 = graph.insertVertex(
parent,
proposicao.getVerticeFilho().getId(),
proposicao.getVerticeFilho().getNome(),
(proposicao.getVerticeFilho().getCoordenadaX()+referencial*50)+100,
(proposicao.getVerticeFilho().getCoordenadaY()+referencial*25)+100,
proposicao.getVerticeFilho().getLargura(),
proposicao.getVerticeFilho().getAltura());
// Aresta
graph.insertEdge(
parent,
proposicao.getAresta().getId(),
proposicao.getAresta().getNome(),
v1,
v2);
referencial+=4;
}
}
finally
{
graph.getModel().endUpdate();
}
mxGraphComponent graphComponent = new mxGraphComponent(graph);
return graphComponent;
}
}
[/code]
Esse graphComponent é jogado em um panel. Até aí sem problemas.
Minha dúvida é no fim das contas conceitual.
Existem casos de reincidência de um item ou vários. E o meu grafo tem que suportar isso.
Por exemplo se recebo três frases:
João é um bobo.
João é um gênio.
Pedro não é um bobo.
Obviamente o grafo não irá repetir os vertices resultando em algo assim:
Só que tenho o objeto de proposição (conjunto do trio pai-ligação-filho) com diversas informações e quero dicas de como montar essa lista e plotar tudo na tela.
Basicamente preciso disso, idéias de como receber várias frases de parâmetro (isso já recebo sem problemas) e
ir circulando as opções unindo as coisas repetidas para deixar apenas um repetição de cada parâmetro.
Pensei em normalizar a entrada, por exemplo João seria colocado pra lower + removido acentos e jogado em um hashmap de “pais” e fazer o mesmo de filhos…
Os problemas começam quando o pai de um, pode e normalmente é filho de outro, onde no caso poderia usar o serial id do graphComponent em um hash map
Exemplo:
Bom preciso de ajuda, ando trabalhando demais, e quando vejo esse meu trabalho fumego minha cabeça mas sem idéias… o.O
Quem já mexeu com essa lib, ou tenha feito algo parecido pode me dar essa luz…
Obrigado a você por ter lido. E desculpe pelas imagens exemplo… :lol: Agora faça uma pessoa feliz e dê uma dica :roll: :idea:
Qualquer dúvida perguntem que eu respondo e posso mostrar mais alguns fontes, embora o que importa está aí…
Obrigado por ter lido tudo isso