Запрос именованных 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?

С уважением

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

Проблема здесь в том, что вы поместили относительное имя 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 () не требуется, если вы используете транзакции

Другие вопросы по тегам