Architecture

Theoretical model

The filter implementation that we have used is based on a theoretical model that is independent of the aspect idea.

In this model, a "filter" consists of a number of "filter nodes" connected in a hierarchy. Each node takes a number of "packets" as input and gives as output only those packets which were accepted by that node. We call this "passing" the node. The packets themselves are in no way affected by the filter.

A node is usually not a complete filter even if this can be the case. Instead, a node can point to additional nodes which the packets must pass. Let us call these nodes which are pointed to by a node A for "direct refinements" of A, as they refine the filtration. If a filter node B is reachable from A through several steps of direct refinements, we call B an "indirect refinement" of A. If B is a direct refinement or an indirect refinement of A, we call B simply a "refinement" of A.

Hence, a filter consists of a top filter node with an hierachy of refinements. A packet is said to "pass" a filter F if it passes the top filter node, A, and also passes one of the filters represented by the direct refinements of A.

Another way of expressing this is to say that a filter is a directed graph of filter nodes, and that a packet passes the filter if it manages to pass all nodes in at least one path from the top filter node to a leaf.

The recursive definition of filter poses serious problems, and there is need for a limitation on filters to avoid them. The problem is that the definition does not force an acyclic strucure, but rather allows a general graph strucure. A typical problem arises when two filter nodes are refinements of each other, in which case there is an obvious risk for infinite loops. Filters without loops are called "sound" filters. Ensuring that a filter is sound is, unfortunately, a very demanding task, so most implementations will probably just use a maximum recursion depth or similarly limit the filters.

The filtering done in a node can be as domain-specific as possible. One general type of filtering that is always possible is to let one node filter the packets with the help of a "sub-filter". In this case, passing the node (say A) would be equivalent to passing the whole sub-filter[1].

Please note that a filter also can be used to sort packets. All that is needed is to attach a separate output box to each leaf of the filter. This is what will be used when implementing aspect sorting, as described in Chapter 16, The Content Displayer.

Neuron Binding

We now turn to representing filters with the aid of neurons. In our implementation, an "aspect" is simply the result of a filtering process. This way, the "historical" aspect of a concept is defined by filtering out the content dealing with the history of the concept, something that can be done by a simple meta-data filter or by much more complicated filters, depending on the available markup and the complexity of the aspect. The current implementation presupposes that the packages are any type of components.

Filter nodes are implemented as filter neurons. A filter is thus represented by its top level filter neuron. A filter neuron contains:

Hence, the filter neurons filter in two ways simultaneously: using data tags that filter meta-data and with sub-filters pointed to by axons. The sub-filter idea is not yet implemented.

Notes

[1]

This is equivalent to connecting all leaf nodes in the sub-filter with all direct refinements of A (and thus represents a significant simplification), except from the fact that the sub-filter additionaly becomes reusable.