2013-08-15 1 views
4

У меня есть конечная точка Fuseki, работающая на каком-то сервере. Я хотел бы передать пользовательские функции, используя библиотеку Jena's com.hp.hpl.jena.sparql.function. К сожалению, я получаю ошибку:Как вы используете пользовательские функции в fuseki?

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

Я удостоверился, чтобы добавить класс (в баночке, содержащую файл) к классам, и я могу получить доступ к этому классу из других приложений, использующих этот класс на этом сервере.

Пример, к которому я сейчас пользуюсь, - это некоторая функция, которая берет предмет всех троек в графе и возвращает первую половину каждого объекта.

В качестве эталона, я добавил функцию ниже:

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) 
} 

Запуск фусеки (с использованием конфигурации по умолчанию, который был дан с фусеки) :

cd FUSEKI_HOME 
./fuseki-server --mem /ds 
+0

Он должен работать, если у вас есть код на пути к классам. Стандартный скрипт, который использовал -jar, не будет работать. если вы хотите дать полный, минимальный пример, возможно, мы сможем решить, что происходит. – AndyS

+0

Извините за поздний ответ, я запустил скрипт fuseki-server с некоторыми фиктивными троек (запрос sparql вызывает тройки, поэтому я знаю, что данные есть, но функция ничего не возвращает) только с той функцией, которую я накладываю на путь к классам. – ybt195

+0

@ ybt195 Пожалуйста, отредактируйте свой вопрос, чтобы точно показать, как вы побежали Fuseki – RobV

ответ

1

Проблема не в Fuseki. Документация Java утверждает, что при использовании команды java с опцией -jar,

the JAR file is the source of all user classes, and other user class path settings are ignored.

Простое добавление файла банку с пользователем определенных функций в переменной CLASSPATH не решит проблему, как переменная окружения будет игнорироваться. Кроме того, использование опции --classpath или -cp также будет проигнорировано.

Для того, чтобы Fuseki мог загружать файлы jar, вам необходимо добавить местоположение в файл jar с вашими определенными пользователем функциями к ключу класса в файле манифеста fuseki-server.jar.

Чтобы сделать это, выполните команду:

jar umf manifest-file fuseki-server.jar 

манифеста-файл:

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

В качестве сравнения, this описывает процесс добавления классов к банку файлы класса пути более подробно.