graph - Neo4j - 主节点和写锁

标签 graph neo4j

当前的 Neo4J 文档指出,要创建关系,两个节点都被锁定。

现在考虑一个节点为主节点,并且正在创建的所有其他节点都与其相关。例如,所有新的“Animal”节点都需要与主“Zoo”节点相关。

那么,当创建大量与现有“Zoo”节点相关的新“Animal”节点时,所有 Cypher 请求不是都会排队等待锁吗?因为每个请求都需要锁定“Zoo”节点。

当以这种方式在图表上创建大量数据时,我观察到速度变慢。

有没有办法告诉 Neo4J 为 Cypher CREATE 请求锁定节点?可以启用某种并行写入吗?

更新:

测试结果:

Create Zoo nodes: time taken (ms): 2222
Create Animal nodes for separate Zoos: time taken (ms): 2206
Create Animal nodes for same Zoo: time taken (ms): 9015

仅 200 个同时查询就有约 7 秒的差异。

测试脚本(使用NodeJS驱动程序,neo4j版本2.2.4,ubuntu linux):

  • NodeJS Driver
  • Neo4j version 2.2.4, community edition
  • Ubuntu Linux
var seraph = require('seraph');
var moment = require('moment');
var async = require('async');
var neo4j = seraph({
    "url": "http://localhost:7474",
    "user": "neo4j",
    "pass": "neo4j"
});

var num = 200;

async.series([
    function (cb) {
        // clean
        neo4j.query('MATCH (n:Zoo)-[r:HAS]->(a:Animal) DELETE n,r,a', cb);
    },

    function (cb) {
        // clean
        neo4j.query('MATCH (n:Zoo) DELETE n', cb);
    },

    function (cb) {
        // we create Zoo nodes, each with a num property
        var start = moment();
        var count = 0;
        var abort = false;
        for (var i = 0; i < num; i++) {
            neo4j.query('CREATE (n:Zoo {obj})', { obj: { num: i } }, function (err, nodes) {
                if (err) {
                    cb(err);
                    abort = true;
                } else {
                    count++;
                    if (count >= num && !abort) {
                        console.log('Create Zoo nodes: time taken (ms): ' + moment().diff(start));
                        cb();
                    }
                }

            });
        }
    },

    function (cb) {
        // we create (Zoo)-[HAS]->(Animal) nodes, each Animal node related with a SEPARATE Zoo node
        var start = moment();
        var count = 0;
        var abort = false;
        for (var i = 0; i < num; i++) {
            neo4j.query('MATCH (n:Zoo) WHERE n.num = {num} CREATE (n)-[r:HAS]->(a:Animal) RETURN a LIMIT 1', { num: i }, function (err, nodes) {
                if (err) {
                    cb(err);
                    abort = true;
                } else {
                    count++;
                    if (count >= num && !abort) {
                        console.log('Create Animal nodes for separate Zoos: time taken (ms): ' + moment().diff(start));
                        cb();
                    }
                }

            });
        }
    },


    function (cb) {
        // we create (Zoo)-[HAS]->(Animal) nodes, each Animal node related with SAME Zoo node
        var start = moment();
        var count = 0;
        var abort = false;
        for (var i = 0; i < num; i++) {
            neo4j.query('MATCH (n:Zoo) WHERE n.num = 0 CREATE (n)-[r:HAS]->(a:Animal) RETURN a LIMIT 1', function (err, nodes) {
                if (err) {
                    cb(err);
                    abort = true;
                } else {
                    count++;
                    if (count >= num && !abort) {
                        console.log('Create Animal nodes for same Zoo: time taken (ms): ' + moment().diff(start));
                        cb();
                    }
                }

            });
        }
    }
], function (err) {
    if (err) {
        console.error(err);
    }

    process.exit(0);
});

最佳答案

正如问题 Is it possible to override Neo4j lock behavior for relationships? 中提到的那样:

It's not possible to override the locking behaviour. Neo4j used to support multiple isolation levels, so it might be that the word "default" is from that time and that the page needs an update.

但是你仍然可以使用 cypher Foreach 获得更好的性能如果您需要创建与一个节点的 N 个关系,请使用以下语句。另外,升级到 Neo4j 2.3 应该对您有好处,因为升级应该如此(不要忘记设置 allow_store_upgrade=true)

关于graph - Neo4j - 主节点和写锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33630729/

相关文章:

在 R 中读取 Gephi 图

python - mplfinance 是否有对数刻度设置?

c# - 线段的多边形

python - 使用 Bulbs/python 和 Neo4j 2.0 的错误消息

c - C 程序中的段错误追溯到 malloc 调用,无法弄清楚原因

c# - 如何将更新传播到 Colectica DDI 项目图表中的所有项目?

如果节点存在,Neo4j 添加/更新属性

neo4j - 在 Neo4j 中转换 EPOCH 日期

mysql - 如何通过 sql 连接而不是 csv 在 neo4j 中导入数据?

neo4j - 当我展开空数组时,父项不会合并。我如何让这个查询工作?