Search code examples
javascriptnode.jsneo4jneo4j-node

Neo4j + nodejs: create node using javascript object literal


can't find whether this has been asked before or not, so bear with me.
I'm just starting to use Neo4j with a nodejs backend and the neo4j-driver driver. I wonder if it's possible to create a node with several properties without enumerating each one in the second argument to the session.run method.

app.post("/signup", function(req, res) {
    var user = req.body; //{userId: "johnsmith", email: "john@smith.com", ...}
    session.run("CREATE (u:User {u}) RETURN u", user).then(function(response) {
        /*do stuff with newly created user*/
    }, function() {
        //handle error
    });
});

Currently, this yields the following error: {code: 'Neo.ClientError.Statement.ParameterMissing', message: 'Expected a parameter named u' }, and if I change the above to:

app.post("/signup", function(req, res) {
    var user = req.body; //{userId: "johnsmith", email: "john@smith.com", ...}
    session.run("CREATE (u:User {u}) RETURN u", {u: user}).then(function(response) {
        /*do stuff with newly created user*/
    }, function() {
        //handle error
    });
});

then the error reads: { code: 'Neo.ClientError.Statement.TypeError', message: 'Property values can only be of primitive types or arrays thereof' }.

This doesn't make much sense to me, given that the refcard clearly states you can create a node using a map, like so: CREATE (n {map}); so I must obviously be getting something wrong. I hope I don't have to enumerate all a user's properties like so:

session.run("CREATE (u:User {userId: {u.userId}, email: {u.email}, ...}) RETURN u", {u: user}).then(/*...*/)

Thanks in advance


Solution


  • For example:

    app.post("/signup", function(req, res) {
        var params = {};
        //{userId: "johnsmith", email: "john@smith.com", ...}
        Object.keys(req.body).forEach( function(k) {
            var value = req.body[k];
            if (!isPrimitive(val)) value = JSON.stringify(value);
            params[k] = value;
        });
    
        session.run("CREATE (u:User) SET u = {user} RETURN u", {user: params})
            .then(function(response) {
                // do stuff with newly created user
            }, function() {
                // handle error
            });
    });
    

    Where isPrimitive an abstract function that checks whether a variable is a primitive.