2015-11-02 135 views
1

我想用arq jena编写一个属性函数扩展sparql,我该怎么写? 请求:属性函数扩展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(); 

提取RDF的sebject,谓语和宾语:

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

比较RDF与主语和谓语的主体探析和谓词的要求

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

ih有问题: 15:32:26 WARN Loader :: Class'Next'found found but not a PropertyFunction –

+0

您的代码是PropertyFunctionFactory,而不是PropertyFunction。检查注册 - 它可以是PropertyFunction的类,也可以是PropertyFunctionFactory的实例。不注册“... Next.class”。 – AndyS