В моей базе данных у меня есть тройки вроде:
DocumentUri -> dc.title -> title
DocumentUri -> dc.language -> language
DocumentUri -> dc.description -> description
DocumentUri -> dc.creator -> AuthorUri
Я хотел бы иметь возможность искать document
title, а затем получать все свойства из всех документов, соответствующих поиску по заголовку.
Я пытаюсь сделать это с Jena
и SPARQL
. Я сделал запрос, который получает title
, чтобы получить Uris из документов с данным заголовком. Это метод, он возвращает URI и сохраняет их в списке с именем webDocumentListInicial
:
public void searchUriByTitle() {
RDFNode documentUriNode;
String queryString = "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> " +
"PREFIX dc: <http://purl.org/dc/elements/1.1/> SELECT ?document WHERE { " +
"?document dc:title ?title." +
"FILTER (?title = \"" + this.getTitle() + "\" ). }";
Query query = QueryFactory.create(queryString);
QueryExecution qe = QueryExecutionFactory.create(query, databaseModel);
ResultSet results = qe.execSelect();
while( results.hasNext() ) {
QuerySolution querySolution = results.next();
documentUriNode = querySolution.get("document");
WebDocument document = new WebDocument(documentUriNode.toString());
this.webDocumentListInicial.add(document);
}
qe.close();
}
Чтобы получить создателя документа, я сделал еще один запрос, потому что в этом случае tha value
из тройки является другим ресурсом. Здесь я повторяю list
URI документов, которые были заполнены описанным выше методом.
public void searchAuthorByTitle() {
for( WebDocument doc : this.webDocumentListInicial ) {
RDFNode authorUriNode;
String queryString = "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> " +
"PREFIX dc: <http://purl.org/dc/elements/1.1/> SELECT ?author WHERE { " +
"?document dc:creator ?author." +
"FILTER (?document = <" + doc.getUri() + "> ). }";
Query query = QueryFactory.create(queryString);
QueryExecution qe = QueryExecutionFactory.create(query, databaseModel);
ResultSet results = qe.execSelect();
while( results.hasNext() ) {
QuerySolution querySolution = results.next();
authorUriNode = querySolution.get("author");
WebAuthor author;
author = this.searchAuthorProperties(authorUriNode.toString(), new WebAuthor(authorUriNode.toString()) );
doc.addAuthor(author);
}
qe.close();
}
}
И чтобы получить другие свойства документа, мне нравится пример ниже, где я повторяю list
, который был заполнен в первом методе, который я показал выше.
public void searchDescription() {
for( WebDocument doc : this.webDocumentListInicial ) {
String description = "";
Resource resource = ResourceFactory.createResource(doc.getUri());
StmtIterator descriptionStmtIt = databaseModel.listStatements(resource, DC.description,(RDFNode) null);
while( descriptionStmtIt.hasNext() ) {
description = descriptionStmtIt.next().getObject().toString();
}
doc.setDescription(description);
}
}
Такой способ обработки данных не очень продуктивен, потому что мне нужен другой запрос для каждого свойства, которое я получаю.
Можно ли сделать только один запрос, чтобы получить URI документа и все остальные свойства документа одновременно? Я пробовал это однажды, вот так:
String queryString = "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> " +
"PREFIX dc: <http://purl.org/dc/elements/1.1/> SELECT ?document ?description " +
"?language ?author WHERE { " +
"?document dc:title ?title." +
"?document dc.language ?language" +
"?document dc.description ?description" +
"?document dc.creator ?author" +
"FILTER (?title = \"" + this.getTitle() + "\" ). }";
Но когда у меня было более одного документа, соответствующего заданному заголовку, было трудно понять, какие возвращаемые свойства принадлежат каждому документу.
Спасибо!!
document
,author
иdate
.author
иdate
в строке связаны сdocument
в этой строке. Если вам нужно скопировать эти результаты в какую-то другую структуру данных, это не проблема, но на самом деле это не имеет большого отношения к Jena или SPARQL, как таковым; это просто вопрос о том, как использовать HashMap. Судя по вашему описанию, вам нужен HashMap с одной записью для каждой строки, где значение является решением. 07.12.2013