我在某个服务器上运行了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
答案 0 :(得分:1)
问题不在于Fuseki。 java文档指出使用带有java
选项的-jar
命令时
JAR文件是所有用户类和其他用户类的源 路径设置被忽略。
简单地将带有用户定义函数的jar文件添加到CLASSPATH
变量将无法解决问题,因为将忽略该环境变量。此外,使用--classpath
或-cp
选项也会被忽略。
为了让Fuseki能够加载jar文件,您需要使用用户定义的函数将您的jar文件的位置添加到fuseki-server.jar的清单文件中的Class-Path键。
要执行此操作,请运行:
jar umf manifest-file fuseki-server.jar
清单文件:
Class-Path: path/to/functions/udf.jar
作为参考,this描述了更详细地将类添加到jar文件类路径的过程。