Query: Context Directive
A context directive calculates the context of a list of zettel identifier. It starts with the keyword CONTEXT.
Optionally you may specify some context details, after the keyword CONTEXT, separated by space characters. These are:
- FULL: additionally search for zettel with the same tags,
- BACKWARD: search for context only though backward links,
- FORWARD: search for context only through forward links,
- DIRECTED: search for context only in the same direction as the one that led to the current zettel. If the zettel is one of the initial zettel, search in both directions.
- COST: one or more space characters, and a positive integer: set the maximum cost (default: 17),
- MAX: one or more space characters, and a positive integer: set the maximum number of context zettel (default: 200).
- MIN: one or more space characters, and a positive integer: set the minimum number of context zettel (default: 0). Takes precedence over COST and MAX.
If neither BACKWARD nor FORWARD is specified, the search for context zettel will follow both backward and forward links.
If both BACKWARD and FORWARD are specified, the search for context zettel will be performed as DIRECTED. Internally, DIRECTED is just a shorthand for specifying both BACKWARD and FORWARD.
If any of the three direction specifiers BACKWARD, FORWARD, and DIRECTED is specified more than once, parsing of the thread directive is stopped. All following text is then interpreted either as other directives or as a search term.
The cost of a context zettel is calculated iteratively:
- Each of the specified zettel has a cost of 1.0.
- Every zettel directly referenced by a specified zettel has a maximum cost of 4.0.
- A zettel found as a single folge zettel or single precursor zettel inherits the cost of the originating zettel, plus 0.2.
- A zettel found as a single sequel zettel or single prequel zettel inherits the cost of the originating zettel, plus 1.0.
- A zettel discovered via another type of link, without being part of a set of zettel identifiers, inherits the cost of the originating zettel, plus 2.0.
- A zettel that is part of a set of zettel identifiers, inherits the cost of the originating zettel, plus one of the four costs above, multiplied by a value that grows roughly in a linear-logarithmic fashion based on the size of the set.
- A zettel sharing the same tag inherits the cost of the originating zettel, plus a linear-logarithmic value based on the number of zettel sharing that tag. If a zettel shares more than one tag with the originating zettel, a 90% discount is applied per additional tag. This rules applies only if the FULL directive has been specified.
The maximum cost is only checked for all zettel that are not directly reachable from the initial, specified list of zettel. This ensures that initial zettel that have only a highly used tag, will also produce some context zettel.
Despite its possibly complicated structure, this algorithm ensures in practice that the zettel context is a list of zettel, where the first elements are “near” to the specified zettel and the last elements are more “distant” to the specified zettel. It also penalties zettel that acts as a “hub” to other zettel, to make it more likely that only relevant zettel appear on the context list.
This directive may be specified only once as a query directive. A second occurence of CONTEXT is interpreted as a search expression. In most cases it is easier to adjust the maximum cost than to perform another context search, which is relatively expensive in terms of retrieving effort.