ngraph.graph
Graph data structure for
ngraph.*. Library implements API to modify graph structure and supports event-driven
notifications when graph changes.
Creating a graph
Create a graph with no edges and no nodes:
var createGraph = require('ngraph.graph');
var g = createGraph();
Growing a graph
The graph g
can be grown in two ways. You can add one node at a time:
g.addNode('hello');
g.addNode('world');
Now graph g
contains two nodes: hello
and world
. You can also use addLink()
method to grow a graph. Calling this method with nodes which are not present in
the graph creates them:
g.addLink('space', 'bar');
If nodes already present in the graph 'addLink()' makes them connected:
g.addLink('hello', 'world');
What to use as nodes and edges?
The most common and convenient choices are numbers and strings. You can
associate arbitrary data with node via optional second argument of addNode()
method:
g.addNode('world', 'custom data');
g.addNode('server', {
status: 'on',
ip: '127.0.0.1'
});
var server = g.getNode('server');
console.log(server.data);
You can also associate arbitrary object with a link using third optional
argument of addLink()
method:
g.addLink(1, 2, x);
Enumerating nodes and links
After you created a graph one of the most common things to do is to enumerate
its nodes/links to perform an operation.
g.forEachNode(function(node){
console.log(node.id, node.data);
});
The function takes callback which accepts current node. Node object may contain
internal information. node.id
and node.data
represent parameters passed to
the g.addNode(id, data)
method and they are guaranteed to be present in future
versions of the library.
To enumerate all links in the graph use forEachLink()
method:
g.forEachLink(function(link) {
console.dir(link);
});
To enumerate all links for a specific node use forEachLinkedNode()
method:
g.forEachLinkedNode('hello', function(linkedNode, link){
console.log("Connected node: ", linkedNode.id, linkedNode.data);
console.dir(link);
});
This method always enumerates both inbound and outbound links. If you want to
get only outbound links, pass third optional argument:
g.forEachLinkedNode('hello',
function(linkedNode, link) { },
true
);
To get a particular node object use getNode()
method. E.g.:
var world = g.getNode('world');
console.log(world.id, world.data);
To get a particular link object use getLink()
method:
var helloWorldLink = g.getLink('hello', 'world');
console.log(helloWorldLink);
To remove a node or a link from a graph use removeNode()
or removeLink()
correspondingly:
g.removeNode('space');
g.forEachLinkedNode('hello', function(linkedNode, link){
g.removeLink(link);
});
You can also remove all nodes and links by calling
g.clear();
Listening to Events
Whenever someone changes your graph you can listen to notifications:
g.on('changed', function(changes) {
console.dir(changes);
});
g.add(42);
Each change record holds information:
ChangeRecord = {
changeType: add|remove|update - describes type of this change
node: - only present when this record reflects a node change, represents actual node
link: - only present when this record reflects a link change, represents actual link
}
Sometimes it is desirable to react only on bulk changes. ngraph.graph supports
this via beginUpdate()
/endUpdate()
methods:
g.beginUpdate();
for(var i = 0; i < 100; ++i) {
g.addLink(i, i + 1);
}
g.endUpdate();
If you want to stop listen to events use off()
method:
g.off('changed', yourHandler);
For more information about events, please follow to ngraph.events
Install
With npm do:
npm install ngraph.graph
License
BSD 3-clause