As well s Adam's point (and all the libraries your function needs,
transitively)
What is in the Fuseki log file?
How was the data loaded into Fuseki?
>> I printed out the
>> FunctionRegistry
And
On 26/12/17 14:51, ajs6f wrote:
I'm not as familiar with the extension points of ARQ as I would like to be, but
as I understand what you are doing, you are registering a new function with
your _local_ registry, then firing a query at a _remote_ endpoint (which has a
completely independent registry in a different JVM in a different process,
potentially in a different _system_).
The query is getting interpreted and executed by that remote service, not
locally. So you need to register the function _there_.
Take a look at this thread:
https://lists.apache.org/thread.html/1cda23332af4264883e88697d994605770edcde2f93ddea51240e4b8@%3Cusers.jena.apache.org%3E
It should get you started as to how to register extension functionality in
Fuseki.
Adam Soroka
On Dec 26, 2017, at 9:34 AM, Marc Agate <[email protected]> wrote:
Hi !
I successfully implemented sparql queries using custom ARQ functions
using the following (custom function code):
****************
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);
}
}
***************
it works fine when I query against a Model loaded from a turtle file,
like this:
***************
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();
***************
with the query being sent like this :
***************
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();
***************
However, if i use a working fuseki endpoint for the same dataset
(full.ttl) like this :
***************
fusekiUrl="http://localhost:3030/ds/query";
***************
sending the query like this (using
QueryExecutionFactory.sparqlService(fusekiUrl,query) instead of
QueryExecutionFactory.create(query,model) ):
***************
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();
***************
Then I don't get any results back. In both cases I printed out the
FunctionRegistry and they contain exactly the same entries, especially
:
key=http://www.example1.org/LevenshteinFunction value:
org.apache.jena.sparql.function.FunctionFactoryAuto@5a45133e
Any clue ?
Thanks