123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 |
- ;(function (undefined) {
- 'use strict';
- if (typeof sigma === 'undefined')
- throw 'sigma is not declared';
- // Declare neo4j package
- sigma.utils.pkg("sigma.neo4j");
- // Initialize package:
- sigma.utils.pkg('sigma.utils');
- /**
- * This function is an helper for the neo4j communication.
- *
- * @param {string|object} neo4j The URL of neo4j server or a neo4j server object.
- * @param {string} endpoint Endpoint of the neo4j server
- * @param {string} method The calling method for the endpoint : 'GET' or 'POST'
- * @param {object|string} data Data that will be send to the server
- * @param {function} callback The callback function
- */
- sigma.neo4j.send = function(neo4j, endpoint, method, data, callback) {
- var xhr = sigma.utils.xhr(),
- url, user, password;
- // if neo4j arg is not an object
- url = neo4j;
- if(typeof neo4j === 'object') {
- url = neo4j.url;
- user = neo4j.user;
- password = neo4j.password;
- }
- if (!xhr)
- throw 'XMLHttpRequest not supported, cannot load the file.';
- // Construct the endpoint url
- url += endpoint;
- xhr.open(method, url, true);
- if( user && password) {
- xhr.setRequestHeader('Authorization', 'Basic ' + btoa(user + ':' + password));
- }
- xhr.setRequestHeader('Accept', 'application/json');
- xhr.setRequestHeader('Content-type', 'application/json; charset=utf-8');
- xhr.onreadystatechange = function () {
- if (xhr.readyState === 4) {
- // Call the callback if specified:
- callback(JSON.parse(xhr.responseText));
- }
- };
- xhr.send(data);
- };
- /**
- * This function parse a neo4j cypher query result, and transform it into
- * a sigma graph object.
- *
- * @param {object} result The server response of a cypher query.
- *
- * @return A graph object
- */
- sigma.neo4j.cypher_parse = function(result) {
- var graph = { nodes: [], edges: [] },
- nodesMap = {},
- edgesMap = {},
- key;
- // Iteration on all result data
- result.results[0].data.forEach(function (data) {
- // iteration on graph for all node
- data.graph.nodes.forEach(function (node) {
- var sigmaNode = {
- id : node.id,
- label : node.id,
- x : Math.random(),
- y : Math.random(),
- size : 1,
- color : '#000000',
- neo4j_labels : node.labels,
- neo4j_data : node.properties
- };
- if (sigmaNode.id in nodesMap) {
- // do nothing
- } else {
- nodesMap[sigmaNode.id] = sigmaNode;
- }
- });
- // iteration on graph for all node
- data.graph.relationships.forEach(function (edge) {
- var sigmaEdge = {
- id : edge.id,
- label : edge.type,
- source : edge.startNode,
- target : edge.endNode,
- color : '#7D7C8E',
- neo4j_type : edge.type,
- neo4j_data : edge.properties
- };
- if (sigmaEdge.id in edgesMap) {
- // do nothing
- } else {
- edgesMap[sigmaEdge.id] = sigmaEdge;
- }
- });
- });
- // construct sigma nodes
- for (key in nodesMap) {
- graph.nodes.push(nodesMap[key]);
- }
- // construct sigma nodes
- for (key in edgesMap) {
- graph.edges.push(edgesMap[key]);
- }
- return graph;
- };
- /**
- * This function execute a cypher and create a new sigma instance or
- * updates the graph of a given instance. It is possible to give a callback
- * that will be executed at the end of the process.
- *
- * @param {object|string} neo4j The URL of neo4j server or a neo4j server object.
- * @param {string} cypher The cypher query
- * @param {?object|?sigma} sig A sigma configuration object or a sigma instance.
- * @param {?function} callback Eventually a callback to execute after
- * having parsed the file. It will be called
- * with the related sigma instance as
- * parameter.
- */
- sigma.neo4j.cypher = function (neo4j, cypher, sig, callback) {
- var endpoint = '/db/data/transaction/commit',
- data, cypherCallback;
- // Data that will be send to the server
- data = JSON.stringify({
- "statements": [
- {
- "statement": cypher,
- "resultDataContents": ["graph"],
- "includeStats": false
- }
- ]
- });
- // Callback method after server response
- cypherCallback = function (callback) {
- return function (response) {
- var graph = { nodes: [], edges: [] };
- graph = sigma.neo4j.cypher_parse(response);
- // Update the instance's graph:
- if (sig instanceof sigma) {
- sig.graph.clear();
- sig.graph.read(graph);
- // ...or instantiate sigma if needed:
- } else if (typeof sig === 'object') {
- sig = new sigma(sig);
- sig.graph.read(graph);
- sig.refresh();
- // ...or it's finally the callback:
- } else if (typeof sig === 'function') {
- callback = sig;
- sig = null;
- }
- // Call the callback if specified:
- if (callback)
- callback(sig || graph);
- };
- };
- // Let's call neo4j
- sigma.neo4j.send(neo4j, endpoint, 'POST', data, cypherCallback(callback));
- };
- /**
- * This function call neo4j to get all labels of the graph.
- *
- * @param {string} neo4j The URL of neo4j server or an object with the url, user & password.
- * @param {function} callback The callback function
- *
- * @return An array of label
- */
- sigma.neo4j.getLabels = function(neo4j, callback) {
- sigma.neo4j.send(neo4j, '/db/data/labels', 'GET', null, callback);
- };
- /**
- * This function parse a neo4j cypher query result.
- *
- * @param {string} neo4j The URL of neo4j server or an object with the url, user & password.
- * @param {function} callback The callback function
- *
- * @return An array of relationship type
- */
- sigma.neo4j.getTypes = function(neo4j, callback) {
- sigma.neo4j.send(neo4j, '/db/data/relationship/types', 'GET', null, callback);
- };
- }).call(this);
-
|