Provided by: libtm-perl_1.56-10_all bug

NAME

       TM::IndexAble - Topic Maps, Trait to provide lazy and eager indices

SYNOPSIS

             my $tm = new TM...                           # get any map
             use Class::Trait;
             Class::Trait->apply ($tm, "TM::IndexAble");  # apply the trait

             # add a lazy cache for subclassing and instanceOf
             $tm->index ({ axis => 'taxo' });
             $tm->index ({ axis => 'taxo', closed => 0}); # the same, lazy is NOT closed

             # add eager cache (= index) for taxonometrics
             $tm->index ({ axis => 'taxo', closed => 1}); # eager is closed, will take some time

             # add index for characteristics
             $tm->index ({ axis => 'char'});
             $tm->index ({ axis => 'char', closed => 1}); # can be closed as well

             # ditto for reification
             $tm->index ({ axis => 'reify'});
             $tm->index ({ axis => 'reify', closed => 1});

             # create index/caches, but separate from map itself
             $tm->index ({ axis => 'reify', closed => 0, detached => {} });

             my %stats = $tm->index;                      # get current indices + statistics

DESCRIPTION

       Like TM::Index, this package also adds index/caching capabilities to any topic map stored via TM (or any
       of its subclasses). The difference, though, is that the index/caching functionality is added as a trait,
       and not via an explicit attachment. The indices are - by default - part of the map, and not standalone
       objects as with TM::Index.

       When you add an index/cache then you simply use precomputed navigation results for the TM methods
       "match_forall" and "is_reified" (but not used for "reifies").

       As with TM::Index you can create caching (lazy indexing) and full indices (eager precaching).

   Map Attachment
       To enrich a map with an index/cache, you call the method "index" provided here. The index/cache will by
       default be stored inside the map. That may be convenient in most cases.

       If not - as with some storage techniques - you can detach the index to live within your scope. For that
       purpose you simply pass in an empty hash reference. It is then your responsibility to get rid of it
       afterwards.

       Having the index detached also opens the way for you to make the index persistent.

INTERFACE

   Methods
       Following methods are mixed into the class/object:

       index
           $tm->index ({ %spec }, ...)

           This  method  establishes  one or more indices/caches to the topic map. Each cache/index is described
           with its own hash reference.

           Which navigation axes should be covered by a single cache/index is specified with the  "axis"  field.
           It can have as value one of the axes in TM::Axes, or one of the following values:

           "taxo"
               Shortcut for the axes: "subclass.type" "superclass.type" "class.type" "instance.type"

           "char"
               Shortcut for the axes: "char.topic" "char.value" "char.type" "char.type.value" "char.topic.type"

           "reify"

           To  control whether a cache (lazy indexing) or a full index (eager caching) should be used, the field
           "closed" can have two values (default is 0):

           0:  The default is to keep the index lazy. In this mode the index is empty at the start and  it  will
               learn  more  and  more  on its own. In this sense, the index lives under an open world assumption
               (hence the name), as the absence of information does not mean that there is no result.

           1:  A closed world index has to be populated to be useful. If a query is launched and the  result  is
               stored  in  the index, then it will be used, like for an open index. If no result in the index is
               found for a query, the empty result will be assumed.

           Additionally, a field "detached" can be passed in  for  one  cache/index.  It  MUST  contain  a  hash
           reference.

           Example:

              $tm->index (
                      { axis => 'reify', closed => 0, detached => {} },
                      { axis => 'char',  closed => 1 }
              );

           The method returns a hash with some statistical information for every axis:

           "requests"
               Number of requests since inception of the index.

           "hits"
               Number  of  cache hits since inception. For an eager cache (i.e. index) this number should be the
               same as "requests"

       deindex
           $tm->deindex ($axis, ....)

           $tm->deindex ($index, ....)

           This method gets rid of certain indices/caches, as specified by their axes.

           Since v1.55: You can also pass in the hash reference of the index (in the detached case).

           Since v1.55: Also the expansion of axes (like for "index") works now.

SEE ALSO

       TM, TM::Index

COPYRIGHT AND LICENSE

       Copyright 20(10) by Robert Barta, <drrho@cpan.org>

       This library is free software; you can redistribute it and/or modify it under  the  same  terms  as  Perl
       itself.

perl v5.28.1                                       2019-09-07                                 TM::IndexAble(3pm)