2015-11-02 3 views
1

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

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, предикат и объект из ФРР:

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

СРАВНЕНИЕ suject и предикат РФР с субъектом и предикатом запроса

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

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

ответ

0

Свойства функции выглядят в синтаксисе, как обычные свойства. Специального синтаксиса нет.

?Person :somePropertyFunction ?x . 

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

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

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

Вы не можете отличить obj в Iterator<Binding>.

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

+0

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

+0

У меня есть проблема: 15:32:26 WARN Loader :: Class 'Next' найден, но не PropertyFunction –

+0

Ваш код является PropertyFunctionFactory, а не PropertyFunction. Проверьте регистрацию - это либо класс, который является PropertyFunction, либо является экземпляром PropertyFunctionFactory. Не регистрируется «... Next.class». – AndyS

Смежные вопросы