我正在尝试建立一个管理员可以将blogPost
推送到首页的系统。我使用Neo4j来保存这些对象的Mongo ID(不是最好的方法,但我被学校强迫使用Neo4j和MongoDB)。
现在我已经进行了查询并且它有效,它保存了admin,blogpost和added_by
关系。问题是它创建了admin,blogpost,无论它们是否已经存在。我怎么解决这个问题?我的图表现在变得一团糟。
这是我的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);
});
});
答案 0 :(得分:2)
在这种情况下,请使用MERGE而不是CREATE。关于MERGE的文档说:
MERGE子句确保图中存在模式。或 模式已经存在,或者需要创建。
尝试将您的查询更改为:
MERGE (n:BlogPost {mongoId:{idNeo}}) MERGE (b:Admin {mongoAdminId:{idNeoAd}})