如何在Neo4j中创建节点(如果不存在)

时间:2017-12-14 10:28:03

标签: node.js database neo4j nosql cypher

我正在尝试建立一个管理员可以将blogPost推送到首页的系统。我使用Neo4j来保存这些对象的Mongo ID(不是最好的方法,但我被学校强迫使用Neo4j和MongoDB)。

现在我已经进行了查询并且它有效,它保存了admin,blogpost和added_by关系。问题是它创建了admin,blogpost,无论它们是否已经存在。我怎么解决这个问题?我的图表现在变得一团糟。

Sample graph

这是我的Node.js路由和查询:

routes.post('/blogPosts/frontpage/:id/:aid', function (req, res) {
  const id = req.param('id');
  const aid = req.param('aid');

  session
    .run("CREATE(n:BlogPost {mongoId:{idNeo}}), (b:Admin {mongoAdminId:{idNeoAd}})", {idNeo: id, idNeoAd: aid});
    session
    .run("MATCH (u:BlogPost {mongoId:{idNeo}}), (r:Admin {mongoAdminId:{idNeoAd}}) CREATE (u)-[:ADDED_BY]->(r)", {idNeo: id, idNeoAd: aid})
    .then(function(result) {
      res.status(200).json({"response": "BlogPost added to front page."});
      session.close();
    })
    .catch((error) => {
      res.status(400).json(error);
    });
});

我如何更改我的路线,只有在他们不存在的情况下才添加管理员/帖子?

编辑:

session.run("CREATE (u:BlogPost {mongoId:{idNeo}}), (r:Admin {mongoAdminId:{idNeoAd}}) CREATE UNIQUE(u)-[:ADDED_BY]->(r)", {idNeo: id, idNeoAd: aid})

这可以修复混乱,但即使它们存在,仍会创建节点。

现在我的查询中出现语义错误(在session.run中)

routes.post('/blogPosts/frontpage/:id/:aid', function (req, res) {
  const id = req.param('id');
  const aid = req.param('aid');

    session
    .run("MERGE (n:BlogPost {mongoId:{idNeo}}) MERGE (b:Admin {mongoAdminId:{idNeoAd}}) CREATE UNIQUE(u)-[:ADDED_BY]->(r)", {idNeo: id, idNeoAd: aid})
    .then(function(result) {
      res.status(200).json({"response": "BlogPost added to front page."});
      session.close();
    })
    .catch((error) => {
      res.status(400).json(error);
    });
});

1 个答案:

答案 0 :(得分:2)

在这种情况下,请使用MERGE而不是CREATE。关于MERGE的文档说:

  

MERGE子句确保图中存在模式。或   模式已经存在,或者需要创建。

尝试将您的查询更改为:

MERGE (n:BlogPost {mongoId:{idNeo}}) MERGE (b:Admin {mongoAdminId:{idNeoAd}})