Search code examples
neo4juniquenodesnode-neo4j

Node-Neo4j How to check if node exists(persistently)?


I'm using Node-Neo4j client for my db. I want to create unique node, but I couldn't find how to do that in the documentation of Node-Neo4j. I used the logic below to check if a node exists or not:

person_param = {'name': namesurname, 'userid': userid };
person_node = db.createNode(person_param);

if (!person_node.exists){
   person_node.save(function(err, result){
       //if(err) and if(!err) stuff
   });
}

But, from what I understand, createNode creates a new node from scratch, and when I use exists on it, it just checks if the newly created node saved into database or not.

How can I check if a node with supplied properties already exists in db or not?

Thanks in advance.


Solution

  • The only solution I can think of, is the following:

    • Create your properties object
    • Query the Neo4J instance for those properties
      • If a result is returned use that
      • otherwise save it

    In code:

    var person_param = {'name': namesurname, 'userid': userid };
    // Build a Cypher query
    var query = [
      'MATCH (user: {name: {name}, id: {userid}})',
      'RETURN user'
    ].join('\n');
    // use your params in the query
    var params = person_param;
    
    // Send the Cypher query
    db.query(query, params, function (err, results) {
      if (err) throw err;
      // no node with such properties found
      if(!results.length){
        saveNode(params, callback)
      } else {
        // carry on with your code...
      }
    });
    
    function saveNode(person_param, callback){
      var person_node = db.createNode(person_param);
      person_node.save(function(err, result){
        //if(err) and if(!err) stuff
        // call the callback here
      });
    }
    

    The downside of this approach is that you need to build a Cypher query for each type of node you have, because there's no way (as far as I know) to pass both properties name and values to Cypher.