UNPKG

graph-acl

Version:

An ACL module using Graph databases.

686 lines (615 loc) 19.8 kB
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>JSDoc: Source: connectors/neo4j.js</title> <script src="scripts/prettify/prettify.js"> </script> <script src="scripts/prettify/lang-css.js"> </script> <!--[if lt IE 9]> <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> </head> <body> <div id="main"> <h1 class="page-title">Source: connectors/neo4j.js</h1> <section> <article> <pre class="prettyprint source"><code>"use strict"; /** * Neo4j Connector. */ var async = require('async'); /** * Create an instance of Neo4jConnector. * * Examples: * var neo4j = require('node-neo4j'); * var acl = require('node-graph-acl'); * var db = new neo4j('http://localhost:7474'); * var connector = new acl.neo4jConnector(db); * * @constructor * @this {Neo4jConnector} * @param {string} db - The database connection string. Format: http://username:password@domain:port */ function Neo4jConnector(db){ if (typeof db === 'undefined') { this.db = 'http://localhost:7474'; } else { this.db = db; } } /** * Create a node with given labels and properties. * * Examples: * connector.createNode(callback); * connector.createNode(['l1','l2'], callback); * connector.createNode(['l1','l2'], {p1:'v1', p2:'v2'},, callback); * * @param {Array} labels - Node labels. * @param {Object} properties - Node properties. * @param {Function} callback - Callback called when finished. */ Neo4jConnector.prototype.createNode = function (labels, properties, callback) { // To make properties and labels optional if (typeof callback === 'undefined') { if (typeof properties === 'function') { callback = properties; properties = {}; } else if (typeof labels === 'function') { callback = labels; properties = {}; labels = []; } } else { if (typeof labels === 'undefined') { labels = []; } if (typeof properties === 'undefined') { properties = {}; } } this.db.insertNode(properties, labels, callback); }; /** * Get a node. * * Examples: * connector.getNode(1, callback); * * @param {Number|String} nodeId - Node id. * @param {Function} callback - Callback called when finished. */ Neo4jConnector.prototype.getNode = function (nodeId, callback) { this.db.readNode(nodeId, callback); }; /** * Get Nodes with given label. * * Examples: * connector.getNodesWithLabel('Test', callback); * * @param {String} label - Label to search. * @param {Function} callback - Callback called when finished. */ Neo4jConnector.prototype.getNodesWithLabel = function (label, callback) { this.db.readNodesWithLabel(label, callback); }; /** * Get Nodes with given properties. * * Examples: * connector.getNodesWithProperties({p1: 'v1', p2: 'v2'}, callback); * * @param {Object} properties - Properties to search. * @param {Function} callback - Callback called when finished. */ Neo4jConnector.prototype.getNodesWithProperties = function (properties, callback) { this.db.readNodesWithProperties(properties, callback); }; /** * Get Nodes with given labels and properties. * * Examples: * connector.getNodesWithLabelsAndProperties('Label', {p1: 'v1', p2: 'v2'}, callback); * connector.getNodesWithLabelsAndProperties(['Label1', 'Label2'], {p1: 'v1', p2: 'v2'}, callback); * * @param {String|Array} labels - Labels to search. * @param {Object} properties - Properties to search. * @param {Function} callback - Callback called when finished. */ Neo4jConnector.prototype.getNodesWithLabelsAndProperties = function (labels, properties, callback) { this.db.readNodesWithLabelsAndProperties(labels, properties, callback); }; /** * Check existence of Nodes with given label. * * Examples: * connector.existsNodeWithLabel('Test', callback); * * @param {String} label - Label to search. * @param {Function} callback - Callback called when finished. */ Neo4jConnector.prototype.existsNodeWithLabel = function (label, callback) { this.db.readNodesWithLabel(label, function(err, roles) { if ((typeof roles !== 'undefined') && (roles.length > 0)) { callback(err, true); } else { callback(err, false); } }); }; /** * Check existence of Nodes with given properties. * * Examples: * connector.existsNodeWithProperties({p1: 'v1', p2: 'v2'}, callback); * * @param {Object} properties - Properties to search. * @param {Function} callback - Callback called when finished. */ Neo4jConnector.prototype.existsNodeWithProperties = function (properties, callback) { this.db.readNodesWithProperties(properties, function(err, roles) { if ((typeof roles !== 'undefined') && (roles.length > 0)) { callback(err, true); } else { callback(err, false); } }); }; /** * Check existence of Nodes with given labels and properties. * * Examples: * connector.existsNodeWithLabelsAndProperties('Label', {p1: 'v1', p2: 'v2'}, callback); * connector.existsNodeWithLabelsAndProperties(['Label1', 'Label2'], {p1: 'v1', p2: 'v2'}, callback); * * @param {String|Array} labels - Labels to search. * @param {Object} properties - Properties to search. * @param {Function} callback - Callback called when finished. */ Neo4jConnector.prototype.existsNodeWithLabelsAndProperties = function (labels, properties, callback) { this.db.readNodesWithLabelsAndProperties(labels, properties, function(err, roles) { if ((typeof roles !== 'undefined') && (roles.length > 0)) { callback(err, true); } else { callback(err, false); } }); }; /** * Update an existing node with given labels and properties. * Note: All old properties and labels will be erased. * * Examples: * connector.updateNode(1, callback); * connector.updateNode(1, ['l1','l2'], callback); * connector.updateNode(1, ['l1','l2'], {p1:'v1', p2:'v2'}, callback); * * @param {Number|String} nodeId - Node id. * @param {Array} labels - Node labels. * @param {Object} properties - Node properties. * @param {Function} callback - Callback called when finished. */ Neo4jConnector.prototype.updateNode = function (nodeId, labels, properties, callback) { var db = this.db; async.parallel({ updateLabels: function(cb) { db.replaceLabelsFromNode(nodeId, labels, cb); }, updateProperties: function(cb) { db.updateNode(nodeId, properties, cb); } }, function (err, results) { callback(err, results); }); }; /** * Delete an existing node. * * Examples: * connector.deleteNode(1, callback); * * @param {Number|String} nodeId - Node id. * @param {Function} callback - Callback called when finished. */ Neo4jConnector.prototype.deleteNode = function (nodeId, callback) { this.db.deleteNode(nodeId, callback); }; /** * Get an existing node's properties. * * Examples: * connector.getNodeProperties(1, callback); * * @param {Number|String} nodeId - Node id. * @param {Function} callback - Callback called when finished. */ Neo4jConnector.prototype.getNodeProperties = function (nodeId, callback) { this.db.readNode(nodeId, function(err, node) { delete node['_id']; callback(null, node); }); }; /** * Create a relationship between two nodes. * Properties can be added to the relationship. * * Examples: * connector.addRelationship(1, 2, 'TYPE', {p1:'v1', p2:'v2'}, callback); * connector.addRelationship(1, 2, 'TYPE', callback); * * @param {Number|String} from - From Node id. * @param {Number|String} to - To Node id. * @param {String} type - Relationship Type. * @param {Object} properties - Relationship properties. * @param {Function} callback - Callback called when finished. */ Neo4jConnector.prototype.addRelationship = function (from, to, type, properties, callback) { if (typeof callback === 'undefined') { if (typeof properties === 'function') { callback = properties; properties = {}; } } this.db.insertRelationship(from, to, type, properties, callback); }; /** * Get a relationship. * * Examples: * connector.getRelationship(1, callback); * * @param {Number|String} relationshipId - Relationship id. * @param {Function} callback - Callback called when finished. */ Neo4jConnector.prototype.getRelationship = function (relationshipId, callback) { this.db.readRelationship(relationshipId, callback); }; /** * Update properties of a relationship between two nodes. * * Examples: * connector.updateRelationship(1, {p1:'v1', p2:'v2'}, callback); * * @param {Number|String} relationshipId - Relationship id. * @param {Object} properties - Relationship properties. * @param {Function} callback - Callback called when finished. */ Neo4jConnector.prototype.updateRelationship = function (relationshipId, properties, callback) { this.db.updateRelationship(relationshipId, properties, callback); }; /** * Remove relationship. * * Examples: * connector.removeRelationship(1, callback); * * @param {Number|String} relationshipId - Relationship id. * @param {Function} callback - Callback called when finished. */ Neo4jConnector.prototype.removeRelationship = function (relationshipId, callback) { this.db.deleteRelationship(relationshipId, callback); }; /** * Get a relationship properties. * * Examples: * connector.getRelationshipProperties(1, callback); * * @param {Number|String} relationshipId - Relationship id. * @param {Function} callback - Callback called when finished. */ Neo4jConnector.prototype.getRelationshipProperties = function (relationshipId, callback) { this.db.readRelationship(relationshipId, function(err, relationship) { var properties = relationship; delete properties['_id']; delete properties['_type']; delete properties['_start']; delete properties['_end']; callback(null, properties); }); }; /** * Get a node relationships. * * Examples: * var options = { * types: ['TEST', ...] // optional * direction: 'in' // optional, alternative 'out', defaults to 'all' * } * connector.getNodeRelationships(1, options, callback); * connector.getNodeRelationships(1, {}, callback); * * @param {Number|String} nodeId - Node id. * @param {String} options - Type of relationship: 'in', 'out' or 'all' (Default). Optional. * @param {Function} callback - Callback called when finished. */ Neo4jConnector.prototype.getNodeRelationships = function (nodeId, options, callback) { this.db.readRelationshipsOfNode(nodeId, options, callback); }; /** * Get Relationships between two nodes. * * Examples: * connector.getRelationshipBetweenNodes(1, 2, callback); * connector.getRelationshipBetweenNodes(1, 2, 'TYPE', callback); * * @param {Number|String} from - From Node id. * @param {Number|String} to - To Node id. * @param {String} type - Relationship Type. * @param {Function} callback - Callback called when finished. */ Neo4jConnector.prototype.getRelationshipsBetweenNodes = function (from, to, type, callback) { if (typeof callback === 'undefined') { if (typeof type === 'function') { callback = type; type = undefined; } } var options = {}; if (typeof type === 'undefined') { options.types = [type]; } var finalRelationships = []; this.db.readRelationshipsOfNode(from, options, function (err, relationships) { async.map( relationships, // Array function(relationship, cb){ if (relationship._start === from && relationship._end === to) { finalRelationships.push(relationship); cb(null, true); } else { cb(null, false); } }, function(err, results){ if (finalRelationships.length === 1) { callback(err, finalRelationships[0]); } else { callback(err, finalRelationships); } } ); }); }; /** * Check existence of Relationships between two nodes. * * Examples: * connector.getRelationshipBetweenNodes(1, 2, callback); * connector.getRelationshipBetweenNodes(1, 2, 'TYPE', callback); * * @param {Number|String} from - From Node id. * @param {Number|String} to - To Node id. * @param {String} type - Relationship Type. * @param {Function} callback - Callback called when finished. */ Neo4jConnector.prototype.existsRelationshipsBetweenNodes = function (from, to, type, callback) { if (typeof callback === 'undefined') { if (typeof type === 'function') { callback = type; type = undefined; } } var options = {}; if (typeof type === 'undefined') { options.types = [type]; } this.db.readRelationshipsOfNode(from, options, function (err, relationships) { if ((typeof relationships !== 'undefined') && (relationships.length > 0)) { var exists = false; //@todo: take into account type relationships.forEach(function(relationship) { if ((from === relationship._start) && (to === relationship._end)) { exists = true; } }); callback(err, exists); } else { callback(err, false); } }); }; /** * Add properties to a node. * * Examples: * connector.addNodeProperties(1, {p1:'v1', p2:'v2'}, callback); * * @param {String|Number} nodeId - Node id. * @param {Object} properties - Properties to add. * @param {Function} callback - Callback called when finished. */ Neo4jConnector.prototype.addNodeProperties = function (nodeId, properties, callback) { var _this = this; _this.getNodeProperties(nodeId, function(err, existingProperties) { for (var key in properties) { existingProperties[key] = properties[key]; } _this.getNodeLabels(nodeId, function(err, existingLabels) { _this.updateNode(nodeId, existingLabels, existingProperties, callback); }); }); }; /** * Update properties of a node. * * Examples: * connector.updateNodeProperties(1, {p1:'v1', p2:'v2'}, callback); * * @param {String|Number} nodeId - Node id. * @param {Object} properties - Properties to replace with. * @param {Function} callback - Callback called when finished. */ Neo4jConnector.prototype.updateNodeProperties = function (nodeId, properties, callback) { var _this = this; _this.getNodeLabels(nodeId, function(err, existingLabels) { _this.updateNode(nodeId, existingLabels, properties, callback); }); }; /** * Removes properties from a node. * * Examples: * connector.removeNodeProperties(1, ['p1', 'p2'], callback); * * @param {Number|String} nodeId - Node id. * @param {Object} properties - Properties to remove. * @param {Function} callback - Callback called when finished. */ Neo4jConnector.prototype.removeNodeProperties = function (nodeId, properties, callback) { var _this = this; _this.getNodeProperties(nodeId, function(err, existingProperties) { for (var key in properties) { delete existingProperties[key]; } _this.getNodeLabels(nodeId, function(err, existingLabels) { _this.updateNode(nodeId, existingLabels, existingProperties, callback); }); }); }; /** * Add properties to a relationship. * * Examples: * connector.addRelationshipProperties(1, {p1:'v1', p2:'v2'}, callback); * * @param {Number|String} relationshipId - Relationship id. * @param {Object} properties - Properties to add. * @param {Function} callback - Callback called when finished. */ Neo4jConnector.prototype.addRelationshipProperties = function (relationshipId, properties, callback) { var _this = this; _this.getRelationshipProperties(relationshipId, function(err, existingProperties) { for (var key in properties) { existingProperties[key] = properties[key]; } _this.updateRelationship(relationshipId, existingProperties, callback); }); }; /** * Update properties of a relationship. * * Examples: * connector.updateRelationshipProperties(1, {p1:'v1', p2:'v2'}, callback); * * @param {Number|String} relationshipId - Relationship ID. * @param {Object} properties - Properties to replace with. * @param {Function} callback - Callback called when finished. */ Neo4jConnector.prototype.updateRelationshipProperties = function (relationshipId, properties, callback) { this.updateRelationship(relationshipId, properties, callback); }; /** * Remove properties from a relationship. * * Examples: * connector.removeRelationshipProperties(1, ['p1', 'p2'], callback); * * @param {Number|String} relationshipId - Relationship id. * @param {Object} properties - Properties to remove. * @param {Function} callback - Callback called when finished. */ Neo4jConnector.prototype.removeRelationshipProperties = function (relationshipId, properties, callback) { var _this = this; _this.getNodeProperties(relationshipId, function(err, existingProperties) { for (var key in properties) { delete existingProperties[key]; } _this.updateRelationship(relationshipId, existingProperties, callback); }); }; /** * Get node labels. * * Examples: * connector.getNodeLabels(1, callback); * * @param {Number|String} nodeId - Node id. * @param {Function} callback - Callback called when finished. */ Neo4jConnector.prototype.getNodeLabels = function (nodeId, callback) { this.db.readLabels(nodeId, callback); }; /** * Add labels to a node. * * Examples: * connector.addNodeLabels(1, ['l1', 'l2'], callback); * * @param {Number|String} nodeId - Node id. * @param {Array} labels - Labels to add. * @param {Function} callback - Callback called when finished. */ Neo4jConnector.prototype.addNodeLabels = function (nodeId, labels, callback) { this.db.addLabelsToNode(nodeId, labels, callback); }; /** * Remove a label from a node. * * Examples: * connector.removeNodeLabel(1, 'l1', callback); * connector.removeNodeLabel(1, ['l1', 'l2'], callback); * * @param {Number|String} nodeId - Node id. * @param {String|Array} labels - Labels to remove. * @param {Function} callback - Callback called when finished. */ Neo4jConnector.prototype.removeNodeLabels = function (nodeId, labels, callback) { var _this = this; // When only one label in string format, transform it to array if (!(labels instanceof Array)) { labels = [labels]; } async.map( labels, // Array function(label, cb){ _this.db.deleteLabelFromNode(nodeId, label, cb); }, function(err, results){ if (results.length === 1) { callback(err, results[0]); } else { callback(err, results); } } ); }; /** * Get object parameters after extracting all _* parameters. * * Examples: * connector._getParameters(node, callback); * * @param {Object} object - Object. Can be a node, a relationship, or any object. * @param {Function} callback - Callback called when finished. */ Neo4jConnector.prototype._getParameters = function (node, callback) { for (var key in node) { if (key.indexOf('_') === 0) { delete node[key]; } } callback(null, node); }; module.exports = Neo4jConnector; </code></pre> </article> </section> </div> <nav> <h2><a href="index.html">Index</a></h2><h3>Classes</h3><ul><li><a href="ACL.html">ACL</a></li><li><a href="Neo4jConnector.html">Neo4jConnector</a></li></ul><h3>Global</h3><ul><li><a href="global.html#async">async</a></li><li><a href="global.html#Connector">Connector</a></li></ul> </nav> <br clear="both"> <footer> Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.2.2</a> on Fri Aug 08 2014 16:10:13 GMT-0000 (UTC) </footer> <script> prettyPrint(); </script> <script src="scripts/linenumber.js"> </script> </body> </html>