| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267 | /* * EliasDB * * Copyright 2016 Matthias Ladkau. All rights reserved. * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. *//*Package graph contains the main API to the graph datastore.Manager APIThe main API is provided by a Manager object which can be created with theNewGraphManager() constructor function. The manager CRUD functionality fornodes and edges through store, fetch and remove functions. It also providesthe basic traversal functionality which allos the traversal from one node toother nodes.Node iteratorAll available node keys in a partition of a given kind can be iterated by usinga NodeKeyIterator. The manager can produce these with the NodeKeyIterator()function.Fulltext searchAll nodes and edges in the datastore are indexed. The index can be queriedusing a IndexQuery object. The manager can produce these with the NodeIndexQuery()or EdgeIndexQuery function.TransactionsA transaction is used to build up multiple store and delete tasks for thegraph database. Nothing is written to the database before calling commit().A transaction commit does an automatic rollback if an error occurs(except fatal disk write errors which might cause a panic).A trans object can be created with the NewGraphTrans() function.Rules(Use with caution)Graph rules provide automatic operations which help to keep the graph consistent.Rules trigger on global graph events. The rules SystemRuleDeleteNodeEdges andSystemRuleUpdateNodeStats are automatically loaded when a new Manager is created.See the code for further details.Graph databasesA graph manager handles the graph storage and provides the API forthe graph database. The storage is divided into several databases:Main databaseMainDB stores various meta information such as known node/edge kinds, attributesor version information.Names databaseNames can be encoded (into a number) or decoded (into a string)	32 bit values for any given node attribute names	16 bit values for any given edge role names	16 bit values for any given edge kind namesNodes databaseEach node kind database stores:	PrefixNSAttrs + node key -> [ ATTRS ]	(a list of attributes of a certain node)	PrefixNSAttr + node key + attr num -> value	(attribute value of a certain node)	PrefixNSSpecs + node key -> map[spec]<empty string>	(a lookup for available specs for a certain node)	PrefixNSEdge + node key + spec -> map[edge key]edgeinfo{other node key, other node kind}]	(connection from one node to another via a spec)Edges databaseEach edge kind database stores:	PrefixNSAttrs + edge key -> [ ATTRS ]	(a list of attributes of a certain edge)	PrefixNSAttr + edge key + attr num -> value	(attribute value of a certain edge)Index databaseThe text index managed by util/indexmanager.go. IndexQuery provides access tothe full text search index.*/package graph/*VERSION of the GraphManager*/const VERSION = 1/*MainDBEntryPrefix is the prefix for entries stored in the main database*/const MainDBEntryPrefix = string(0x2)// MainDB entries// ==============/*MainDBVersion is the MainDB entry key for version information*/const MainDBVersion = MainDBEntryPrefix + "ver"/*MainDBNodeKinds is the MainDB entry key for node kind information*/const MainDBNodeKinds = MainDBEntryPrefix + "nodekind"/*MainDBEdgeKinds is the MainDB entry key for edge kind information*/const MainDBEdgeKinds = MainDBEntryPrefix + "edgekind"/*MainDBParts is the MainDB entry key for partition information*/const MainDBParts = MainDBEntryPrefix + "part"/*MainDBNodeAttrs is the MainDB entry key for a list of node attributes*/const MainDBNodeAttrs = MainDBEntryPrefix + "natt"/*MainDBNodeEdges is the MainDB entry key for a list of node relationships*/const MainDBNodeEdges = MainDBEntryPrefix + "nrel"/*MainDBNodeCount is the MainDB entry key for a node count*/const MainDBNodeCount = MainDBEntryPrefix + "ncnt"/*MainDBEdgeAttrs is the MainDB entry key for a list of edge attributes*/const MainDBEdgeAttrs = MainDBEntryPrefix + "eatt"/*MainDBEdgeCount is the MainDB entry key for an edge count*/const MainDBEdgeCount = MainDBEntryPrefix + "ecnt"// Root IDs for StorageManagers// ============================/*RootIDNodeHTree is the root ID for the HTree holding primary information*/const RootIDNodeHTree = 2/*RootIDNodeHTreeSecond is the root ID for the HTree holding secondary information*/const RootIDNodeHTreeSecond = 3// Suffixes for StorageManagers// ============================/*StorageSuffixNodes is the suffix for a node storage*/const StorageSuffixNodes = ".nodes"/*StorageSuffixNodesIndex is the suffix for a node index*/const StorageSuffixNodesIndex = ".nodeidx"/*StorageSuffixEdges is the suffix for an edge storage*/const StorageSuffixEdges = ".edges"/*StorageSuffixEdgesIndex is the suffix for an edge index*/const StorageSuffixEdgesIndex = ".edgeidx"// PREFIXES for Node storage// =========================// Prefixes are only one byte. They should be followed by the node key so// similar entries are stored near each other physically.///*PrefixNSAttrs is the prefix for storing attributes of a node*/const PrefixNSAttrs = string(0x01)/*PrefixNSAttr is the prefix for storing the value of a node attribute*/const PrefixNSAttr = string(0x02)/*PrefixNSSpecs is the prefix for storing specs of edges related to a node*/const PrefixNSSpecs = string(0x03)/*PrefixNSEdge is the prefix for storing a link from a node (and a spec) to an edge*/const PrefixNSEdge = string(0x04)// Graph events//=============/*EventNodeCreated is thrown when a node gets created.Parameters: partition of created node, created node*/const EventNodeCreated = 0x01/*EventNodeUpdated is thrown when a node gets updated.Parameters: partition of updated node, updated node, old node*/const EventNodeUpdated = 0x02/*EventNodeDeleted is thrown when a node gets deleted.Parameters: partition of deleted node, deleted node*/const EventNodeDeleted = 0x03/*EventEdgeCreated is thrown when an edge gets created.Parameters: partition of created edge, created edge*/const EventEdgeCreated = 0x04/*EventEdgeUpdated is thrown when an edge gets updated.Parameters: partition of updated edge, updated edge, old edge*/const EventEdgeUpdated = 0x05/*EventEdgeDeleted is thrown when an edge gets deleted.Parameters: partition of deleted edge, deleted edge*/const EventEdgeDeleted = 0x06
 |