#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 }