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.