2015-02-05 2 views
1

У меня есть следующий код:Введите значения из списка в SPARQL запроса

public static List getSomeReceipes(List ing){ 
    List list = new ArrayList(); 

    String log4jConfPath = "C:/Users/Karen/workspace/Jena/src/Tutorial/log4j.properties"; 
    PropertyConfigurator.configure(log4jConfPath); 
    String ingre = " "; 

    try { 
     //opening owl file 
     Model model = ModelFactory.createDefaultModel(); 
     model.read(new FileInputStream("C:/Users/Karen/Desktop/Proyecto/bbdd.owl"), null, "TTL"); 
     //System.out.println(model); 
     for(int i=0; i<ing.size(); i++){ 
      ingre = (String) ing.get(i); 
      System.out.println(ingre); 
     } 
     //create a new query 
       String queryString 
       ="PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>" 
       +"PREFIX owl: <http://www.w3.org/2002/07/owl#>" 
       +"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>" 
       +"PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>"   
       +"PREFIX rec:<http://www.receta.org#>" 
       +"SELECT reduced ?r WHERE { " 
       +" ?x rdf:type rec:Receta . " 
       +" ?x rdfs:label ?r." 
       +" filter not exists {" 
       +" ?x rec:Ingrediente ?i" 
       +" filter(?i not in (rec:" + ing + "))" 
       +"}" 
       +"}"; 
     com.hp.hpl.jena.query.Query q = QueryFactory.create(queryString); 

     //execute the query and obtain results 

     QueryExecution qe = QueryExecutionFactory.create(q, model); 
     ResultSet results = qe.execSelect(); 

     //print query results 
     while (results.hasNext()) { 
      //System.out.println(results.getResourceModel()); 
      //ResultSetFormatter.out(System.out,results, q); 
      list.add(results.next()); 
     } 
    } catch (java.lang.NullPointerException e) { 
     System.out.println(e); 
    } catch (Exception e) { 
     //System.out.println("Query Failed !"); 
    } 
    System.out.println(list.toString() + "\n"); 
     return list;  
} 

Я хотел бы добавить каждый элемент списка, приведенного (ING) в запросе. Так что давайте говорить у меня есть список, как: ING = [томат, огурец, соль] Я хотел бы создать запрос, как это:

    String queryString 
       ="PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>" 
       +"PREFIX owl: <http://www.w3.org/2002/07/owl#>" 
       +"PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>" 
       +"PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>"   
       +"PREFIX rec:<http://www.receta.org#>" 
       +"SELECT reduced ?r WHERE { " 
       +" ?x rdf:type rec:Receta . " 
       +" ?x rdfs:label ?r." 
       +" filter not exists {" 
       +" ?x rec:Ingrediente ?i" 
       +" filter(?i not in (rec:" + Tomato + ", rec:" + Cucumber + ", rec:" + Salt + "))" 
       +"}" 
       +"}"; 

Есть ли вообще это делать? Есть идеи?

+0

Это звучит как дубликат недавнего вопроса ... (поиск) –

+0

Какой вопрос? Можете ли вы поместить ссылку здесь, пожалуйста? – SomeAnonymousPerson

+1

Вот почему я сказал «поиск». Я еще не нашел его. Во всяком случае, я думал о [Может ли SPARQL (Jena) UPDATEs параметризуться наборами литералов (вместо литералов)?] (Http://stackoverflow.com/q/27822769/1281433) –

ответ

1

Предполагая, что ваш список является простым списком строк, это становится простым базовым программированием на Java, и вы можете очень легко сделать это, написав метод, который принимает входной файл List<String> и выводит список как строку в синтаксисе SPARQL. Например:

String convertToSPARQLList(List<String> list) { 
    StringBuffer sb = new StringBuffer(); 
    sb.append("("); 
    for(String item: list) { 
     sb.append("rec:" + item); 
     sb.append(", "); 
    } 
    sb.setLength(sb.length() - 2); // remove last comma and whitespace 
    sb.append(")"); 
    return sb.toString(); 
} 

, а затем использовать этот метод в строительстве запроса:

String queryString = 
     .... 
    + "filter(?i not in " + convertToSPARQLList(in) + ")" 
    + " }" 
    + "}";