Created
March 8, 2017 20:46
-
-
Save ProjectCheshire/cf8cf4adf9d541ca5ec405498f8c50a4 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | |
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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}" | |
==> } ] ] | |
==> } |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'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