Как использовать Jena TDB для хранения локальной версии базы данных Linked Movie

У меня есть локальная версия LinkedMDB в формате N-Triples, и я хочу запросить ее. Теперь я хочу использовать Jena TDB, которая может хранить данные, которые можно использовать для запросов позже. Я проверил документацию для TDB Java API, но не смог загрузить N- Файл Triples, а затем запрос с помощью SPARQL. Я использовал следующий код:

String directory = "E:\\Applications\\tdb-0.8.9\\TDB-0.8.9\\bin\\tdb";
        Dataset dataset = TDBFactory.createDataset(directory);

        // assume we want the default model, or we could get a named model here
        Model tdb = dataset.getDefaultModel();

        // read the input file - only needs to be done once
        String source = "E:\\Applications\\linkedmdb-18-05-2009-dump.nt";
        FileManager.get().readModel( tdb, source, "N-TRIPLES" );

и получил следующее исключение

Exception in thread "main" com.hp.hpl.jena.tdb.base.file.FileException: Not a directory: E:\Applications\tdb-0.8.9\TDB-0.8.9\bin\tdb
    at com.hp.hpl.jena.tdb.base.file.Location.<init>(Location.java:83)
    at com.hp.hpl.jena.tdb.TDBFactory.createDataset(TDBFactory.java:79)
    at tutorial.Temp.main(Temp.java:14)

person ProgramME    schedule 11.04.2011    source источник
comment
Если каталог E:\Applications\tdb-0.8.9\TDB-0.8.9\bin\tdb еще не существует, вам придется сначала его создать. Но вам, вероятно, следует хранить данные в каталоге, отличном от того, в котором вы установили TDB (т.е. что-то конкретное для вашего приложения). Подумайте, например, что произойдет, когда вы загрузите будущую версию TDB.   -  person Ian Dickinson    schedule 13.04.2011


Ответы (3)


Чтение Model, поддерживаемого TDB, из Java очень просто, подробности см. в вики TDB. Например, вы можете:

// open TDB dataset
String directory = "./tdb";
Dataset dataset = TDBFactory.createDataset(directory);

// assume we want the default model, or we could get a named model here
Model tdb = dataset.getDefaultModel();

// read the input file - only needs to be done once
String source = "path/to/input.nt";
FileManager.get().readModel( tdb, source, "N-TRIPLES" );

// run a query
String q = "select * where {?s ?p ?o} limit 10";
Query query = QueryFactory.create(q);
QueryExecution qexec = QueryExecutionFactory.create(query, tdb);
ResultSet results = qexec.execSelect();
... etc ...

Как упомянул пользователь 205512, вы можете использовать tdbloader2 из командной строки на Linux или Mac, что будет быстрее для больших файлов RDF. После создания индексов TDB вы можете копировать файлы на другие машины. Таким образом, вы можете загрузить данные на сервер Linux, а затем отправить все файлы из каталога tdb на свой компьютер с Windows для продолжения разработки.

Чтобы запустить tdbloader из командной строки на вашем компьютере с Windows, вам понадобится что-то вроде cygwin, чтобы вы могли запускать Unix- скрипты стилей. Вам также необходимо установить переменную среды TDBROOT.

person Ian Dickinson    schedule 11.04.2011
comment
Итак, во-первых, мне нужно использовать tdbloader2 для загрузки файла, а затем использовать предоставленный вами код для его запроса. - person ProgramME; 13.04.2011
comment
Использование tdbloader/tdbloader2 является альтернативой шагу чтения входного файла в приведенном выше примере кода. Вы можете сделать это в любом случае; вам не нужно делать и то, и другое. - person Ian Dickinson; 13.04.2011
comment
Исключение в потоке main java.lang.OutOfMemoryError: пространство кучи Java в java.nio.HeapByteBuffer.‹init›(неизвестный источник) в java.nio.ByteBuffer.allocate(неизвестный источник) я получил следующее исключение: - person ProgramME; 13.04.2011
comment
Вам нужно либо начать новый вопрос для этой новой темы, либо, и я полагаю, что это будет лучше, отправить электронное письмо в список пользователей Jena (см. incubator.apache.org/jena/contributing.html для получения информации о том, как подписаться). В любом случае вам придется показать свой код: иначе это исключение невозможно диагностировать (приблизительная причина ясна: у вас заканчивается место в куче, но основная причина — почему вы при нехватке места в куче требуется дополнительная информация для диагностики). - person Ian Dickinson; 13.04.2011
comment
Я думаю, это потому, что размер файла inkedmdb-18-05-2009-dump.nt составляет 450 МБ. - person ProgramME; 13.04.2011
comment
Если вы читаете непосредственно в TDB, не имеет значения, насколько велик исходный файл. Но не видя кода, я не могу сказать наверняка. Однако рекомендация остается в силе: пожалуйста, начните новый вопрос или опубликуйте свой код в списке пользователей Jena. - person Ian Dickinson; 14.04.2011

Для этого вам не нужен код Java (tdbloader2 быстрее):

bin/tdbloader2 --loc /path/to/tdb/store imdb.nt

будет загружаться в n-тройном файле. Вы можете запросить его, используя:

bin/tdbquery --loc /path/to/tdb/store "select ...."

Подробнее об инструментах командной строки tdb здесь.

person user205512    schedule 11.04.2011
comment
Я создаю приложение, которое запрашивает файл nt. Есть ли какой-либо код Java для реализации этого. Я не могу все время делать это из командной строки. - person ProgramME; 11.04.2011
comment
когда я попробовал tdbloader, я получил: «tdbloader» не распознается как внутренняя или внешняя команда, исполняемая программа или пакетный файл. - person ProgramME; 11.04.2011

Предполагая, что «формат nt» действительно «N-Triple», тогда Jena Model.read(is, base, lang) загрузит формат N-Triple, если lang равно "N-Triple".

Дополнительные сведения см. в учебном документе Jena.

person Stephen C    schedule 11.04.2011
comment
я знаю это, но проблема в том, что размер файла составляет 850 МБ, что вызывает исключение переполнения кучи. Поэтому я хотел сохранить данные файла в tdb - person ProgramME; 11.04.2011