繁体   English   中英

Neo4j:通过CYPHER / REST创建节点很慢

[英]Neo4j: Create nodes via CYPHER/REST slow

我尝试通过带有Cypher的MERGE -statement的REST API创建/更新节点。 每个节点的属性均为ca。 1kb(所有大小的总和)。 我为每个请求创建/更新1个节点。 (我知道还有其他方法可以批量创建许多节点,但这不是这里的问题。)

我在Windows Server 2008 R2 Enterprise(24个CPU,64GB)上使用Neo4j社区2.1.6,数据库目录位于SAN驱动器上。 我得到每秒4-6个节点的速率。 换句话说,一次创建或更新大约需要200毫秒。 这对我来说似乎很慢。

查询如下所示:

MERGE (a:TYP1 { name: {name}, version: {version} }) 
SET 
    a.ATTR1={param1},
    a.ATTR2={param2},
    a.ATTR3={param3},
    a.ATTR4={param4},
    a.ATTR5={param5} 
return id(a)

在名称,版本和两个属性上都有一个索引。

为什么要花这么长时间? 我该如何改善这种情况?

我可以想象一个问题是每个请求都必须创建一个新的连接吗? 有没有一种方法可以使多个请求的http连接保持打开状态?

对于一个查询,我非常确定每个标签每个查询只能使用一个索引,因此根据您的数据,它们使用索引的效率可能不高。

就持久连接而言,这是可能的,尽管我认为这取决于您用于连接到REST API的库。 在ruby neo4j宝石中,我们使用具有NetHttpPersistent适配器的Faraday宝石。

  1. 仅当将ONE属性与MERGE一起使用时才使用索引
  2. 如果您需要同时合并两者,请创建一个复合属性,对其进行索引(或更好地使用约束),然后在该复合属性上进行合并
  3. 使用ON CREATE SET,否则即使您实际上并未创建节点,也每次都(过度)写入属性。

改编的陈述

MERGE (a:TYP1 { name_version: {name_version} }) 
ON CREATE SET 
    a.version = {version}
    a.name = {name}  
    a.ATTR1={param1},
    a.ATTR2={param2},
    a.ATTR3={param3},
    a.ATTR4={param4},
    a.ATTR5={param5} 
return id(a)

这是一个示例,说明如何在与Neo4j的一次通信中从nodejs执行一批密码查询。 要运行它

先决条件:

var request=require("request") ;
var graph = require('fbgraph');
graph.setAccessToken(process.argv[2]);

function now() {
    instant = new Date();
    return instant.getHours() 
        +':'+ instant.getMinutes() 
        +':'+ instant.getSeconds()  
        +'.'+ instant.getMilliseconds();
} 

获取facebook数据:

graph.get('me?fields=groups,friends', function(err,res) {
    if (err) {
        console.log(err);
        throw now() +' Could not get groups from faceBook';
    }

创建密码语句

    var batchCypher = [];
    res.groups.data.forEach(function(group) {
        var singleCypher = {
            "statement" : "CREATE (n:group{group}) RETURN n, id(n)",
            "parameters" : { "group" : group }
        }
        batchCypher.push(singleCypher);

一一运行

        var fromNow = now();
        request.post({
            uri:"http://localhost:7474/db/data/transaction/commit", 
            json:{statements:singleCypher}
        }, function(err,res) { 
            if (err) {
                console.log('Could not commit '+ group.name);
                throw err;
            }
            console.log('Used '+ fromNow +' - '+ now() +' to commit '+ group.name);
            res.body.results.forEach(function(cypherRes) {
                console.log(cypherRes.data[0].row);
            });
        })
    });

批量运行

    var fromNow = now();
    request.post({
        uri:"http://localhost:7474/db/data/transaction/commit", 
        json:{statements:batchCypher}
    }, function(err,res) { 
        if (err) {
            console.log('Could not commit the batch');
            throw err;
        }
        console.log('Used '+ fromNow +' - '+ now() +' to commit the batch');
    }) 
});

日志显示5组的事务处理明显慢于1组的事务处理,但明显快于1组的5个事务处理。

Used 20:38:16.19 - 20:38:16.77 to commit Voiture occasion Belgique
Used 20:38:16.29 - 20:38:16.82 to commit  Marches & Randonnées
Used 20:38:16.31 - 20:38:16.86 to commit Vlazarus
Used 20:38:16.34 - 20:38:16.87 to commit Wijk voor de fiets
Used 20:38:16.33 - 20:38:16.91 to commit Niet de bestemming maar de route maakt de tocht goed.
Used 20:38:16.35 - 20:38:16.150 to commit the batch

我刚刚读了您的评论,安德里亚斯(Andreas),是否对您不适用,但是您可以使用它来查找是在交流还是在更新上花费了时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM