Chamar método recursivamente

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 <name,class>.
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

[code]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);
    }
}

}[/code]
O SELECT para Disease fica da seguinte maneira:

[code]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[/code]
Monta o WHERE

[code]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);

}[/code]
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.