【问题标题】:Neo4j query with nodejs使用 nodejs 进行 Neo4j 查询
【发布时间】:2018-08-17 14:39:30
【问题描述】:

我有一个包含 1000 个密码 (neo4j) 查询的数组(以字符串形式)。

当我在会话中通过这个数组循环(for 循环,单个值)时,所有查询都按顺序进行。 虽然我也收到了 1000 个结果,但是顺序的结果发生了变化。

我怎样才能同步它们,以便我按顺序获得结果,作为数组中的查询?

..................................................

例如 a =[t1,t2,t3,t4...]

cypher 的结果可以是任何顺序,比如 t2,t1,t4,t3

我希望以相同的 t1、t2、t3、t4 方式得到结果

有什么建议吗?

【问题讨论】:

    标签: node.js neo4j cypher


    【解决方案1】:

    你可以使用Promise.all函数,因为returned values will be in order of the Promises passed

    var cyphers = [
        `MATCH (a) RETURN count(a) AS nodesCount`,
        `MATCH ()-[r]->() RETURN count(r) AS relsCount`
    ]
    
    var session = driver.session()
    
    var queries = []
    cyphers.forEach(function(cypher) {
        queries.push(session.run(cypher))
    })
    
    Promise.all(queries).then(function(results) {
        results.forEach(function (result) {
            console.log(result)
        })
        session.close()
        driver.close()
    })
    

    【讨论】:

    • 谢谢...顺便说一句,通过在代码中应用其他密码查询停止工作...所以在这种情况下删除 driver.close
    【解决方案2】:

    您是否尝试存储数据并且所有密码是否使用相同的属性和道具执行相同的操作? 如果是,那你为什么不使用展开功能,这项工作将在一个密码中完成,也只在一次调用中完成。返回数据将按您想要的顺序排列。即使有不同类型的密码,将它们分组并使用展开,这会导致更少的会话(几乎 1)以及连接数量,从而导致性能提高,与执行一个密码相比,产生的时间也更少一次。

    请转至this post,它肯定会对您有所帮助。

    如果你不存储数据,那么你可以使用node.js的promises概念,也可以创建如下编码结构:

    let cypher_array=[{cypher:'you cypher',param:'param'}]
    let counter = 0;
    function execute_cypher(counter) {
        if (counter < cypher_array.length) {
            session
            .run(cypher_array[counter].cypher, cypher_array[counter].param)
            .then(function (result) {
                //you logic here
    
    
                counter++;
                if(counter < cypher_array.length){
                    execute_cypher(counter)
                }
            })
            .catch(function (error) {
                if(counter < cypher_array.length){
                    execute_cypher(counter)
                }
                //comment the above code if you do not want to continue when error is occurred
            })
        }else{
            console.log('completed!');
            session.close();
            driver.close();
        }
    }
    
    execute_cypher(0)
    

    注意:我不鼓励使用上面的代码,因为我知道它的缺点。这仅用于示例目的。正如@stdob-- 展示了如何使用 Promise 来做到这一点,我只是举了一个例子,用不同的方式来做这件事,当我刚接触 node.js 和 neo4j 时,我会用这种方式来做这件事。 现在根据我的经验我建议使用 Neo4j: Cypher - UNWIND 作为它的最佳实践

    【讨论】:

      猜你喜欢
      • 2013-08-07
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 2018-01-27
      • 1970-01-01
      • 2020-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多