rdf jena API сравнивает субъект предикат объекта

Я создал функцию расширения sparql! как я могу сравнить тему, объект и имя файла rdf с параметром функции, которая является (тема, свойство, объект)?

Это моя функция, но она не отображает никакого результата!

import static com.sun.org.apache.xalan.internal.xsltc.compiler.util.Type.String;
import java.*;
import java.io.*;**strong text**
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.jena.datatypes.xsd.XSDDatatype;
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.expr.NodeValue;
import org.apache.jena.sparql.function.Function;
import org.apache.jena.sparql.function.FunctionBase2;
import org.apache.jena.sparql.function.FunctionFactory;
import static org.apache.jena.vocabulary.RDF.Nodes.object;
import static org.apache.jena.vocabulary.RDF.Nodes.predicate;
import static org.apache.jena.vocabulary.RDF.Nodes.subject;

public  class haschild extends FunctionBase2 implements FunctionFactory{
private Map _cache;

public haschild()
{
    _cache = new HashMap();
}



@Override
public NodeValue exec(NodeValue v1, NodeValue v2) {
    String value = v2.asString();
    String value2 = v1.asString();
   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();

  // affiche l'objet, le prédicat et le sujet de chaque déclaration
  while (iter.hasNext()) {
  Statement stmt      = iter.nextStatement();  // obtenir la prochaine     déclaration
Resource  subject   = stmt.getSubject();     // obtenir le sujet
Property  predicate = stmt.getPredicate();   // obtenir le prédicat
RDFNode   object    = stmt.getObject();      // obtenir l'objet

if((value2.equals(subject.toString()))&&(object.toString().equals(value))&&(predicate.toString().equals("http://www.w3.org/2000/01/rdf-schema#HasChild")))

                         return NodeValue.TRUE;


                            return NodeValue.FALSE;}

                           return null;
                                 }

                                @Override
                public Function create(String uri) {
                     throw new UnsupportedOperationException("Not supported   yet."); //To change body of generated methods, choose Tools | Templates.}



}

person Hmaida Abdelhedi    schedule 21.10.2015    source источник
comment
Используйте RDFDataMgr для чтения файла. Имейте в виду, что функции могут вызываться много раз в одном выполнении запроса даже с одними и теми же аргументами (предполагается, что их вызов довольно дешев).   -  person AndyS    schedule 21.10.2015


Ответы (1)


Сравните узлы, поддерживающие различные элементы, и .equals.

См. NodeValue#asNode и RDFNode.asNode.

Если вам нужно равенство значений (например, 1 равно +1.0e0), преобразуйте RDFNode.asNode в NodeValue и используйте NodeValue.sameAs.

NodeValue.asString возвращает версию значения синтаксиса SPARQL. Не для использования в сравнениях.

person AndyS    schedule 21.10.2015