Расширение функции свойства sparql

Я хочу написать расширение функции свойства sparql с помощью arq jena, как я могу написать? Запрос:

SELECT *
WHERE {?Person f:Next(name) ?x.}

мой код функции:

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.jena.atlas.logging.Log;
import org.apache.jena.graph.Node;
import org.apache.jena.query.QueryBuildException;
import org.apache.jena.query.QueryException;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.rdf.model.Property;
import org.apache.jena.rdf.model.RDFNode;
import org.apache.jena.rdf.model.Resource;
import org.apache.jena.rdf.model.Statement;
import org.apache.jena.rdf.model.StmtIterator;
import org.apache.jena.sparql.engine.ExecutionContext;
import org.apache.jena.sparql.engine.QueryIterator;
import org.apache.jena.sparql.engine.binding.Binding;
import org.apache.jena.sparql.engine.iterator.QueryIterNullIterator;
import org.apache.jena.sparql.pfunction.PFuncSimple;
import org.apache.jena.sparql.pfunction.PFuncSimpleAndList;
import org.apache.jena.sparql.pfunction.PropFuncArg;
import org.apache.jena.sparql.pfunction.PropertyFunction;
import org.apache.jena.sparql.pfunction.PropertyFunctionFactory;
import org.apache.jena.sparql.util.IterLib;



public class Next implements PropertyFunctionFactory {
@Override
public PropertyFunction create(final String uri)
{   
    return new PFuncSimple()
    {

        @Override
        public QueryIterator execEvaluated(final Binding parent, final Node        subject, final Node predicate, final Node object, final ExecutionContext execCxt) 
        {   
            Model model = ModelFactory.createDefaultModel();
InputStream is = null;
    try {
        is = new BufferedInputStream(
                new FileInputStream( "C:\\\\fichier rdf/journal.webscience.org-vivo.rdf"));
    } catch (FileNotFoundException ex) {
        Logger.getLogger(haschild.class.getName()).log(Level.SEVERE, null, ex);
    }
 model.read(new InputStreamReader(is), "");
 StmtIterator iter = model.listStatements();

извлечь sebject, предикат и объект из rdf:

 for (;iter.hasNext();) {
  Statement stmt      = iter.nextStatement();
Resource  sub   = stmt.getSubject();    
Property  pred = stmt.getPredicate();   
RDFNode   obj    = stmt.getObject();

сравнение suject и предиката rdf с темой и предикатом запроса

 if ((sub.toString().equals(subject.toString()))||    (pred.toString().equals(predicate.toString())))
           return  new QueryIterPlainWrapper ((Iterator<Binding>) obj,execCxt);
            }
            return null;
        }
    };
}
    }

и как я могу зарегистрировать свою функцию

1 ответ

Решение

Функции свойств в синтаксисе выглядят как обычные свойства. Там нет специального синтаксиса.

?Person :somePropertyFunction ?x .

Функция свойства имеет доступ к субъекту и объекту тройного шаблона. Существует также справка, когда субъект или объект являются списком RDF.

Обычно аргументы идут как объект или список объектов, а результаты - как тема или список тем.

Вам не нужно использовать .toString,

Вы не можете разыграть obj для Iterator<Binding>,

Взгляните на некоторые существующие функции свойств. splitIRI это простой. concat может быть полезно посмотреть - он принимает список аргументов (положение объекта) и возвращает тему (переменную).

Другие вопросы по тегам