The graph is the highest level HAM object. It normally contains all of the information regarding a general topic. (Typically a hyperdocument will consist of a single graph.) A graph contains one or more contexts.
Contexts partition the data within a graph. Contexts can be used to support configurations, private workspaces, and version history trees. Each context has one parent context and zero or more child contexts. The idea of contexts was first introduced by Schwartz and Delisle [SD87]. When a graph is created, a root context begins the tree. A context which contains zero or more nodes and links does not depend on information contained in its parent context.
A node contains arbitrary data (text or other). A node in HAM can be classified as archived, nonarchived or append-only. When an archived node is updated, a new version is created using the new contents. Previous versions of an archived node can still be retrieved. When a nonarchived node is updated the previous contents are replaced by the new contents. When an append-only node is updated, the new contents are appended to the previous contents. Append-only nodes are most useful for logging.
A node's contents can be searched for the occurrence of user-specified regular expressions. The search mechanism allows all versions of a node to be searched. Note that this does not include information retrieval in a whole hyperdocument.
Nodes are related by links. A link defines a relationship between a source node and a destination node and can be followed in either direction. A cross-context link relates two nodes in different contexts and is useful for sharing data between two contexts. There are no anchors in HAM, and no link types, but these can be simulated using link attributes.
Attributes can be attached to contexts, nodes, or links. Attribute values can be strings, integers, floating-point numbers or user-defined types. Attribute/value pairs give semantics to HAM objects. They can represent application-specific properties of objects or contain information that further describes an object. Attributes are also used in the predicates that are part of the HAM filters.
The HAM provides an automatic version history mechanism. The version history for a HAM object is updated each time that object is modified. Because each access to an object contains a version time, previous versions of objects can be viewed. The HAM also provides operations to destroy undesired versions.
The HAM provides a filtering mechanism that allows subsets of HAM objects to be extracted from large graphs. Filters allow the user to specify visibility predicates, which are expressions relating attributes and their values. HAM filters only return objects that satisfy the predicates. Filters also allow the user to specify a version time so that earlier versions of a graph can be examined. The HAM filters the following items:
The HAM provides security for the data contained in a graph through an access control list (ACL) mechanism. Attaching an ACL to an object is optional. An ACL entry consists of a user or group name and a set of permissions. Possible permissions are access, annotate, update and destroy. Most permissions have an obvious meaning. The annotate permission is less obvious: it means that the user or group is allowed to attach links to a node (so it is like update, but for links instead of for nodes).