Преобразование из RDF "типизированного литерала" в атом Пролога в SWI Пролог - PullRequest
1 голос
/ 12 апреля 2020

«SWI-Prolog Semanti c Web Library 3.0» позволяет легко утверждать и запрашивать RDF-тройку следующим образом:

- rdf_assert(number, is, 1).
true.

?- rdf(number, is, X).
X = 1^^'http://www.w3.org/2001/XMLSchema#integer'.

Как можно преобразовать X из «литерала, квалифицированного типом» формат (описан здесь ) для стандартного атома Пролога: X = 1?

Я нашел xsdp_convert / 3 , но для него требуется тип ('http://www.w3.org/2001/XMLSchema#integer') и значение (1) передается как отдельные аргументы. Как мне разобрать «литерал, определенный по типу» (1^^'http://www.w3.org/2001/XMLSchema#integer'), чтобы сделать это?

Или еще лучше: действительно ли этот формат value^^type что-то означает в Прологе и позволяет более элегантный способ сделать это?

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

Я думаю, что мы можем (должны?) Использовать стандартные префиксы с помощью предоставленных интерфейсов вместо их жесткого кодирования. Итак ...

?- rdf(S,P,O^^xsd:integer).
S = number,
P =  (is),
O = 1.

?- rdf(S,P,O),rdf_equal(O,N^^xsd:integer).
S = number,
P =  (is),
O = 1^^'http://www.w3.org/2001/XMLSchema#integer',
N = 1.

SWI-Prolog стремится к эффективности, и мы должны использовать предоставленные интерфейсы, потому что rdf_prefixes получают специальную обработку от термина переписать инфраструктуру, то есть литералы обрабатываются при компиляции / загрузке исходных файлов.

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

1 голос
/ 12 апреля 2020

Вы можете использовать объединение, разложить составной термин, который вы получаете, или получить доступ к его аргументам:

?- use_module(library(semweb/rdf11)).
true.

?- rdf_assert(number, is, 1).
true.

?- rdf(number, is, N^^URI).
N = 1,
URI = 'http://www.w3.org/2001/XMLSchema#integer'.

?- rdf(number, is, X), X =.. List.
X = 1^^'http://www.w3.org/2001/XMLSchema#integer',
List = [^^, 1, 'http://www.w3.org/2001/XMLSchema#integer'].

?- rdf(number, is, X), arg(1, X, N).
X = 1^^'http://www.w3.org/2001/XMLSchema#integer',
N = 1.
...