Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ProjectCheshire/cf8cf4adf9d541ca5ec405498f8c50a4 to your computer and use it in GitHub Desktop.
Save ProjectCheshire/cf8cf4adf9d541ca5ec405498f8c50a4 to your computer and use it in GitHub Desktop.
var getNode = function(id, type) {
var deferred = q.defer();
var query = [
'START entity=node:nodes(type = {type})',
'MATCH entity',
'WHERE entity.id = {id}',
'RETURN entity;'
].join('\n');
var params = {
id: id,
type:type
};
graphdb.query(query, params, function(err, results) {
if(err) return deferred.reject(err);
console.log(results);
deferred.resolve(results);
});
return deferred.promise;
};
http> POST /db/data/cypher {"query":"START entity=node:nodes(type = {type}) MATCH entity WHERE entity.id = {id} RETURN entity;", "params":{ "id": 6, "type": "user" }}
==> 200 OK
==> {
==> "columns" : [ "entity" ],
==> "data" : [ [ {
==> "outgoing_relationships" : "http://localhost:7474/db/data/node/7303/relationships/out",
==> "data" : {
==> "id" : 6,
==> "username" : "petermdenton"
==> },
==> "traverse" : "http://localhost:7474/db/data/node/7303/traverse/{returnType}",
==> "all_typed_relationships" : "http://localhost:7474/db/data/node/7303/relationships/all/{-list|&|types}",
==> "property" : "http://localhost:7474/db/data/node/7303/properties/{key}",
==> "self" : "http://localhost:7474/db/data/node/7303",
==> "properties" : "http://localhost:7474/db/data/node/7303/properties",
==> "outgoing_typed_relationships" : "http://localhost:7474/db/data/node/7303/relationships/out/{-list|&|types}",
==> "incoming_relationships" : "http://localhost:7474/db/data/node/7303/relationships/in",
==> "extensions" : {
==> },
==> "create_relationship" : "http://localhost:7474/db/data/node/7303/relationships",
==> "paged_traverse" : "http://localhost:7474/db/data/node/7303/paged/traverse/{returnType}{?pageSize,leaseTime}",
==> "all_relationships" : "http://localhost:7474/db/data/node/7303/relationships/all",
==> "incoming_typed_relationships" : "http://localhost:7474/db/data/node/7303/relationships/in/{-list|&|types}"
==> } ] ]
==> }
'use strict';
var q = require('q'),
config = require('../config'),
neo4j = require('neo4j'),
graphdb = new neo4j.GraphDatabase(config.get('urls').neo4j),
relationaldb = require('../lib/db'),
users = require('../routes/users/data'),
userformat = require('../routes/users/formatting'),
stories = require('../routes/stories/data'),
storyformat = require('../routes/stories/formatting');
var error = function(err) {
console.log('OH NOES!');
console.log(err);
process.exit(1);
};
var done = function() {
console.log('done!');
process.exit(0);
};
var deleteAllNodes = function() {
console.log('Removing all nodes');
var query = [
'START nodes=node(*)',
'DELETE nodes'
].join('\n');
var deferred = q.defer();
graphdb.query(query,{}, function(err, results) {
if(err) return deferred.reject(err);
deferred.resolve();
});
return deferred.promise;
};
var addUser = function(user) {
console.log('Adding :' + user.username);
var node = graphdb.createNode({
id: user.id,
username: user.username
});
var deferred = q.defer();
node.save(function (err) {
if (err) return deferred.reject(err);
node.index('nodes', 'type', 'user', function (err) {
if (err) return deferred.reject(err);
deferred.resolve(user);
});
});
return deferred.promise;
};
var addUsers = function() {
return users.list()
.then(function(users) {
return q.all(users.map(userformat.formatForWire)
.map(addUser));
})
.thenResolve();
};
var addStory = function(story) {
console.log('Adding :' + story.id);
/*
neo4j cannot store complex objects only properties
so I am stubbing a story here, but we could
stringify pages and get the whole story object
in here
*/
var node = graphdb.createNode({
id: story.id
});
var deferred = q.defer();
node.save(function (err) {
if (err) return deferred.reject(err);
node.index('nodes', 'type', 'story', function (err) {
if (err) return deferred.reject(err);
deferred.resolve(story);
});
});
return deferred.promise;
};
var addStories = function() {
return stories.list({ count: 1000})
.then(function(stories) {
return q.all(stories.map(storyformat.formatForWire)
.map(addStory));
})
.thenResolve();
};
var getNode = function(id, type) {
var deferred = q.defer();
var query = [
'START entity=node:nodes(type = {type})',
'MATCH entity',
'WHERE entity.id = {id}',
'RETURN entity;'
].join('\n');
var params = {
id: id,
type:type
};
graphdb.query(query, params, function(err, results) {
if(err) return deferred.reject(err);
console.log(results);
deferred.resolve(results);
});
return deferred.promise;
};
var associateNodes = function(node, other, relationship) {
var deferred = q.defer();
node.createRelationshipTo(other, relationship, {}, function(err) {
if(err) return deferred.reject(err);
deferred.resolve();
});
return deferred.promise;
};
var addUserStoryRelationship = function(thing) {
return q.all([getNode(thing.user_id, 'user'), getNode(thing.story_id, 'story')])
.spread(function(userNode, storyNode){
return q.all([associateNodes(userNode, storyNode, 'stories'),
associateNodes(storyNode, userNode, 'user')]);
})
.thenResolve();
};
var addUserStoryRelationships = function() {
console.log('adding story => user relationships');
var query = [
'select users.id as user_id, stories.id as story_id',
'from users',
'join stories',
'on users.id = stories.user_id'
].join('\n');
return relationaldb.query(query)
.then(function(results) {
return results.rows.map(addUserStoryRelationship);
})
.thenResolve();
};
deleteAllNodes()
.then(addUsers)
.then(addStories)
.then(addUserStoryRelationships)
.done(done, error);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment