Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/keithwhor/UnitGraph
Lightweight Graph Library for Node 4.x
https://github.com/keithwhor/UnitGraph
Last synced: about 1 month ago
JSON representation
Lightweight Graph Library for Node 4.x
- Host: GitHub
- URL: https://github.com/keithwhor/UnitGraph
- Owner: keithwhor
- Created: 2015-06-17T21:30:10.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2017-05-03T16:32:07.000Z (over 7 years ago)
- Last Synced: 2024-08-08T17:42:44.848Z (4 months ago)
- Language: JavaScript
- Homepage:
- Size: 152 KB
- Stars: 261
- Watchers: 9
- Forks: 30
- Open Issues: 7
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
- awesome-starred - keithwhor/UnitGraph - Lightweight Graph Library for Node 4.x (others)
README
# UnitGraph
[![Build Status](https://travis-ci.org/keithwhor/UnitGraph.svg?branch=master)](https://travis-ci.org/keithwhor/UnitGraph)
UnitGraph is a simple Graph traversal library for io.js. It is intended for
quick, synchronous in-memory traversals including route tracing and finding
closest nodes to a target.## Installation
UnitGraph is available via npm. Simply run `npm install ug` and then:
```javascript
let ug = require('ug');
```To use the package. :)
## Examples
### Find all nodes of type 'person' with name matching 'ae'
```javascript
let ug = require('ug');
let graph = new ug.Graph();graph.createNode('person', {name: 'Rachael'});
graph.createNode('person', {name: 'Stephanie'});
graph.createNode('person', {name: 'Michael'});
graph.createNode('person', {name: 'Donovan'});graph.nodes('person').query().filter({name__ilike: 'ae'}).units();
// [ Node (person {name: Rachael}), Node (person {name: Michael}) ]
```### Find the shortest path between two nodes
```javascript
let ug = require('ug');
let graph = new ug.Graph();let civilian = graph.createNode('person', {name: 'Clark Kent'});
let superman = graph.createNode('superhero', {name: 'Superman'});
graph.createEdge('wears_glasses').link(superman, civilian);graph.trace(
graph.nodes('person').query().filter({name: 'Clark Kent'}).first(),
graph.nodes('superhero').query().filter({name: 'Superman'}).first()
);
// Path: Node (person {name: "Clark Kent"}) << Edge (wears_glasses {}) << Node (superhero {name: 'Superman'})
```### Find all closest nodes, ordered by distance, of a certain type
```javascript
let ug = require('ug');
let graph = new ug.Graph();let classification = graph.createNode('classification', {name: 'Sharing Economy'});
let corps = {
uber: graph.createNode('corporation', {name: 'Uber'}),
storefront: graph.createNode('corporation', {name: 'Storefront'}),
airbnb: graph.createNode('corporation', {name: 'AirBnB'})
};let industries = {
vc: graph.createNode('industry', {name: 'Venture Capital'}),
hospitality: graph.createNode('industry', {name: 'Hospitality'}),
taxi: graph.createNode('industry', {name: 'Taxi'})
};graph.createEdge('business_model').link(corps.uber, classification);
graph.createEdge('business_model').link(corps.airbnb, classification);
graph.createEdge('business_model').link(corps.storefront, classification);
graph.createEdge('emotion', {type: 'happy'}).link(industries.vc, classification);
graph.createEdge('emotion', {type: 'sad'}).link(industries.hospitality, classification);
graph.createEdge('emotion', {type: 'sad'}).link(industries.taxi, classification);graph.closest(
graph.nodes('classification').query().first(), // grab Sharing Economy node
{
compare: function(node) {
// forget industries and uber!
return node.entity !== 'industry' && node.get('name') !== 'Uber';
},
direction: -1 // only track nodes that feed in to this one
}
);// returns two paths, one from Sharing Economy << (business_model) << AirBnB
// and Sharing Economy << business_model << Storefront,
// ordered by their distance
```## Documentation
### Graph
```javascript```
Graph()
```Constructor. Part of the `ug` namespace. Use with `new` keyword, i.e.
```javascript
let Graph = require('ug').Graph;
let graph = new Graph();
```#### Graph#unit
```
unit( [Number] uniqid )
returns [Unit] ([Node] or [Edge])
```Grabs a unit (node or edge) by their unique id (automatically assigned by
their parent Graph object).#### Graph#nodeCount
```
nodeCount()
returns [Number]
```Returns the total number of nodes that belong to the graph.
#### Graph#edgeCount
```
edgeCount()
returns [Number]
```Returns the total number of edges that belong to the graph.
#### Graph#createNode
```
createNode( [String] entity, [Object] properties )
returns [Node]
```Creates a node belonging to the parent graph, with entity type `entity` and
calls `Unit#load` to attach `properties` to the node.Automatically creates a `NodeCollection` of type `entity` belonging to the
parent graph if one does not yet exist.#### Graph#createEdge
```
createEdge( [String] entity, [Object] properties )
returns [Edge]
```Creates an edge belonging to the parent graph, with entity type `entity` and
calls `Unit#load` to attach `properties` to the edge.Automatically creates an `EdgeCollection` of type `entity` belonging to the
parent graph if one does not yet exist.#### Graph#nodes
```
nodes( [String] entity )
returns [NodeCollection]
```Returns the parent graph's `NodeCollection` object of the specified `entity`.
Invoking this method will create a `NodeCollection` if one does not yet exist.#### Graph#edges
```
edges( [String] entity )
returns [EdgeCollection]
```Returns the parent graph's `EdgeCollection` object of the specified `entity`.
Invoking this method will create a `EdgeCollection` if one does not yet exist.#### Graph#trace
```
trace( [Node] fromNode, [Node] toNode, [Number] direction )
returns [Path]
```Finds the shortest distance `Path` from `fromNode` to `toNode`. If there are
multiple paths of the same distance, it will return the first one it finds.`direction` can be `-1` (incoming nodes only), `0` (doesn't matter) or `1`
(outgoing nodes only).You should not depend on this method to always return the same `Path`.
For finding all paths of a specific distance, use `Graph#closest`.
#### Graph#closest
```
closest( [Node] node, [Object] options )
returns [Array] of [Path]
```Finds all closest nodes to `node` and returns their `Path`s in an array, ordered
by total distance. Nodes are filtered based on the parameters passed in
`options`.These include:
`options.compare`: A function containing a comparison constraint for the node.
Should return `true` for an inclusion of the target node, and `false` to
ignore it.Example:
```javascript
let options = {
compare: function(node) {
return node.entity === 'person';
}
}
```This will make sure only nodes with the entity `'person'` are included in your
results.`options.count`: A number indicating the amount of results to return. 0 will
return all results.`options.direction`: Which direction can we traverse the graph in?
Can be `-1` (incoming nodes only), `0` (doesn't matter) or `1`
(outgoing nodes only).`options.minDepth`: The minimum distance from our target at which to start
counting nodes in our result set.`options.maxDepth`: The maximum distance from our target at which we can finish
counting nodes in our result set.#### Graph#toJSON
```
toJSON()
returns [String]
```Creates a JSON string representation of our graph using the `toJSON` of graph
consituents.#### Graph#fromJSON
```
fromJSON( [String] json )
returns [self: Graph]
```Synchronously prepares a graph from a `json` string representation.
#### Graph#save
```
save( [String] filename, [Function] callback )
returns [self: Graph]
```Save the current graph to a file, asynchronously. Specify full path in `filename`.
`callback` is of the form `function(err) {}`.
#### Graph#load
```
load( [String] filename, [Function] callback )
returns [self: Graph]
```Load the current graph to a file, asynchronously, from `filename`.
`callback` is of the form `function(err) {}`.
---
### Unit
```
Unit()
```*Inaccessible* constructor. Base prototype for `Node` and `Edge`.
#### Unit#load
```
load( [Object] properties )
returns [self: Unit]
```Load all properties for the `Unit` from `properties`. Creates a shallow copy
of the object provided.#### Unit#set
```
set( [String] property, [Any] value )
returns [Any]
```Set a specific property of the `Unit`. Returns the set property value.
#### Unit#unset
```
unset( [String] property )
returns [Boolean]
```Unsets `property` of the `Unit`. Returns `true` on success, `false` on failure.
#### Unit#has
```
has( [String] property )
returns [Boolean]
```Returns `true` if `Unit` has property `property`, otherwise returns `false`.
#### Unit#get
```
get( [String] property )
returns [Any]
```Returns the associated property value of `Unit`.
#### Unit#toString
```
toString()
returns [String]
```Returns a string representation of the `Unit`.
#### Unit#valueOf
```
valueOf()
returns [String]
```See: `Unit#toString`.
---
### Node
```
Node()
extends [Unit]
```*Inaccessible* constructor. Inherits from `Unit`.
Use `Graph#createNode` to invoke this constructor.
#### Node#unlink
```
unlink()
returns true
```De-references all connected edges from itself, and itself from all connected
edges.---
### Edge
```
Edge()
extends [Unit]
```*Inaccessible* constructor. Inherits from `Unit`.
Use `Graph#createEdge` to invoke this constructor.
#### Edge#link
```
link( [Node] fromNode, [Node] toNode, [Boolean] duplex )
returns [self: Edge]
```Links two nodes directionally (`fromNode` to `toNode`) or bi-directionally
if `duplex` is set to `true`.#### Edge#unlink
```
unlink()
returns true
```De-references both connected nodes from itself, and itself from both connected
nodes.#### Edge#setDistance
```
setDistance( [Number] distance )
returns [self: Edge]
```Sets the distance (length) of the edge.
#### Edge#setWeight
```
setWeight( [Number] weight )
returns [self: Edge]
```Sets the distance (length) of the edge to 1 / weight.
#### Edge#oppositeNode
```
oppositeNode( [Node] node )
returns [Node]
```Returns the node opposite to the one provided (if provided node is connected to
the edge). Otherwise returns `undefined`.---
### Collection
```
Collection()
```*Inaccessible* constructor. Base prototype for `NodeCollection` and `EdgeCollection`.
#### Collection#name
```
name()
returns [String]
```Returns the entity name of the collection.
#### Collection#indices
```
indices()
returns [Array] of [String]
```Provides an array of all indexed fields in the collection
#### Collection#createIndex
```
createIndex( [String] field )
returns [self: Collection]
```Adds `field` as an index on the collection. Useful for `Collection#find` and
`Collection#destroy`.#### Collection#createIndices
```
createIndex( [Array] fieldList )
returns [self: Collection]
```Adds each `fieldList` entry as an index on the collection.
Useful for `Collection#find` and `Collection#destroy`.#### Collection#find
```
find( [String or Number] id )
find( [String] index, [String or Number] id )
returns [Unit] ([Node or Edge])
```Returns the `Unit` (node or edge) associated with the supplied `index` and `id`.
If no `index` is provided, it will use the first index added to the Collection.
#### Collection#destroy
```
destroy( [String or Number] id )
destroy( [String] index, [String or Number] id )
returns [Unit] ([Node or Edge])
```Removes the `Unit` (node or edge) associated with the supplied `index` and `id`
from the collection and returns it.If no `index` is provided, it will use the first index added to the Collection.
#### Collection#query
```
query()
returns [Query]
```Creates a new `Query` object with all units in the collection.
---
### NodeCollection
```
NodeCollection()
extends [Collection]
```*Inaccessible* constructor. Inherits from `Collection`.
Use `Graph#nodes(entity)` to invoke this constructor automatically.
---
### EdgeCollection
```
EdgeCollection()
extends [Collection]
```*Inaccessible* constructor. Inherits from `Collection`.
Use `Graph#edges(entity)` to invoke this constructor automatically.
---
### Query
```
Query()
extends [Collection]
```*Inaccessible* constructor. Inherits from `Collection`.
Use `Collection#query` to instantiate this object.
#### Query#filter
```
filter( [Array] filtersObjects )
filter( [Object] filters_1, ..., [Object] filters_n )
returns [Query]
```Returns a `Query` object containing a subset of `units` that has been filtered
based on supplied `filtersObjects`. Can be passed in as an array or separate
arguments.See [DataCollection.js examples](https://github.com/thestorefront/DataCollection.js#more-examples)
for a better idea of how these filters work. Note: the implementations are not
completely identical.Supported filters for UnitGraph's `Query` object are currently:
```
is
not
gt
lt
gte
lte
ilike
like
in
not_in
```#### Query#exclude
```
exclude( [Array] filtersObjects )
exclude( [Object] filters_1, ..., [Object] filters_n )
returns [Query]
```Returns the complementary set of units when compared to `Query#filter`.
(Excludes instead of includes filter values).#### Query#first
```
first()
returns [Unit] ([Node or Edge])
```Returns the first unit in the query set.
#### Query#last
```
last()
returns [Unit] ([Node or Edge])
```Returns the last unit in the query set.
#### Query#units
```
units()
returns [Array] of [Unit] ([Node or Edge])
```Returns all units in the query set.
---
### Path
```
Path()
```*Inaccessible* constructor. Returned from `Graph#trace` and `Graph#closest`.
#### Path#start
```
start()
returns [Node]
```Returns the first node in the path.
#### Path#end
```
end()
returns [Node]
```Returns the last node in the path.
#### Path#length
```
length()
returns [Number]
```Returns an integer indicating the number of edges in the path.
#### Path#distance
```
distance()
returns [Number]
```Returns a number indicating the total distance of the path.
#### Path#prettify
```
prettify()
returns [String]
```Provides a human-readable string representation of the path.
#### Path#toString
```
toString()
returns [String]
```Alias for `Path#prettify`.
## About
UnitGraph is MIT licenced, so have fun with it!
Reach me on Twitter, [@keithwhor](http://twitter.com/keithwhor).
Check out my personal website [keithwhor.com](http://keithwhor.com).