Запрос Sparql выполняется вечно

Я борюсь с выполнением запроса SPARQL в Йене, в результате чего я не понимаю ...

Я пытаюсь запросить онтологию Esco (https://ec.europa.eu/esco/download), и я использую TDB для загрузки онтологии и создания модели (извините, если термины, которые я использую, не точны, я не очень опытен).

Моя цель - найти uri должности в онтологии, которая соответствует тексту, который я ранее извлек: ex: extract term: "acuponcteur" -> label в онтологии: "Acuponcteur" @ fr -> uri: http://ec.europa.eu/esco/occupation/14918>

То, что я называю «странным поведением», связано с результатами, которые я получаю (или нет) при отправке запросов, то есть:

При выполнении следующего запроса:

PREFIX skos: <http://www.w3.org/2004/02/skos/core#> 
PREFIX esco: <http://ec.europa.eu/esco/model#>      
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>   
SELECT ?position    
WHERE {     
    ?s rdf:type esco:Occupation. 
    { ?position skos:prefLabel ?label. } 
    UNION 
    { ?position skos:altLabel ?label. } 
    FILTER (lcase(?label)= \"acuponcteur\"@fr ) 
}
LIMIT 10 

Я получаю эти результаты через 1 минуту:

-----------------------------------------------
| position                                    |
===============================================
| <http://ec.europa.eu/esco/occupation/14918> |
| <http://ec.europa.eu/esco/occupation/14918> |
| <http://ec.europa.eu/esco/occupation/14918> |
| <http://ec.europa.eu/esco/occupation/14918> |
| <http://ec.europa.eu/esco/occupation/14918> |
| <http://ec.europa.eu/esco/occupation/14918> |
| <http://ec.europa.eu/esco/occupation/14918> |
| <http://ec.europa.eu/esco/occupation/14918> |
| <http://ec.europa.eu/esco/occupation/14918> |
| <http://ec.europa.eu/esco/occupation/14918> |
-----------------------------------------------

Однако, когда я пытаюсь добавить ключевое слово DISTINCT, таким образом:

PREFIX skos: <http://www.w3.org/2004/02/skos/core#> 
PREFIX esco: <http://ec.europa.eu/esco/model#>      
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>   
SELECT DISTINCT ?position   
WHERE {     
    ?s rdf:type esco:Occupation. 
    { ?position skos:prefLabel ?label. } 
    UNION 
    { ?position skos:altLabel ?label. } 
    FILTER (lcase(?label)= \"acuponcteur\"@fr ) 
}
LIMIT 10 

похоже, что запрос продолжает выполняться вечно (я остановил выполнение после 20 минут ожидания ...)

Я получаю такое же поведение при выполнении того же запроса, что и первый (то есть без DISTINCT), с другой меткой для сопоставления, меткой, которой, я уверен, нет в онтологии. Ожидая пустого результата, он (кажется, что он) продолжает работать, и я должен убить его через некоторое время (опять же, я ждал не больше 20 минут):

PREFIX skos: <http://www.w3.org/2004/02/skos/core#> 
PREFIX esco: <http://ec.europa.eu/esco/model#>      
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>   
SELECT ?position    
WHERE {     
    ?s rdf:type esco:Occupation. 
    { ?position skos:prefLabel ?label. } 
    UNION 
    { ?position skos:altLabel ?label. } 
    FILTER (lcase(?label)= \"assistante scolaire\"@fr ) 
}
LIMIT 10 

Может быть проблема в коде, который я использую? Вот оно:

public static void main(String[] args) {

    // Make a TDB-backed dataset
    String directory = "data/testtdb" ;
    Dataset dataset = TDBFactory.createDataset(directory) ;

    // transaction (protects a TDB dataset against data corruption, unexpected process termination and system crashes)
    dataset.begin( ReadWrite.WRITE );
    // assume we want the default model, or we could get a named model here
    Model model = dataset.getDefaultModel();

    try {

          // read the input file - only needs to be done once
          String source = "data/esco.rdf";
          FileManager.get().readModel(model, source, "RDF/XML-ABBREV");

          // run a query

          String queryString =
                    "PREFIX skos: <http://www.w3.org/2004/02/skos/core#> " +
                    "PREFIX esco: <http://ec.europa.eu/esco/model#> " +     
                    "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> " +  
                    "SELECT ?position " +   
                    "WHERE { "  +   
                    "   ?s rdf:type esco:Occupation. " +
                    "   { ?position skos:prefLabel ?label. } " +
                    "   UNION " +
                    "   { ?position skos:altLabel ?label. }" +
                    "   FILTER (lcase(?label)= \"acuponcteur\"@fr ) " +
                    "}" +
                    "LIMIT 1 "  ;

          Query query = QueryFactory.create(queryString) ;

          // execute the query
          QueryExecution qexec = QueryExecutionFactory.create(query, model) ;
          try {
              ResultSet results = qexec.execSelect() ;
              // taken from apache Jena tutorial 
              ResultSetFormatter.out(System.out, results, query) ;

          } finally { 
              qexec.close() ; 
          }

      } finally {
          model.close() ;
          dataset.end();
      }

}

Что я здесь делаю не так? Любая идея?

Спасибо!


person CecileR    schedule 14.08.2014    source источник


Ответы (1)


В качестве первого момента, который может иметь или не иметь большого значения, вы можете использовать путь свойства, чтобы упростить

{ ?position skos:prefLabel ?label. } 
UNION 
{ ?position skos:altLabel ?label. } 

as

?position skos:prefLabel|skos:altLabel ?label 

Это делает запрос:

SELECT ?position    
WHERE {     
    ?s rdf:type esco:Occupation.                   # (1)
    ?position skos:prefLabel|skos:altLabel ?label  # (2)
    FILTER (lcase(?label)="acuponcteur"@fr ) 
}

Какой смысл в этом запросе? Есть некоторое количество n пар? Позиция /? Метка, которые соответствуют (2), и несколько числовых значений m? S, которые соответствуют (1). Количество результатов, которые вы получаете по запросу, составляет mn, но вы никогда не используете значение? S. Похоже, вы использовали DISTINCT, чтобы избавиться от некоторых повторяющихся значений, но вы не пытались понять, почему вообще получаются повторяющиеся значения. Вам нужно просто удалить бесполезную строку (1) и получить запрос:

SELECT DISTINCT ?position    
WHERE {     
    ?position skos:prefLabel|skos:altLabel ?label
    FILTER (lcase(?label)="acuponcteur"@fr ) 
}

Я не удивлюсь, если в данный момент вам даже не понадобится DISTINCT.

person Joshua Taylor    schedule 14.08.2014
comment
Мне так стыдно, что моя проблема заключалась в том, что на самом деле это ошибка ...? S должно быть? Position, поскольку я хотел выбрать только URI-позиции, которые имеют rdf: type esco: Occupation. Спасибо за упрощение для UNION! Что касается чтения набора данных и создания модели, я фактически поместил его в другой класс, чтобы ему не приходилось повторять это каждый раз, но я упростил код для вопроса. - person CecileR; 14.08.2014