Не удается получить результаты КОНСТРУКТИВНОГО запроса

#java #rdf #jena

#java #rdf #jena

Вопрос:

Я просматриваю разные файлы .ttl и выполняю запрос для извлечения необходимой информации. Мне нужен результат в формате .rdf. Запрос отлично работает с оператором SELECT с отображением всех результатов, но когда я переключаюсь на CONSTRUCT, он не показывает результаты.

Как я также вижу, в queryExecute нет функции hasNext(). Как я могу создать часть while / hasNext с помощью queryExecute?

 while (resultat.hasNext()) {
QuerySolution sol=resultat.nextSolution();
System.out.println(sol); 
  

Код выглядит следующим образом:

 Model m2 = FileManager.get().loadModel(files[i].getAbsolutePath());
String queryString = "PREFIX mus: <http://data.doremus.org/ontology#>"
  "PREFIX ecrm: <http://erlangen-crm.org/current/>"
  "PREFIX foaf: <http://xmlns.com/foaf/0.1/>"
  "PREFIX efrbroo: <http://erlangen-crm.org/efrbroo/>"
  "CONSTRUCT {?F22_Self_Contained_Expression ?composerName       ?catalogueNumber}"
  "WHERE {"
  "?F22_Self_Contained_Expression mus:U16_has_catalogue_statement/mus:U41_has_catalogue_number ?catalogueNumber."
  "?F28_Expression_Creation efrbroo:R17_created ?F22_Self_Contained_Expression;"
  "ecrm:P9_consists_of/ecrm:P14_carried_out_by/ecrm:P131_is_identified_by ?composerName."
  " }";


Query query = QueryFactory.create(queryString);
QueryExecution qexec= QueryExecutionFactory.create(query, m2);
Model resultModel = qexec.execConstruct();
qexec.close();

String outfile = "/outfile.rdf";
OutputStream out = new FileOutputStream(outfile);
RDFDataMgr.write(System.out, resultModel, Lang.RDFXML);
  

То, что я получаю в результате этого запроса, является:

 </rdf:RDF>
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:efrbroo="http://erlangen-crm.org/efrbroo/"
xmlns:cro="http://rhizomik.net/ontologies/copyrightonto#"
xmlns:schema="http://schema.org/"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:mus="http://data.doremus.org/ontology#"
xmlns:dcterms="http://purl.org/dc/terms/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:time="http://www.w3.org/2006/time#"
xmlns:ecrm="http://erlangen-crm.org/current/"
xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns:prov="http://www.w3.org/ns/prov#"
xmlns:foaf="http://xmlns.com/foaf/0.1/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema#">
</rdf:RDF>
  

Комментарии:

1. Очень вероятно, что значения, привязанные к `?composerName’, не являются IRI, поэтому недопустимые предикаты

2. Да, это то, что я также предполагаю. В RDF у вас есть тройки, и предикатом тройки должен быть URI, а не литерал.

3. Что касается «Как я также вижу, в queryExecute нет функции hasNext(). Как я могу сконструировать часть while / hasNext с помощью queryExecute?» — вы имеете в виду результат КОНСТРУКТИВНОГО запроса? Если да, то Model содержит Statements , доступный через Model::listStatements()

4. Спасибо за быстрый ответ. Да, точно, это не IRIs, а литералы. Как я могу исправить эту проблему в запросе?

5. @Aram вы можете использовать определенные предикаты по вашему выбору в CONSTRUCT caluse so, чтобы связать значения ?composerName и ?catalogueNumber , например: CONSTRUCT { ?F22_Self_Contained_Expression ecrm:P131_is_identified_by ?composerName; mus:U41_has_catalogue_number ?catalogueNumber }