我需要为 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
我想在 ?c 中有 1) 和 2) 在 ?d 中,然后制定一个算法来获得它们之间的最小值。
ps:在上面的“bodyCall”中,我尝试获得我给规则的日期之间的最大值。它可以很好地用于此目的。
谢谢你们。