Bandrade,
realmente BDOO não são muitos bons nesses tipos de query pois eles trabalham com objetos e a suma de um dos atributos acaba fugindo do conceito do objeto 
Mas vc tem razão isso é importante.
O NeoDatis ODB tem um recurso para isso : O Trigger AfterSelect.
vc pode registrar um trigger chamando o ODB.addSelectTrigger( ISelectTrigger trigger );
Esse trigger irá receber todos os objetos selecionados e ai vc faz o que quiser em Java, por exemplo soma o valor da Transação. No nosso exemplo o trigger seria assim:
public class SumTrigger implements ISelectTrigger {
private double totalValue;
public void afterSelect(Object object, OID oid) {
Transaction t = (Transaction) object;
// Soma o valor da transação ao valor total
totalValue+=t.getValue();
}
public double getTotalValue() {
return totalValue;
}
}
Até testei para se funcionava e funcionou.
o código principal seria assim :
public void test1() throws Exception{
ODB odb = null;
try{
// abre o banco
odb = open("trigger-sum.odb");
double sum = 0;
for(int i=0;i<1000;i++){
// cria 1000 objetos de tipo Transaction
odb.store(new Transaction(10,i));
sum+=i;
}
// Fecha o banco
odb.close();
// Abre o banco
odb = open("trigger-sum.odb");
// Adiciona o Tigger AfterSelect no engine ODB
odb.addSelectTrigger(new SumTrigger());
// executa a query
Objects objects = odb.getObjects(new CriteriaQuery(Transaction.class,Where.equal("clientId", 10L)));
// Mostra o valor calculado pelo trigger
System.out.println("Valor total = " + trigger.getTotalValue() +" - " + sum);
assertEquals(String.valueOf(sum), String.valueOf(trigger.getTotalValue()));
}finally{
if(odb!=null){
odb.close();
}
}
}
Agora, vc tem razão, fazendo isso, o ODB acaba lendo todas as instâncias que atendem a query. Poderia ser otimizado para só ler o valor que está sendo somado. Provavelmente numa próxima versão terá uma otimização para isso 