;(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);
|
|
|
|
|