Chamar método recursivamente

0 respostas
jeovane.reges
Olá galera do GUJ, bom dia. Pessoal, estou com problemas pra fazer uma chamada recursiva de dois métodos. Mas, antes de explica-los irei fazer um breve resumo do que quero fazer pra que vocês entendam melhor o que desejo fazer. Tenho uma classe que retorna a seguinte hierarquia.
Disease
   name
   class
Drug
   name
   indication
   metabolism
   pregnancyCategory
GenericDrug
   affectedOrganism
   chemicalFormula
   genericName
Ingredient
   name
SideEffect
   sideEffectName
Como pode ser notado é uma hierarquia em árvore, onde por exemplo, Disease tem como filhos . O que eu gostaria de fazer era através dessa hierarquia montar consultas SPARQL. Para tal, tenho os seguinte métodos (ainda em desenvolvimento). Monta o SELECT
public void buildSelect() throws OWLOntologyCreationException {
	ontology = loadOntology();
	pm = prefixManager();
	query = "PREFIX dailymed: <http://www4.wiwiss.fu-berlin.de/dailymed/resource/dailymed/>"
		+ "\n" + "PREFIX drugbank: <http://www4.wiwiss.fu-berlin.de/drugbank/resource/drugbank/>"
		+ "\n" + "PREFIX sider: <http://www4.wiwiss.fu-berlin.de/sider/resource/sider/> \n\n";
	query += Query.SELECT.toString();

	for (Iterator it = buildHierarchyOnto(ontology).entrySet().iterator(); it.hasNext();) {
	    Map.Entry entry = (Map.Entry) it.next();
	    String key = pm.getShortForm((OWLEntity) entry.getKey()).replace(":", "");
	    String value = entry.getValue().toString();

	    if (key.equalsIgnoreCase(valueClass)) {
		if (!value.isEmpty()) {
		    ArrayList<OWLEntity> arrayList = (ArrayList<OWLEntity>) entry.getValue();
		    for (OWLEntity o : arrayList) {
		        //System.out.println("   " + pm.getShortForm(o).replace(":", ""));
		        String valueKey = pm.getShortForm(o).replace(":", "");
		        query += " ?" + valueClass + "_" + valueKey;
		    }
		}
		//System.out.println(query);
	    }
	}
}
O SELECT para Disease fica da seguinte maneira:
PREFIX dailymed: <http://www4.wiwiss.fu-berlin.de/dailymed/resource/dailymed/>
PREFIX drugbank: <http://www4.wiwiss.fu-berlin.de/drugbank/resource/drugbank/>
PREFIX sider: <http://www4.wiwiss.fu-berlin.de/sider/resource/sider/> 

SELECT ?Disease_name ?Disease_class
Monta o WHERE
public void buildWhere() throws OWLOntologyCreationException {
        //ontology = loadOntology();
        //pm = prefixManager();
        query += "\n" + Query.WHERE.toString() + " {";
        String prefix = "ddg";

        for (Iterator it = buildHierarchyOnto(ontology).entrySet().iterator(); it.hasNext();) {
            Map.Entry entry = (Map.Entry) it.next();
            String key = pm.getShortForm((OWLEntity) entry.getKey()).replace(":", "");
            String value = entry.getValue().toString();

            if (key.equalsIgnoreCase(valueClass)) {
                if (!value.isEmpty()) {
                    ArrayList<OWLEntity> arrayList = (ArrayList<OWLEntity>) entry.getValue();
                    for (OWLEntity o : arrayList) {
                        //System.out.println("   " + pm.getShortForm(o).replace(":", ""));
                        String valueKey = pm.getShortForm(o).replace(":", "");
                        query += "\n   ?" + valueClass + " "
                                + prefix + ":" + valueKey
                                + " ?" + valueClass + "_" + valueKey + ".";
                    }
                }
            }
        }

        for (Iterator it = buildObjectPropertyOnto(ontology).iterator(); it.hasNext();) {
            TripleStore ts = (TripleStore) it.next();

            if (valueClass.equals(ts.getDomain())) {
                query += "\n   ?" + ts.getDomain() + " "
                        + prefix + ":" + ts.getObjectProperty()
                        + " ?" + ts.getRange() + ".";
                //+ " ?" + ts.getDomain() + "_" + ts.getRange() + ".";
            }
        }

        for (Iterator it = buildObjectPropertyOnto(ontology).iterator(); it.hasNext();) {
            TripleStore ts = (TripleStore) it.next();

            if (valueClass.equals(ts.getDomain()) && !valueClass.equals(ts.getRange())) {
                //System.out.println(ts.getRange());
            }
        }
        System.out.println(query);
}
O WHERE para Disease fica da seguinte maneira.
SELECT ?Disease_name ?Disease_class
WHERE {
   ?Disease ddg:name ?Disease_name.
   ?Disease ddg:class ?Disease_class.
   ?Disease ddg:possibleDrug ?Drug.
Esse último resultado da clausura WHERE (?Disease ddg:possibleDrug ?Drug.) faz referência para a classe Drug em minha hierarquia de classes.

A chamada recursiva que eu gostaria de fazer era a seguinte maneira:
Quando tivesse uma linha igual a ?Disease ddg:possibleDrug ?Drug. que faz referência para outra classe que todos os seus filhos fossem adicionados no SELECT, além de chamados no WHERE. E caso a minha classe Drug fizesse referências pra outras classes que tivesse novas chamadas recursivas.

Alguém sabe me dizer o que devo mudar no meu código para fazer com que o mesmo tenha tal comportamento?
Desde de já obrigado pela ajuda de todos.
Abraço.

Criado 9 de dezembro de 2012
Respostas 0
Participantes 1