ts-neo4j-parser
Version:
Typescript Neo4j parser to JSON
119 lines • 6.77 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Graph = void 0;
const Queue_1 = require("./Queue");
/**
* Graph class
*
* @export
* @class Graph
* @template T
* @template V
*/
class Graph {
/**
* Creates an instance of Graph.
* @param {boolean} [allowCyclic=false]
* @memberof Graph
*/
constructor(allowCyclic = false) {
this._adjacencies = new Map();
this._allowCyclic = allowCyclic;
this._nodes = [];
}
/**
* Adds a node
*
* @param {Node<T, V>} node
* @memberof Graph
*/
addNode(node) {
this._adjacencies.set(node.id, []);
this._nodes.push(node);
}
/**
* Adds an edge
*
* @param {Node<T, V>} nodeA
* @param {Node<T, V>} nodeB
* @memberof Graph
*/
addEdge(nodeA, nodeB) {
if (!this._allowCyclic && nodeA.id === nodeB.id) {
throw Error('Graph cannot be cyclical');
}
const a = this._adjacencies.get(nodeA.id);
const b = this._adjacencies.get(nodeB.id);
if (!a || !b) {
throw new Error('One or both nodes not found');
}
a.push(nodeB);
b.push(nodeA);
}
/**
* Prints the graph to a string
*
* @return {*} {string}
* @memberof Graph
*/
printGraph() {
let str = '';
for (const [key, val] of this._adjacencies) {
str += `${key} -> ${val.map((x) => x.id).join(', ')} \n`;
}
return str;
}
/**
* Breath first search from the given node
*
* @param {Node<T, V>} startNode
* @param {IProcess<T, V>} [callBack]
* @return {*} {Map<T, V>}
* @memberof Graph
*/
breadthFirstSearch(startNode, callBack) {
const visitedNodes = new Map();
const q = new Queue_1.Queue();
q.enqueue(startNode);
while (!q.empty) {
const node = q.dequeue();
if (callBack && node) {
const result = callBack.process(node);
if (result) {
break;
}
}
if (node && !visitedNodes.get(node.id)) {
const adja = this._adjacencies.get(node.id) || [];
q.enqueue(...adja);
visitedNodes.set(node.id, node.data);
}
}
return visitedNodes;
}
/**
* Depth first search from the given node
*
* @param {Node<T, V>} startNode
* @return {*} {Map<T, V>}
* @memberof Graph
*/
depthFirstSearch(startNode) {
const visitedNodes = new Map();
this.dfsUtil(startNode, visitedNodes);
return visitedNodes;
}
// Recursive function which process and explore
// all the adjacent vertex of the vertex with which it is called
dfsUtil(vert, visitedNodes) {
visitedNodes.set(vert.id, vert.data);
const neighbours = this._adjacencies.get(vert.id) || [];
for (const neighbour of neighbours) {
if (!visitedNodes.get(neighbour.id)) {
this.dfsUtil(neighbour, visitedNodes);
}
}
}
}
exports.Graph = Graph;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JhcGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YS9HcmFwaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBZ0M7QUFJaEM7Ozs7Ozs7R0FPRztBQUNILE1BQWEsS0FBSztJQU1oQjs7OztPQUlHO0lBQ0gsWUFBWSxjQUF1QixLQUFLO1FBQ3RDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxHQUFHLEVBQW1CLENBQUM7UUFDL0MsSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7UUFDaEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksT0FBTyxDQUFDLElBQWdCO1FBQzdCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDbkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLE9BQU8sQ0FBQyxLQUFpQixFQUFFLEtBQWlCO1FBQ2pELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLEtBQUssQ0FBQyxFQUFFLEtBQUssS0FBSyxDQUFDLEVBQUUsRUFBRTtZQUMvQyxNQUFNLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1NBQ3pDO1FBQ0QsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUUxQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO1lBQ1osTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1NBQ2hEO1FBRUQs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