【问题标题】:Neo4j transaction with array of queries with js-neo4j-driver带有 js-neo4j-driver 查询数组的 Neo4j 事务
【发布时间】:2021-10-09 19:12:44
【问题描述】:

我想将 n 个密码查询传递给 neo4j 事务,我正在考虑一个好方法。

目前,我有一种采用数组项的工作方法,或者如果它不可用,则使用虚拟查询。 (代码如下)

我认为这不是最佳做法。有谁知道或知道如何更好地做到这一点?

    function Neo4jTransaction(QueryArray) {
        const session = driverWrite.session();
        const tx = session.beginTransaction();
        tx.run(QueryArray[0] || "RETURN 0")
        tx.run(QueryArray[1] || "RETURN 0")
        tx.run(QueryArray[2] || "RETURN 0")
        tx.run(QueryArray[3] || "RETURN 0")
        .then(result => {
            return tx.commit()
        }).then(() => {
            session.close()
            driverWrite.close()
        }).catch(exception => {
            console.log(exception)
            session.close()
            driverWrite.close()
        })
    }

【问题讨论】:

    标签: neo4j cypher neo4j-driver


    【解决方案1】:

    首先,如果你有一个数组,你可能想要遍历它。其次,tx.run() 返回一个 Promise,如果它失败了,你需要捕获它。在您的代码中,它连续调用 4 次,但只有最后一个等待结果并捕获错误。我好像少了几行代码。

    neo4j-driver 文档为显式事务提供了一个很好的示例:https://github.com/neo4j/neo4j-javascript-driver#explicit-transactions

    查询按顺序执行。如果一个失败,整个事务将被回滚。

    async function neo4jTransaction(queryArray) {
    
      const session = driver.session();
    
      const txc = session.beginTransaction();
    
      try {
    
        for (const query of queryArray) {
          await txc.run(query || 'RETURN 0');
        }
    
        await txc.commit();
    
      } catch (e) {
    
        await txc.rollback();
        return Promise.reject(e);
    
      } finally {
    
        await session.close();
    
      }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多