如何在Neo4J REST API上正确创建数千个Cypher节点



我需要通过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?

  1. 使用参数
  2. 使用async.Series
  3. 为什么在比赛集上进行?
  4. 请确保您已经有所有索引/约束(例如,客户{customerId})
  5. neo4j&lt;3.0使用规则规划师进行更新,该更新可能在复杂的更新查询上不太执行的更新,

因此,您可以将您的查询分为进行匹配的查询,然后返回:pt的ID,然后将其传递到更新查询中,该查询是合并的,以及产品类型的BY-ID查找

>
  1. 使用配置文件/在您的查询中解释,以查看它们实际上是否表现良好,同时同时负载
  2. 考虑批次查询,例如一项交易中的10k至100k更新

最新更新