自定义ARQ功能不适用于fuseki端点

时间:2017-12-26 13:55:37

标签: function sparql jena arq

我使用以下(自定义函数代码)使用自定义ARQ函数成功实现了sparql查询:

public class LevenshteinFilter extends FunctionBase2 {

    public LevenshteinFilter() { super() ; }

    public NodeValue exec(NodeValue value1, NodeValue value2){
        LevenshteinDistance LD=new LevenshteinDistance();
        int i = LD.apply(value1.asString(), value2.asString()); 
        return NodeValue.makeInteger(i); 
    }
}

当我查询从龟文件加载的模型时,它工作正常,如下所示:

InputStream input = QueryProcessor.class.getClassLoader().getResourceAsStream("full.ttl");
            model = ModelFactory.createMemModelMaker().createModel("default");
            model.read(input,null,"TURTLE"); // null base URI, since model URIs are absolute
            input.close();

将查询发送如下:

String functionUri = "http://www.example1.org/LevenshteinFunction"; 
        FunctionRegistry.get().put(functionUri , LevenshteinFilter.class);

        String s = "whatever you want";
        String sparql = prefixes+" SELECT DISTINCT ?l WHERE { ?x rdfs:label ?l . " +  "FILTER(fct:LevenshteinFunction(?l, \"" + s + "\") < 4) }";                                              
        Query query = QueryFactory.create(sparql);
        QueryExecution qexec = QueryExecutionFactory.create(query, model); 
        ResultSet rs = qexec.execSelect();

但是,如果我使用相同数据集(full.ttl)的工作fuseki端点,如下所示:

fusekiUrl="http://localhost:3030/ds/query";

发送这样的查询(使用 QueryExecutionFactory.sparqlService(fusekiUrl,query)而不是 QueryExecutionFactory.create(查询,模型)):

String functionUri = "http://www.example1.org/LevenshteinFunction"; 
        FunctionRegistry.get().put(functionUri , LevenshteinFilter.class);

        String s = "whatever you want";
        String sparql = prefixes+" SELECT DISTINCT ?l WHERE { ?x rdfs:label ?l . " + "FILTER(fct:LevenshteinFunction(?l, \"" + s + "\") < 4) }";                                       
        Query query = QueryFactory.create(sparql);
        QueryExecution qexec = QueryExecutionFactory.sparqlService(fusekiUrl,query); 
        ResultSet rs = qexec.execSelect();

然后我没有得到任何结果。在这两种情况下,我打印出了FunctionRegistry,它们包含完全相同的条目,尤其是:

键= http://www.example1.org/LevenshteinFunction 值:org.apache.jena.sparql.function.FunctionFactoryAuto@5a45133e

有任何线索吗?

由于

回到那个我终于解决的问题。有几个问题,一个是(显然是!!)远程端点和客户端在不同的jvms上运行的事实。

为了让这个工作正常,请执行以下操作(对于一个愚蠢的MyFilter自定义函数 - 即strlen):

1)在fuseki服务器上部署自定义函数类jar

2)修改fuseki配置:

add [] ja:loadClass "my.functions.package.MyFilter"

MyFilter实现的地方是:

import org.apache.jena.sparql.expr.NodeValue;
import org.apache.jena.sparql.function.FunctionBase1;


public class MyFilter extends FunctionBase1 {

public MyFilter() { super() ; }

public NodeValue exec(NodeValue value1){

        int d = value1.asString().length();
        return NodeValue.makeInteger(new Integer(d)); 
    }
}

3)将以下前缀添加到上下文中:

PREFIX f: <java:my.functions.package.>

请注意“my.functions.package”。是MyFilter的包 课程,而不是课程本身 - &gt;这意味着你永远不会打电话给班级 sparql查询中的方法,但只有一个实现的类 org.apache.jena.sparql.function.FunctionBaseX其中X是数字 过滤函数的参数

4)写下(例如)这样的查询:

SELECT DISTINCT ?l
WHERE { ?x skos:prefLabel ?l .  
  FILTER (f:MyFilter(?l) < 20) 
}

编辑:第2步)没有必要

0 个答案:

没有答案