Мне нужно создать новый встроенный модуль для Jena. С этим я хотел бы иметь возможность извлечь минимальную дату, откуда она есть. Мне просто интересно, можно ли передать класс данных встроенному вместо одного параметра.
Вот bodyCall моей функции:
@Override
public boolean bodyCall(Node[] args, int length, RuleContext context) {
System.out.println("Entra");
checkArgs(length, context);
BindingEnvironment env = context.getEnv();
Node n1 = getArg(0, args, context);
Node n2 = getArg(1, args, context);
//int count = 0;
//do{
//System.out.println("RULE"+context.getEnv().getGroundVersion(n2).getLiteralLexicalForm()); count ++;}while(count <2);
System.out.println("Date 1: " + n1 + " and Date 2: " + n2);
if (n1.isLiteral() && n2.isLiteral()) {
Object v1 = n1.getLiteralValue();
Object v2 = n2.getLiteralValue();
Node max = null;
if (v1 instanceof XSDDateTime && v2 instanceof XSDDateTime) {
XSDDateTime nv1 = (XSDDateTime) v1;
XSDDateTime nv2 = (XSDDateTime) v2;
Calendar data1 = new GregorianCalendar (nv1.getYears(), nv1.getMonths(), nv1.getDays());
Calendar data2 = new GregorianCalendar (nv2.getYears(), nv2.getMonths(), nv2.getDays());
SimpleDateFormat df = new SimpleDateFormat();
df.applyPattern("yyyy-dd-MM");
if (data1.compareTo(data2) > 0)
{
System.out.println("la data piu' grande e' DATA1: " +df.format(data1.getTime()));
max = args[0];
}
else
{
max = args[1];
System.out.print("la data piu' grande e' DATA1: " +df.format(data1.getTime()));
}
return env.bind(args[2], max);
}
}
// Doesn't (yet) handle partially bound cases
return false;
}
});
Это мое простое правило:
@prefix ex: http://www.semanticweb.org/prova_rules_M#
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
[maxDate:
(?p rdf:type ex:Persona)
(?p http://www.semanticweb.org/prova_rules_M/persona#data_nascita ?c)
(?p http://www.semanticweb.org/prova_rules_M/persona#data_nascita ?d)
maxDate(?c,?d,?x)
-> print(?x)
]
Даю на встроенные три параметра. Два на вход и один на выход. Моя идея заключается в использовании двух переменных: ?c и ?d. В обоих из них есть дата рождения. Я хотел бы получить первую запись из ?c и следующую запись из ?d. Но, похоже, Йена каждый раз делает первую запись.
Возможно ли с помощью Java сказать, что мне нужна вторая запись и прокручивать результаты?
Например, моя онтология состоит из двух дат: 1)1992-04-13T00:00:00.0; 2)1988-04-25T00:00:00.0
Я хочу иметь 1) в? c и 2) в? d, а затем сделать алгоритм, чтобы получить минимум между ними.
PS: В приведенном выше «bodyCall» я пытаюсь получить максимум между датами, которые я даю правилу. Он отлично работает для этой цели.
Спасибо вам всем.