java - 属性函数扩展 sparql

标签 java sparql jena arq

我想用arq jena写一个属性函数扩展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;
        }
    };
}
    }

以及如何注册我的函数

最佳答案

属性函数在语法上与常规属性类似。没有特殊的语法。

?Person :somePropertyFunction ?x .

属性函数可以访问三元组模式的主语和宾语。当主语或宾语是 RDF 列表时,还有帮助。

通常,参数作为对象或对象列表,结果作为主题或主题列表。

您不需要使用 .toString .

您无法转换objIterator<Binding> .

看一下一些现有的属性函数。 splitIRI是一个简单的。 concat看一下可能很有用 - 它需要一个参数列表(对象位置)并返回一个主题(变量)。

关于java - 属性函数扩展 sparql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33473870/

相关文章:

java - 注释内的代码在 Unicode 序列之后执行

java - RestTemplate/HttpClient 更改 Spring Boot 1.5 -> 2.1

sparql - 如何使用 arq/tarql 将字符串转换为 URL?

sparql - 在构造查询中使用绑定(bind)连接

java - 如何获取耶拿个人的所有限制

java - 线程结束后再次执行

sparql - 在 JENA 中运行简单 SPARQL 查询时出现 NoSuchMethod 异常

java - 使用 sparql 查询 Jena 从 OWL 文件中检索个体

mysql - Jena SDB 默认编码

java - 如何从 ListView 的每一行中获取项目?