This module defines the expansion of Prefix:Local
terms to full IRIs.
This library is typically not intended for the end-user. It may be
included into other RDF and XML libraries and relevant parts may be
re-exported.
- rdf_empty_prefix_cache(+Alias, +URI)[multifile]
- Multifile hook called if the binding Alias -> URI is modified. May
be used to update derived caches.
- rdf_current_prefix(:Alias, ?URI) is nondet
- Query predefined prefixes and prefixes defined with
rdf_register_prefix/2 and local prefixes defined with
rdf_prefix/2. If Alias is unbound and one URI is the prefix of
another, the longest is returned first. This allows turning a
resource into a prefix/local couple using the simple enumeration
below. See rdf_global_id/2.
rdf_current_prefix(Prefix, Expansion),
atom_concat(Expansion, Local, URI),
- rdf_prefix(:Alias, +URI) is det
- Register a local prefix. This declaration takes precedence
over globally defined prefixes using rdf_register_prefix/2,3.
Module local prefixes are notably required to deal with SWISH,
where users need to be able to have independent namespace
declarations.
- rdf_db:ns(?Alias, ?URI) is nondet[multifile]
- Dynamic and multifile predicate that maintains the registered
namespace aliases.
- deprecated
- - New code must modify the namespace table using
rdf_register_ns/3 and query using rdf_current_ns/2.
- rdf_register_prefix(+Prefix, +URI) is det
- rdf_register_prefix(+Prefix, +URI, +Options) is det
- Register Prefix as an abbreviation for URI. Options:
- force(Boolean)
- If
true
, replace existing namespace alias. Please note
that replacing a namespace is dangerous as namespaces
affect preprocessing. Make sure all code that depends on
a namespace is compiled after changing the registration.
- keep(Boolean)
- If
true
and Alias is already defined, keep the
original binding for Prefix and succeed silently.
Without options, an attempt to redefine an alias raises a
permission error.
Predefined prefixes are:
- register_global_prefix(+Alias, +URI, +Options)[private]
- Register a global prefix.
- rdf_unregister_prefix(+Alias) is det
- Delete a prefix global registration.
- rdf_current_ns(:Prefix, ?URI) is nondet
-
- deprecated
- - Use rdf_current_prefix/2.
- rdf_register_ns(:Prefix, ?URI) is det
- rdf_register_ns(:Prefix, ?URI, +Options) is det
- Register an RDF prefix.
- deprecated
- - Use rdf_register_prefix/2 or rdf_register_prefix/3.
- register_file_prefixes(+Map:list(pair)) is det
- Register a namespace as encounted in the namespace list of an
RDF document. We only register if both the abbreviation and URL
are not already known. Is there a better way? This code could
also do checks on the consistency of RDF and other well-known
namespaces.
- To be done
- - Better error handling
- rdf_global_id(?IRISpec, :IRI) is semidet
- Convert between Prefix:Local and full IRI (an atom). If IRISpec is
an atom, it is simply unified with IRI. This predicate fails
silently if IRI is an RDF literal.
Note that this predicate is a meta-predicate on its output argument.
This is necessary to get the module context while the first argument
may be of the form (:)/2. The above mode description is correct, but
should be interpreted as (?,?).
- Errors
- -
existence_error(rdf_prefix, Prefix)
- See also
- - rdf_equal/2 provides a compile time alternative
- - The rdf_meta/1 directive asks for compile time expansion
of arguments.
- bug
- - Error handling is incomplete. In its current implementation
the same code is used for compile-time expansion and to
facilitate runtime conversion and checking. These use cases
have different requirements.
- rdf_global_object(+Object, :GlobalObject) is semidet
- rdf_global_object(-Object, :GlobalObject) is semidet
- Same as rdf_global_id/2, but intended for dealing with the
object part of a triple, in particular the type for typed
literals. Note that the predicate is a meta-predicate on the
output argument. This is necessary to get the module context
while the first argument may be of the form (:)/2.
- Errors
- -
existence_error(rdf_prefix, Prefix)
- rdf_global_term(+TermIn, :GlobalTerm) is det
- Performs rdf_global_id/2 on predixed IRIs and rdf_global_object/2 on
RDF literals, by recursively analysing the term. Note that the
predicate is a meta-predicate on the output argument. This is
necessary to get the module context while the first argument may be
of the form (:)/2.
Terms of the form Prefix:Local
that appear in TermIn for which
Prefix is not defined are not replaced. Unlike rdf_global_id/2 and
rdf_global_object/2, no error is raised.
- rdf_global_graph(+TermIn, -GlobalTerm, +Module) is det[private]
- Preforms rdf_global_id/2 on rdf/4, etc graph arguments
- rdf_meta(+Heads)
- This directive defines the argument types of the named
predicates, which will force compile time namespace expansion
for these predicates. Heads is a coma-separated list of callable
terms. Defined argument properties are:
- :
-
Argument is a goal. The goal is processed using expand_goal/2,
recursively applying goal transformation on the argument.
- +
-
The argument is instantiated at entry. Nothing is changed.
- -
-
The argument is not instantiated at entry. Nothing is changed.
- ?
-
The argument is unbound or instantiated at entry. Nothing is
changed.
- @
-
The argument is not changed.
- r
-
The argument must be a resource. If it is a term
prefix:local it is translated.
- o
-
The argument is an object or resource. See
rdf_global_object/2.
- t
-
The argument is a term that must be translated. Expansion will
translate all occurences of prefix:local appearing
anywhere in the term. See rdf_global_term/2.
As it is subject to term_expansion/2, the rdf_meta/1 declaration
can only be used as a directive. The directive must be processed
before the definition of the predicates as well as before
compiling code that uses the rdf meta-predicates. The atom
rdf_meta
is declared as an operator exported from
library(semweb/rdf_db). Files using rdf_meta/1 must explicitely
load this library.
Beginning with SWI-Prolog 7.3.17, the low-level RDF interface
(rdf/3, rdf_assert/3, etc.) perform runtime expansion of
Prefix:Local
terms. This eliminates the need for rdf_meta/1
for simple cases. However, runtime expansion comes at a
significant overhead and having two representations for IRIs (a
plain atom and a term Prefix:Local
) implies that simple
operations such as comparison of IRIs no longer map to native
Prolog operations such as IRI1 == IRI2
.
- rdf_meta_specification(+General, +Module, -Spec) is semidet[private]
- True when Spec is the RDF meta specification for Module:General.
- Arguments:
-
General | - is the term Spec with all arguments replaced with
variables. |
- mk_global(+Src, -Resource, +Module)[private]
- Realised
rdf_global_id(+, -)
, but adds compiletime checking,
notably to see whether a namespace is not yet defined.
Re-exported predicates
The following predicates are exported from this file while their implementation is defined in imported modules or non-module files loaded by this module.
- rdf_register_prefix(+Prefix, +URI) is det
- rdf_register_prefix(+Prefix, +URI, +Options) is det
- Register Prefix as an abbreviation for URI. Options:
- force(Boolean)
- If
true
, replace existing namespace alias. Please note
that replacing a namespace is dangerous as namespaces
affect preprocessing. Make sure all code that depends on
a namespace is compiled after changing the registration.
- keep(Boolean)
- If
true
and Alias is already defined, keep the
original binding for Prefix and succeed silently.
Without options, an attempt to redefine an alias raises a
permission error.
Predefined prefixes are:
- rdf_register_ns(:Prefix, ?URI) is det
- rdf_register_ns(:Prefix, ?URI, +Options) is det
- Register an RDF prefix.
- deprecated
- - Use rdf_register_prefix/2 or rdf_register_prefix/3.