Выберите предложение FROM в Йене, не возвращая результатов - PullRequest
0 голосов
/ 19 сентября 2018

У нас возникают проблемы с надежной отправкой запросов sparql для нескольких графиков с использованием предложения sparql FROM в наборе данных Jena.

Вот пример проблемы:

final String subject = "http://example.com/ont/breakfast#espresso";
final String graph1  = "http://example.com/ont/breakfast/graph#espresso_definition";
final String graph2  = "http://example.com/ont/breakfast/graph#espresso_decoration";

// Add some triples to graphs within the dataset
Dataset  dataset         = DatasetFactory.create();

Model    modelG1         = dataset.getNamedModel(graph1);
Resource espressoTypeG1  = modelG1.createResource(subject)
                                  .addProperty(RDF.type, OWL.Class);
Resource espressoLabelG1 = modelG1.createResource(subject)
                                  .addProperty(RDFS.label, "Espresso");

Model    modelG2         = dataset.getNamedModel(graph2);
Resource espressoLabelG2 = modelG2.createResource(subject)
                                  .addProperty(RDFS.label, "Black Gold");

// The query to execute - returns no results
String queryString = "select * FROM <" + graph1 + "> FROM <" + graph2 + "> " + 
                     "{ <" + subject + "> ?p ?o }";

// This, however, works:
// String queryString = "select * { graph ?g { <" + subject + "> ?p ?o } }";

// Run the query
Query query = QueryFactory.create(queryString);
try (QueryExecution qe = QueryExecutionFactory.create(query, dataset)) {
    ResultSet results = qe.execSelect();
    while (results.hasNext()) {
        QuerySolution result = results.next();
        System.out.println(result);
    }
}

Сочетаниевыражение values ​​ и ключевое слово graph помогли нам в большинстве сценариев, где нам нужно обрабатывать несколько графиков в одном запросе.Есть некоторые запросы, в которых это становится довольно громоздким или совершенно неэффективным.

Что мы можем сделать, чтобы правильно выполнить запрос по объединению моделей в одном наборе данных?

Обратите внимание, что запросы не известны во время компиляции, поэтому мы не можем полагаться на ручное создание объединений модель s в коде Java.Кроме того, данные обычно добавляются с использованием комбинации загрузки из файлов, обновления sparql и вызовов dataset.asDatasetGraph (). Add (...) .

1 Ответ

0 голосов
/ 19 сентября 2018

Обработка FROM и FROM NAMED зависит от того, поддерживает ли используемая реализация Dataset, реализации по умолчанию в памяти не поддерживают ее по умолчанию.

Для принудительного использования набора данных вы можетеиспользуйте вспомогательные классы DynamicDatasets и DatasetDescription для разрешения указанного набора данных запроса, например

Dataset resolvedDataset = 
     DynamicDatasets.dynamicDataset(DatasetDescription.create(query), dataset, false); 

try (QueryExecution qe = QueryExecutionFactory.create(query, resolvedDataset)) {   
    // Normal result processing logic goes here... 
}
...