2012-06-19 3 views
5

Я новичок в Jena-TDB и SPARQL, так что это может быть глупый вопрос. Я использую tdb-0.9.0, в Windows XP.Jena TDB для хранения и запросов с использованием API

Я создаю модель TDB для своего файла trail_1.rdf. Мое понимание здесь (исправьте меня, если я ошибаюсь) заключается в том, что следующий код прочитает данный файл rdf в модели TDB, а также сохранит/загрузит (не уверен, что является лучшим словом) модель в данном каталоге D:\Project\Store_DB\data1\tdb:

// open TDB dataset 
String directory = "D:\\Project\\Store_DB\\data1\\tdb"; 
Dataset dataset = TDBFactory.createDataset(directory); 

Model tdb = dataset.getDefaultModel(); 

// read the input file 
String source = "D:\\Project\\Store_DB\\tmp\\trail_1.rdf"; 
FileManager.get().readModel(tdb, source); 

tdb.close(); 
dataset.close(); 

Правильно ли это понимание?


Согласно моему пониманию, так как в настоящее время модель хранится в D:\Project\Store_DB\data1\tdb каталоге, я должен быть в состоянии выполнить запрос на него в какой-то более поздний момент времени.

Так запросить TDB магазин в D:\Project\Store_DB\data1\tdb Я попытался следующие, но ничего не печатает:

String directory = "D:\\Project\\Store_DB\\data1\\tdb" ; 
Dataset dataset = TDBFactory.createDataset(directory) ; 

Iterator<String> graphNames = dataset.listNames(); 
while (graphNames.hasNext()) { 
    String graphName = graphNames.next(); 
    System.out.println(graphName); 
} 

Я также попробовал это, что также не печатать ничего:

String directory = "D:\\Project\\Store_DB\\data1\\tdb" ; 
    Dataset dataset = TDBFactory.createDataset(directory) ; 

    String sparqlQueryString = "SELECT (count(*) AS ?count) { ?s ?p ?o }" ; 

    Query query = QueryFactory.create(sparqlQueryString) ; 
    QueryExecution qexec = QueryExecutionFactory.create(query, dataset) ; 
    ResultSet results = qexec.execSelect() ; 
    ResultSetFormatter.out(results) ; 

Что я делаю неправильно? Что-то не так с моим пониманием, что я упомянул выше?

ответ

3

Для части (i) вашего вопроса, да, ваше понимание верное.

Для части (ii) причина, по которой listNames не возвращает никаких результатов, заключается в том, что вы не поместили свои данные в названный граф. В частности,

Model tdb = dataset.getDefaultModel(); 

означает, что вы храните данные в графе СТР по умолчанию, то есть граф без имени. Если вы хотите listNames вернуть что-то, изменить эту линию:

Model tdb = dataset.getNamedGraph("graph42"); 

или что-то подобное. Разумеется, вам нужно будет обратиться к этому графу по имени при запросе данных.

Если ваша цель - просто проверить, успешно ли вы загрузили данные в хранилище, попробуйте инструменты командной строки bin/tdbdump (Linux) или bat\tdbdump.bat (Windows).

Для части (iii), я попробовал свой код в своей системе, указывая на один из моих изображений TDB, и он работает так, как и следовало ожидать. Итак: либо используемое вами изображение TDB не содержит никаких данных (тест с tdbdump), либо код, который вы фактически выполняли, отличается от приведенного выше примера.

2

Проблема в вашей части 1 код, я думаю, вы не совершаете данные.

Попробуйте эту версию вашей части 1 код:

String directory = "D:\\Project\\Store_DB\\data1\\tdb"; 
    Dataset dataset = TDBFactory.createDataset(directory); 

    Model tdb = dataset.getDefaultModel(); 

    // read the input file 
    String source = "D:\\Project\\Store_DB\\tmp\\trail_1.rdf"; 
    FileManager.get().readModel(tdb, source); 

    dataset.commit();//INCLUDE THIS STAMEMENT 

    tdb.close(); 
    dataset.close(); 

, а затем попытаться с кодом часть 3 :) ....