耶拿的内置原语?

时间:2014-04-24 23:06:31

标签: jena primitive-types built-in jena-rules

我对一些内置基元有疑问。是否可以使用内置函数:差异,最小值,最大值,总和也适用于DateTime类型,或者为此目的创建自定义内置函数更好? 它们使用整数和浮点数工作正常,但似乎不适用于DateTime类型(或者我使用的语法可能不对)。

1 个答案:

答案 0 :(得分:0)

您的语法不正确。首先,我们可以跳转到Builtin的javadoc,以确定Builtin的存在。

根据您的提及选择Max,我们可以继续在GrepCode上查找它的完全限定类名。一旦我们到达那里,我们注意到它实现的parimary方法是bodyCall(Node[], int, RuleContext),所以让我们来看看它的实现(从2.11.0开始)并看看为什么它和&#{}} #39; s的行为方式如下:

@Override
public boolean bodyCall(Node[] args, int length, RuleContext context) {
    checkArgs(length, context);
    BindingEnvironment env = context.getEnv();
    Node n1 = getArg(0, args, context);
    Node n2 = getArg(1, args, context);
    if (n1.isLiteral() && n2.isLiteral()) {
        Object v1 = n1.getLiteralValue();
        Object v2 = n2.getLiteralValue();
        Node res = null;
        if (v1 instanceof Number && v2 instanceof Number) {
            Number nv1 = (Number)v1;
            Number nv2 = (Number)v2;
            if (v1 instanceof Float || v1 instanceof Double 
            ||  v2 instanceof Float || v2 instanceof Double) {
                res = (nv1.doubleValue() > nv2.doubleValue()) ? n1 : n2;
            } else {
                res = (nv1.longValue() > nv2.longValue()) ? n1 : n2;
            }
            return env.bind(args[2], res);
        }
    }
    // Doesn't (yet) handle partially bound cases
    return false;
}

这里要注意的重要一点是,如果一个实例是java.lang.Number的衍生物,该方法将仅绑定一个值。

请注意,如果我们查看LessThan#bodyCall(Node[], int, RuleContext)的实施(截至2.11.0),我们就可以追踪其使用所在的Util的行为/ em>对日期/时间对象敏感。

如果您的规则使用max(?a ?b ?c)将最大值绑定到?c,您有时可以(如果您的规则具有良好的对称性)使用lessThan(?a ?b)来限制规则受到约束(因此,实现相同的结果)。在lessThan的情况下,规则的其余部分可以继续,假设?b一直是更大的值。同样,这要求您的规则具有良好的对称性,在其他地方,允许绑定?a?b而不受其他约束。

如果您需要等效的Max可以使用XSDDateTime文字,那么您确实可能需要自己制作一些文字。值得庆幸的是,正如这些Builtin的代码所示,创建它们实际上非常容易。

在一个更哲学的说明中,我不确定这是否是开发人员有意识的决定,或者是否是一个小的疏忽。我认为Util使用的比较实用程序(LessThan)实际上可能比Max内置项更新,因此Max并未实现。{{1}}。