Ajuda com JGraphx para grafos usando Swing

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. :smiley: 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 :smiley: