параметризованный запрос SPARQL

Я хочу закодировать параметризованный запрос SPARQL в Java Jena, где будет введен один из тройных запросов.

поэтому в приведенном ниже коде мне нужно ввести значение в виде строки для перехода к классу

Однако запрос SPARQL правильный, поэтому, когда я заменяю «значение» именем класса, я получаю правильный результат.

Я пробовал два кода, ни один из них не работал Нет результата или ошибка времени выполнения

первый код:

package ontology;

import org.apache.jena.iri.impl.Main;
import com.hp.hpl.jena.query.ParameterizedSparqlString;
import com.hp.hpl.jena.query.Query;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.query.QuerySolution;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.util.FileManager;

public class SPARQL {
     public static void sparqlTest( String str)
     {
FileManager.get().addLocatorClassLoader(Main.class.getClassLoader());
Model model=FileManager.get().loadModel("ASO.owl");
    String queryString=

                "PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#>"+ 
                "PREFIX rdf:< http://www.w3.org/1999/02/22-rdf-syntax-ns#>"+
                "PREFIX HASO:< http://www.semanticweb.org/rabaa006/ontologies/2014/4/HASO#>"+

                 "SELECT  ?x  "+

                 "WHERE"+ 

                 "      {?x rdfs:subClassOf  HASO:Affective_State}";


   ParameterizedSparqlString queryStr = new   ParameterizedSparqlString(queryString);
   queryStr.setLiteral("value", str);

   Query  query=QueryFactory.create(queryStr.toString());

   QueryExecution qexec = QueryExecutionFactory.create(query,model);

   try {
   ResultSet results = qexec.execSelect();

   while ( results.hasNext()){
           QuerySolution soln = results.nextSolution();
           String strg=soln.getResource("?x").toString();
           //System.out.println(strg);
             String number = strg.substring(strg.lastIndexOf("#") + 1);
             System.out.println(number);

   }}

   finally{
   qexec.close();}

}
}

Второй код:

package ontology;

import org.apache.jena.iri.impl.Main;
import com.hp.hpl.jena.query.ParameterizedSparqlString;
import com.hp.hpl.jena.query.Query;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.query.QuerySolution;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.util.FileManager;

public class SPARQL {
public static void sparqlTest( String str)
     {

FileManager.get().addLocatorClassLoader(Main.class.getClassLoader());
Model model=FileManager.get().loadModel("ASO.owl");

   ParameterizedSparqlString pss = new ParameterizedSparqlString();
   pss.setCommandText (
                       "PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#>"+ 

                       "PREFIX rdf:< http://www.w3.org/1999/02/22-rdf-syntax-ns#>"+

                       "PREFIX HASO:< http://www.semanticweb.org/rabaa006/ontologies/2014/4/HASO#>"+


                 "SELECT  ?x  "+
                  "WHERE"+ 
    "      {?x rdfs:subClassOf  HASO:valuee}");
    pss.setLiteral("value", str);

   Query  query=QueryFactory.create(pss.toString());
   QueryExecution qexec = QueryExecutionFactory.create(query,model);

   try {
    ResultSet results = qexec.execSelect();

   while ( results.hasNext()){
           QuerySolution soln = results.nextSolution();
           String strg=soln.getResource("?x").toString();
           //System.out.println(strg);
             String number = strg.substring(strg.lastIndexOf("#") + 1);
             System.out.println(number);

   }}

  finally{

 qexec.close();}
 }
}

person rana othman    schedule 23.03.2017    source источник
comment
Уже спрашивали и отвечали в списке рассылки пользователей Jena.   -  person AndyS    schedule 23.03.2017
comment
Я не нашел ответа на свой вопрос в списке рассылки пользователей Jena   -  person rana othman    schedule 23.03.2017


Ответы (2)


Прошло некоторое время с тех пор, как я не использовал SPARQL, но я не понимаю, как вы на самом деле вводите параметр значения в свой код. Это должно быть что-то вроде этого:

   pss.setCommandText (
        "PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#>"+ 
        "PREFIX rdf:< http://www.w3.org/1999/02/22-rdf-syntax-ns#>"+
        "PREFIX HASO:< http://www.semanticweb.org/rabaa006/ontologies/2014/4/HASO#>"+


             "SELECT  ?x  "+
              "WHERE"+ 
                   "{?x HASO:value ?value}");
                    pss.setLiteral("value", str);

Возможно, вы будете использовать какой-то другой предикат, но для того, чтобы ввести значение, вы должны иметь ?value в своем запросе как объект.

