On 26/12/17 17:56, Marc Agate wrote:
Hi,

Adam's gave me the right direction.

I managed to load my function class in fuseki config using ja:loadClass

but now remains the following issue (the function is not registered)see
fuseki logs :

[2017-12-26 16:10:13] exec       WARN  URI <http://purl.bdrc.io/functio
ns#MyFilterFunction> has no registered function factory


Your original email had:

>> String functionUri = "http://www.example1.org/LevenshteinFunction";;

This is a different function -
  <http://purl.bdrc.io/functions#MyFilterFunction>

When you load code with ja:loadClass, you need to do the registration for http://purl.bdrc.io/functions#MyFilterFunction

    Andy



How can I register this function now that I have the code available on
the endpoint side ?

Thanks for helping

Marc.


Le mardi 26 décembre 2017 à 17:43 +0000, Andy Seaborne a écrit :
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/1cda23332af4264883e88697d99460
5770edcde2f93ddea51240e4b8@%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.t
tl");
              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

Reply via email to