2015-11-02 220 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