person zoran jeremic    schedule 23.03.2017
comment
Я попробовал следующее, но безрезультатно pss.setCommandText (ПРЕФИКС rdfs:‹w3.org/2000/01/rdf-schema#›+ ПРЕФИКС rdf: ‹w3.org/1999/02/22-rdf-syntax-ns#›+ ПРЕФИКС HASO: ‹semanticweb.org/rabaa006/ontologies/2014/4/HASO#›+ SELECT ?x + WHERE+ {?x rdfs: подкласс ?значение}); pss.setLiteral(значение, HASO:Affective_State); Запрос query=QueryFactory.create(pss.toString()); - person rana othman; 24.03.2017
comment
Проблема в том, что вы пытаетесь установить ресурс как буквальное значение. Когда у вас есть тройка {?person name ?namevalue}, вы установите namevalue как литерал, и вы должны использовать pss.setLiteral(nameValue, Bob). Если у вас есть тройка {?person rdfs:subClassOf ?entity}, вы должны установить ее не как литерал, а как ресурс. Это должно быть что-то вроде pss.setIni(entity,someurihere/Entity) - person zoran jeremic; 24.03.2017
comment
setIni for (string, iri), а не (string, string), следующая строка будет передана другим классом классу, у которого есть запрос SPARQL. - person rana othman; 24.03.2017
comment
а если я напишу следующее? Узел n = NodeFactory.createVariable(HASO:Affective_State); pss.setParam (значение, n); или Node n= NodeFactory.createLiteral(HASO:Affective_State); pss.setParam (значение, n); - person rana othman; 24.03.2017
comment
ParameterizedSparqlString pss = new ParameterizedSparqlString(); pss.setCommandText ( SELECT ?x + WHERE+ {?x rdfs:subClassOf ?value}); pss.setNsPrefix(rdfs, w3.org/2000/01/rdf-schema#< /а>); pss.setNsPrefix(rdf, w3.org/1999/02/22 -rdf-синтаксис-ns#); pss.setNsPrefix(HASO,semanticweb.org/rabaa006/ontologies/2014/4 /HASO#); Узел n= NodeFactory.createLiteral(HASO:Affective_State); Система.out.println(n); pss.setParam (значение, n); n= HASO:Affective_State, возможно, это вызывает ошибку в n - person rana othman; 24.03.2017
comment
setIri имеет 2 API, один с IRI и один со строкой в ​​качестве второго аргумента, поэтому вы можете передать его, как я предложил, как строковое значение. Вы также можете передать Node, используя метод setParam, как вы предложили, но вместо этого вы снова создаете Literal. В вашем случае лучше использовать NodeFactory.createURI. - person zoran jeremic; 25.03.2017

Проблема с использованием setLitral() заключается в введении строки в запрос, заключенный в двойные кавычки, например:

String queryString
            = "PREFIX rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
            + "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n"
            + "PREFIX HASO: <http://www.semanticweb.org/rabaa006/ontologies/2014/4/HASO#>"
            + "SELECT ?x WHERE {\n"
            + "  ?x rdfs:subClassOf ?clazz \n"
            + "}\n";

    ParameterizedSparqlString queryStr = new ParameterizedSparqlString(queryString);

    queryStr.setLiteral("clazz", "HASO:Affective_State");

    System.out.println(queryStr.toString());

Результат запроса будет таким:

PREFIX rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX HASO: <http://www.semanticweb.org/rabaa006/ontologies/2014/4/HASO#>SELECT ?x WHERE {
  ?x rdfs:subClassOf "HASO:Affective_State" 
}

Как вы видите выше, ?x rdfs:subClassOf "HASO:Affective_State" где "HASO:Affective_State" . неправильное имя класса, поскольку оно содержит "", поэтому при выполнении этого запроса результаты не возвращаются. РЕШЕНИЕ Используйте String.format вместо ParameterizedSparqlString::setLiteral:

String q
            = "PREFIX rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
            + "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n"
            + "PREFIX HASO: <http://www.semanticweb.org/rabaa006/ontologies/2014/4/HASO#>"
            + "SELECT ?x WHERE {\n"
            + "  ?x rdfs:subClassOf %s \n"
            + "}\n"
            + "LIMIT %d";

    q = String.format(q, "HASO:Affective_State", 2);
    System.out.println(q);

Результат :

PREFIX rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX HASO: <http://www.semanticweb.org/rabaa006/ontologies/2014/4/HASO#>SELECT ?x WHERE {
  ?x rdfs:subClassOf HASO:Affective_State 
}
LIMIT 2

Как вы видите выше, HASO:Affective_State и 2 были введены правильно, поэтому вы можете вводить столько параметров, сколько хотите, используя String.format [%s для строки, %d для цифры и т. д..]

Полный пример:

public static void main(String[] args) {

    JenaSystem.init();
    UpdateFactory.create();

    Model model = FileManager.get().loadModel("ASO.owl");

    String q
            = "PREFIX rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n"
            + "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n"
            + "PREFIX HASO: <http://www.semanticweb.org/rabaa006/ontologies/2014/4/HASO#>"
            + "SELECT ?x WHERE {\n"
            + "  ?x rdfs:subClassOf %s \n"
            + "}\n"
            + "LIMIT %d";

    q = String.format(q, "HASO:Affective_State", 2);
    System.out.println(q);
    Query query = QueryFactory.create(q);
    QueryExecution qexec = QueryExecutionFactory.create(query, model);
    ResultSet resSet = qexec.execSelect();

    while (resSet.hasNext()) {

        QuerySolution soln = resSet.nextSolution();
        String strg = soln.getResource("?x").toString();
        System.out.println(">>>>>>> " + strg);
        String number = strg.substring(strg.lastIndexOf("#") + 1);
        System.out.println("<<<<<< " + number);

    }


}
person muhammed senussi    schedule 25.03.2017
comment
zoran jeremic вот код с SetParam, но все еще безрезультатно ParameterizedSparqlString pss = new ParameterizedSparqlString(); pss.setCommandText ( SELECT ?x + WHERE+ {?x rdfs:subClassOf ?value}); pss.setNsPrefix(rdfs, w3.org/2000/01/rdf-schema#< /а>); pss.setNsPrefix(rdf, w3.org/1999/02/22 -rdf-синтаксис-ns#); pss.setNsPrefix(HASO,semanticweb.org/rabaa006/ontologies/2014/4 /HASO#); Узел n= NodeFactory.createURI (HASO:Affective_State); Система.out.println(n); pss.setParam (значение, n); - person rana othman; 28.03.2017