Запрос именованных RDF-графов в TDB с помощью tdbquery

Я пытаюсь запросить мою недавно созданную базу данных TDB с помощью программы tdbquery. Однако мне трудно написать запрос, нацеленный на правильный именованный граф. Я делаю следующее:

Сначала создайте новый набор данных и добавьте граф имени под названием «факты».

Dataset dataset = TDBFactory.createDataset("/tdb/");
dataset.begin(ReadWrite.WRITE) ;

try {
    Model facts = RDFDataMgr.loadModel("lineitem.ttl") ;
    dataset.addNamedModel("facts", facts);
    dataset.commit();
    TDB.sync(dataset);
    dataset.end();

} finally {
    dataset.close();
}

Когда я запрашиваю все графики в своей базе данных TDB, все выглядит нормально.

./tdbquery --loc /tdb/ "SELECT * { GRAPH ?g { ?s ?p ?o } }"

--------------------------------------------------
| s         | p           | o          | g       |
==================================================
| <fact1>   | <predicate> | <nation>   | <facts> |
| <fact2>   | <predicate> | <region>   | <facts> |
--------------------------------------------------

Если я попытаюсь запросить именованный граф, я не найду и утраю.

./tdbquery -v --loc /tdb/ "SELECT * { GRAPH <facts> { ?s ?p ?o } }"
OR
./tdbquery -v --loc /tdb/ "SELECT * FROM NAMED <facts> WHERE { ?s ?p ?o }"

-------------
| s | p | o |
=============
-------------

Когда я смотрю на алгебраическую версию запроса, я вижу, что контекст (график) в моем квадроцикле неверен.

INFO  exec                 :: ALGEBRA
(quadpattern (quad <file:///usr/local/apache-jena-2.12.1/bin/facts> ?s ?p ?o))

Я знаю, что четверной шаблон должен быть: (quad ?s ?p ?o)

Как запросить именованный граф в базе данных TDB?

С уважением


person Kim Ahlstrøm Meyn Mathiassen    schedule 05.08.2015    source источник


Ответы (2)


Когда я смотрю на алгебраическую версию запроса, я вижу, что контекст (график) в моем квадроцикле неверен.

INFO  exec                 :: ALGEBRA
(quadpattern (quad <file:///usr/local/apache-jena-2.12.1/bin/facts> ?s ?p ?o))

Я знаю, что четверной рисунок должен быть: (quad ?s ?p ?o)

Нет, это правильно (если не то, что вы ожидаете)

quadpattern выполняет поиск по квадрациклам и, таким образом, включает 4 поля, первое из которых является именем графа для поиска.

И вот в чем заключается ваша проблема: имена графов - это URI, но вы указали только facts как имя, которое рассматривается как относительный URI и, как таковое, подлежит разрешению, которое может различаться в разных частях системы.

В вашем примере синтаксический анализатор запросов использует рабочий каталог в качестве базового URI, что приводит к странному имени графа, которое вы видите в плане алгебры.

Вы можете увидеть, какие именно имена графиков находятся в хранилище TDB, выполнив следующий запрос:

SELECT ?g WHERE { GRAPH ?g { } }

Если вы получите абсолютный URI, вы можете указать это непосредственно в своем исходном запросе, если вы этого не сделаете, то нет возможности запросить его из командной строки.

Исправление вашей проблемы

Не используйте относительные URI везде, где это возможно. Если вы хотите их использовать, не используйте их без явного указания базового URI.

Поэтому в вашем коде, где вы загружаете данные, убедитесь, что вы указали абсолютный URI для графика, например.

dataset.addNamedModel("http://example.org/facts", facts);

И если вы хотите иметь возможность использовать относительные URI для ссылки на ваш график в своих запросах, используйте соответствующее объявление BASE, чтобы URI разрешался так, как вы этого хотите, например.

./tdbquery -v --loc /tdb/ "BASE <http://example.org/> SELECT * { GRAPH <facts> { ?s ?p ?o } }"
person RobV    schedule 05.08.2015
comment
Спасибо за подробное объяснение. - person Kim Ahlstrøm Meyn Mathiassen; 06.08.2015

Проблема здесь в том, что вы поместили в данные относительное имя графа URI. RDF предназначен для работы с абсолютными URI (т.е. начинается с «http:» или другого имени схемы URI).

Пытаться

RDFDataMgr.write(System.out, dataset, Lang.NQUADS)

чтобы более четко видеть, что находится в наборе данных. Вывод tdbquery может вызывать сокращение URI, поэтому некоторые из ваших данных имеют абсолютные URI и некоторые относительные, но в текстовом формате они выглядят одинаково.

Когда «SELECT * {GRAPH { ?s ?p ?o } }» анализируется, как если бы вы читали данные из файла, относительные URI разрешались — базовый URI — это место, где выполняется код, поэтому вы получаете file:///usr/local/apache-jena-2.12.1/bin/facts

Попробуйте dataset.addNamedModel("http://example/facts", facts);

PS 1

Model m = dataset.getNamedModel("http://example/facts") ;
m.read("lineitem.ttl") ;

PS 2 sync() не требуется, если вы используете транзакции

person AndyS    schedule 05.08.2015
comment
Спасибо за ответ. Я решил принять ответ RobV, потому что он более сложный. Спасибо за другие подсказки :) - person Kim Ahlstrøm Meyn Mathiassen; 06.08.2015