Jena 用の新しいビルトインを作成する必要があります。これで、最小の日付をそこから抽出できるようにしたいと思います。1 つのパラメーターだけでなく、ビルトインにデータのクラスを与えることが可能かどうか疑問に思っています。
これが私の関数の 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)
]
組み込みの 3 つのパラメーターに与えます。入力用に 2 つ、出力用に 1 つ。私のアイデアは、?c と ?d の 2 つの変数を使用することです。どちらにも誕生日があります。?c から最初のレコードを取得し、?d から次のレコードを取得したいと考えています。しかし、イエナは毎回最初のレコードを取るようです。
Javaで、2番目のレコードが必要で、結果をスクロールすることは可能ですか?
たとえば、私のオントロジーは 2 つの日付で構成されています: 1)1992-04-13T00:00:00.0; 2)1988-04-25T00:00:00.0
?c に 1) と ?d に 2) を入れてから、それらの間の最小値を取得するアルゴリズムを作成します。
ps : 上記の「bodyCall」では、ルールに指定した日付間の最大値を取得しようとしています。この目的のためにはうまく機能します。
皆さん、ありがとうございました。