我需要通过cypher&lt中的node.js创建很多节点(例如50.000)。3.0.0。我正在使用异步时间来发布所有Cypher查询。但是,似乎REST API正在抑制(并死亡),因为可能会有太多请求。我想继续使用节点而不是使用LOAD CSV。我的代码如下:
var createStyles = function (data, cb)
{
var distinctData = ...;
console.log("creating styles");
...
var create = function (id, callback)
{
console.log("creating st " + id);
var req = ...
styles.addOrUpdate(req, null,
function (err, node)
{
callback(null, node);
});
}
// call the same function multiple times with a different index
async.times(distinctData.length - 1, function (n, next)
{
create(n, function (err, st)
{
next(err, st)
})
}, function (err, result)
{
console.log("styles created");
createdStyles = result;
cb(null, result);
});
};
addorupdate函数看起来像这样:
exports.addOrUpdate = function (req, res, cb)
{
if (req.body.styleName === undefined) req.body.styleName = "N/A";
if (req.body.description === undefined) req.body.description = "";
if (req.body.price === undefined) req.body.price = 0;
var styleName = req.body.styleName.replace(/\/g,"\\").replace(/'/g, "\'");
var styleNum = req.body.styleNum.toString().replace(/'/g, "").replace(/\/g,"");
var desc = req.body.description.replace(/'/g, "").replace(/\/g,"");
var dts = dateHelper.getDTS();
var styleID = uuid.v4();
if (req.body.styleID !== undefined && req.body.styleID != "") styleID = req.body.styleID;
var query = "" +
" MATCH (c:Customer {customerID: '" + req.body.customerID + "'}) " +
" MATCH (c)<-[r:DEPT_OF]-(dept:Dept {deptID: '" + req.body.departmentID + "'}) " +
" MATCH (dept)<-[r1:IN_DEPT]-(pt:ProductType {productTypeID: '" + req.body.productTypeID + "'}) " +
" MERGE (st:Style {styleNum: '" + styleNum + "'}) " +
" ON MATCH " +
" SET " +
" st.styleNum = '" + styleNum + "', " +
" st.name = '" + styleName + "', " +
" st.desc = '" + desc + "', " +
" st.price = " + req.body.price + ", " +
" st.modifiedDTS = " + dts +
" ON CREATE " +
" SET " +
" st.styleID = '" + styleID + "', " +
" st.styleNum = '" + styleNum + "', " +
" st.name = '" + styleName + "', " +
" st.desc = '" + desc + "', " +
" st.price = " + req.body.price + ", " +
" st.modifiedDTS = " + dts + ", " +
" st.createdDTS = " + dts + " " +
" WITH pt, st " +
" MERGE (pt)<-[r2:OF_TYPE]-(st) " +
" return st;";
console.log(query);
db.cypherQuery(query, function (err, node)
{
if (err)
{
return cb(err, node);
}
else
{
cb(err, node.data[0]);
}
});
};
我可以做些什么来完成这项工作而不窒息neo4j?
- 使用参数
- 使用async.Series
- 为什么在比赛集上进行?
- 请确保您已经有所有索引/约束(例如,客户{customerId})
- neo4j&lt;3.0使用规则规划师进行更新,该更新可能在复杂的更新查询上不太执行的更新,
因此,您可以将您的查询分为进行匹配的查询,然后返回:pt
的ID,然后将其传递到更新查询中,该查询是合并的,以及产品类型的BY-ID查找
- 使用配置文件/在您的查询中解释,以查看它们实际上是否表现良好,同时同时负载
- 考虑批次查询,例如一项交易中的10k至100k更新