5

我有一个在某个服务器上运行的 Fuseki 端点。我想使用 Jena 的com.hp.hpl.jena.sparql.function库传递用户定义的函数。不幸的是,我得到了错误:

URI <java:path.to.functions.halfString> has no registered function factory

我确保将类(包含文件的 jar)添加到类路径中,并且我可以从该服务器上使用此类的其他应用程序访问此类。

我现在尝试的示例案例是某个函数,它获取图中所有三元组的主题并返回每个主题的前半部分。

作为参考,我添加了以下功能:

public class halfString extends FunctionBase1
{
    public halfString() { super() ; }

    public NodeValue exec(NodeValue nv1)
    {
        if (!nv1.isString())
        {
            return nv1;
        }

        String hey = nv1.toString();
        int mid = hey.length() / 2;
        String nay = hey.substring(0, mid);

        return NodeValue.makeString(nay);
    }
}

这是我使用的 SPARQL 查询:

PREFIX f: <path.to.functions.>

SELECT ?half ?s ?o ?g
WHERE {

    ?s ?p ?o

    BIND (f:halfString(str(?s)) as ?half)
}

运行 Fuseki(使用 fuseki 提供的默认配置):

cd FUSEKI_HOME
./fuseki-server --mem /ds
4

1 回答 1

2

问题不在于 Fuseki。java 文档指出,当使用带有选项的java命令时,-jar

JAR 文件是所有用户类的来源,其他用户类路径设置被忽略。

简单地将带有用户定义函数的 jar 文件添加到CLASSPATH变量中并不能解决问题,因为该环境变量将被忽略。此外,使用--classpathor-cp选项也将被忽略。

为了让 Fuseki 能够加载 jar 文件,您需要使用用户定义的函数将位置添加到 jar 文件到 fuseki-server.jar 清单文件中的 Class-Path 键。

为此,请运行:

jar umf manifest-file fuseki-server.jar

清单文件:

Class-Path: path/to/functions/udf.jar

作为参考,更详细地描述了将类添加到 jar 文件类路径的过程。

于 2013-08-20T07:50:32.373 回答